Apartamento En Familia

Apartamento En Familia
Apartamento de playa para vacaciones. https://www.booking.com/hotel/es/apartamento-en-familia.ca.html Número registro HUTT-005768

miércoles, 26 de febrero de 2014

vsftpd con usuarios virtuales enjaulados validados en MySQL

En un artículo anterior explique como instalar un vsftpd y crear usuarios enjaulados. Para validar a los usuarios, usábamos una base de datos Berkeley pero ya avisaba de lo engorroso a la hora de añadir o borrar usuarios. Para ello podemos validar a nuestros usuarios en una base de datos mysql. En este artículo no enseñaré a instalar una base de datos MySQL (esta bien documentado en la red):

Instalamos el plugin mysql para pam:


apt-get install libpam-mysql


Luego creamos la base de datos, un usuario de consulta y la tabla que contendrá los usuarios y las contraseñas:

$ mysql -u root -p

CREATE DATABASE vsftpd;
GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'tupasssecreto';
FLUSH PRIVILEGES;

USE vsftpd;

CREATE TABLE `accounts` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR( 30 ) NOT NULL , `pass` VARCHAR( 50 ) NOT NULL , UNIQUE (`username`) ) ENGINE = MYISAM ;


Para finalizar modificaremos el /etc/pam.d/vsftpd para que se valide con MySQL:

cat /etc/pam.d/vsftpd
session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd passwd=tupasssecreto host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
account required pam_mysql.so user=vsftpd passwd=
tupasssecreto host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3

Para crear nuevos usuarios bastará con entrar en el MySQL y poner:

INSERT INTO accounts (username, pass) VALUES('usuario', md5('passecreto'));


Y no olvidarse de crear la carpeta de usuario y darle los permisos adecuados.

martes, 25 de febrero de 2014

Instalar vsftpd y usuarios virtuales (Berkeley) y enjaulado en Ubuntu 12.04.04 (chroot virtual user in vsftpd)


vsftpd, son las siglas de  "Very Secure FTP Daemon".Es un servidor FTP para sistemas GNU/Linux o Unix. Esta licenciado bajo GNU General Public License. soporta IPv6 y SSL.
vsftpd soporta de manera explícita (desde la 2.0.0) y implícita (desde 2.1.0) FTPS.
vsftpd es el servidor FTP por defecto de las distribuciones Ubuntu, CentOS, Fedora, NimbleX, Slackware y RHEL Linux.

Instalación

apt-get install vsftpd libdb4.7 libdb4.7-dev db4.7-util

Configuración

Para editar la configuración del vsftpd es tan facil como editar las preferencias que queremos en el archivo /etc/vsftpd.conf . Habitualmente nos fijaremos en estas opciones:

cat vsftpd.conf
listen=YES
anonymous_enable=NO
guest_enable=YES
guest_username=ftp

local_enable=YES
write_enable=YES
user_config_dir=/etc/vsftpd/users
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
connect_from_port_20=YES
local_umask=022
ftpd_banner=Welcome to a very very secret service.

chroot_list_enable=YES

chown_uploads=YES
chown_username=ftp
virtual_use_local_privs=YES
secure_chroot_dir=/var/run/vsftpd/empty
user_sub_token=$USER
local_root=/vsftpd/$USER
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem



Lo que hace cada opción se ve muy bien explicado en los comentarios del propio archivo.Os aconsejo hacer un 'man vsftpd.conf'

Como lo que queremos son usuarios virtuales, y no usuarios del sistema, lo que haremos es crear una base de datos con usuarios-contraseñas y le diremos al vsftpd que use dicha base de datos. Podemos usar MySQL o Berkeley.db. En muchos casos Berkeley nos será suficiente aunque usar MySQL és más versátil a la hora de añadir y borrar usuarios facilmente. Para este tutorial usaremos Berkeley. Primero creamos un txt con el formato siguiente:

cat usuarios-ftp.txt
eddy
momami
paco
potroski

En donde los usuarios son eddy (con contraseña momami) y paco  (con contraseña potroski).

Ahora creamos la base de datos Berkeley:

db4.7_load -T -t hash -f usuarios-ftp.txt /etc/vsftpd_login.db

luego le damos los permisos adecuados a /etc/vsftpd_login.db:

chmod 600 /etc/vsftpd_login.db

El archivo de usuarios-ftp.txt lo podemos borrar o hacer una copia de seguridad por si tuviéramos que añadir nuevos usuarios. También circula por internet un script que automatiza el gestionar usuarios de una base de datos Berkeley.
Ahora tendremos que hacer que el sistema de autenticación PAM lea para vsftpd de nuestra base de datos:

cat /etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login crypt=hash
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login crypt=hash


Con esto ya tendremos a nuestros usuarios virtuales creados y validados. Como hemos puesto la directiva local_root=/vsftpd/$USER del /etc/vsftpd.conf, una vez validado el usuario irá a mirar ese directorio (en donde $USER es una variable que contiene el nombre de usuario). Así pues, debe existir y con privilegios para el usuario ftp, tal como hemos indicado en la directiva guest_username=ftp :

mkdir -p /vsftpd/{eddy,paco}
chown -R ftp:ftp /vsftpd

Ahora ya tenemos usuarios validados y con carpeta personal. Lo que nos interesa ahora es enjaularlos en dicha carpeta para que no puedan salir. Esto lo hacemos con la directiva del /etc/vsftpd.conf siguiente:

chroot_list_enable=YES

Con esta directiva lo que hacemos es enjaular a todos los usuarios que esten en la lista /etc/vsftpd.chroot_list . Así pues en nuestra intencion de que los usuarios virtuales eddy y paco entren en nuestro ftp, demanera enjaulada pondremos lo siguiente en ese archivo:
 
cat /etc/vsftpd.chroot_list
eddy
paco



Y con esto daríamos por finalizada la configuración de nuestro vsftpd con usuarios virtuales y enjaulados.







miércoles, 19 de febrero de 2014

Bloquear usuario en Dovecot y Samba validando contra LDAP mediante sambaAcctFlags


En algunos escenarios en donde tenemos la validación de usuarios centralizada mediante un directorio LDAP (como por ejemplo OpenLDAP), es posible que cuando queramos bloquear a un usuario queramos que tenga efecto en varios servicios.

En este artículo no trataré de explicar que es Samba ni como se instala un servidor IMAP como Dovecot. Tampoco como hacer que los usuarios validen contra el LDAP. Lo que busco es explicar como una vez esto funcione, que algunos usuarios estén bloqueados.

Imaginemos que tenemos un usuario que se valida en LDAP y que tiene acceso al correo electrónico mediante Dovecot y acceso a un almacén de discos mediante Samba.

Samba

(ver Artículo anterior relacionado con Samba)
Si tenemos Samba instalado nos hará falta el smbldap-tools para que interactue con el directorio ldap:

apt-get install smbldap-tools

Si por ejemplo queremos que no entre en un recurso samba y tenemos en nuestro directorio LDAP el samba3.schema, marcaremos el sambaAcctFlags con una D, es decir, desactivaremos la cuenta:

FlagDescription
DAccount is disabled.
HA home directory is required.
IAn inter-domain trust account.
LAccount has been auto-locked.
MAn MNS (Microsoft network service) logon account.
NPassword not required.
SA server trust account.
TTemporary duplicate account entry.
UA normal user account.
WA workstation trust account.
XPassword does not expire.
(Fuente samba.org)

De esta manera al intentar entrar en el samba no le dejará. 

Dovecot

En dovecot lo podemos hacer mediante el parámetro user_filter del archivo /etc/dovecot/dovecot-ldap.conf . Por ejemplo:

user_filter = (&(objectClass=posixAccount)(uid=%u)(!(|(sambaAcctFlags=[UD])(sambaAcctFlags=[DU]))))

Lo que hace este filtro es validar el uid del usuario y mirar que NO tenga el la bandera [UD] o [DU]. Muchas veces nos encontraremos el atributo sambaAcctFlags con 11 carácteres (casi todos ellos con espacios vacíos). Así que tendremos que tenerlo en cuenta en nuestras búsquedas.

viernes, 14 de febrero de 2014

Instalar Dovecot+LDAP en Ubuntu

Dovecot es un servidor de IMAP y POP3 de código abierto para sistemas GNU/Linux / UNIX-like, escrito fundamentalmente pensando en la seguridad. Desarrollado por Timo Sirainen, Dovecot fue publicado por primera vez en julio del año 2002. Dovecot apunta fundamentalmente a ser un servidor de correo de código abierto ligero, rápido, fácil de instalar y sobre todo seguro.
(Fuente Wikipedia)



Para instalarlo no tiene más misterio que hacerlo mediante el repositorio oficial de Ubuntu. 

sudo apt-get install dovecot-imapd

Configurarlo es básicamente darle un vistazo al archivo /etc/dovecot/dovecot.conf y rellenarlo según nuestras preferencias. Configuración a destacar:

Uso de SSL


ssl = required
ssl_ca =
ssl_cert = ssl_key =

Uso de LDAP


userdb {
  args = /etc/dovecot/dovecot-ldap.conf
  driver = ldap
}

passdb {
  args = /etc/dovecot/dovecot-ldap.conf
  driver = ldap
}


Ahora editamos el archivo /etc/dovecot/dovecot-ldap.conf con la configuración de nuestro LDAP:
hosts = openldap.servidor.es
debug_level = -1
auth_bind = yes
auth_bind_userdn = uid=%u,ou=People,dc=cttc,dc=es
ldap_version = 3
base = uid=%u, ou=People, dc=cttc , dc=es
scope = subtree


Podemos comprobar la configuración mediante doveconf -a

Habría que configurarlo con la base y userdn particular de cada uno. Con ello ya nos debería funcionar correctamente.





viernes, 31 de enero de 2014

Redmine 2.3.x en Ubuntu 13.10 mediante Apache


En artículos anteriores expliqué como instalar un Redmine e intregrarlo con Apache:

Integrar Redmine con Apache en Ubuntu (21 de Abril 2010)

En esta ocasión, además de explicarlo con las nuevas versiones vamos a intentar no crear un virtualhost, sino usarlo mediante Location de Apache y Alias. Mi objetivo sera que al poner http://mi_servidor/redmine/redmine1 se pueda ver el redmine instalado. Si quisiera luego instalar otro redmine en el mismo servidor buscaría hacer http://mi_servidor/redmine/redmine2 , etc. Así que cada uno siga un poco su objetivo final a la hora de hacer los alias, etc.

Primero instalamos los paquetes necesarios:
apt-get install ruby rubygems libruby libapache2-mod-passenger ruby-dev libmysqlclient-dev libmagickcore-dev libmagickwand-dev git git-core

Luego nos descargamos redmine y lo movemos a la carpeta que nos interese:
cd /tmp
wget rubyforge.org/frs/download.php/76933/redmine-2.3.1.tar.gz
tar -xzvf redmine-2.3.1.tar.gz

mkdir /var/www/redmine/
mv redmine-2.3.1 /var/www/redmine/redmine1

chown www-data:www-data /var/www/redmine/redmine1

gem install bundler
gem install rdp-mysql2

Y ahora ya podemos instalar nuestro redmine:
cd /var/www/redmine/redmine1
bundle install --without development test postgresql sqlite


Preparamos la base de datos:
mysql -u root -p

CREATE DATABASE redmine1 CHARACTER SET utf8; 
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON redmine1.* TO 'redmine'@'localhost';


Configuramos el redmine para la base de datos que hemos creado:
cd /var/www/redmine/redmine1/config/
cp -a database.yml.example database.yml

Luego editamos database.yml y lo dejamos así (modificando con los datos particulares de cada uno):
production:
  adapter: mysql2
  database: redmine1
  host: localhost
  username: redmine
  password: "my_password"
  encoding: utf8


rake generate_secret_token
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data

Ahora ya tenemos todo el entorno redmine instalado y configurado. Ahora tenemos que hacer que nuestro servidor Apache de servicio para acceder a él:

Creamos un site (redmine1.conf por ejemplo) y ponemos esta información:
Alias /redmine/redmine1 /var/www/redmine/redmine1/public/
PassengerAppRoot /var/www/redmine/redmine1
AllowOverride all              
RailsEnv production
RailsBaseURI /redmine/redmine1
Allow from all
Order allow,deny
Options -MultiViews

Luego activamos el site:
a2ensite redmine1.conf

Ahora preparamos la carpeta en donde Apache irá a mirar para motrar la información:
cd /var/www/redmine/redmine1/public/
mv dispatch.fcgi.example dispatch.fcgi

y finalmente editamos/modificamos el archivo .htaccess para tener en cuenta los Alias necesarios. Fijaros en el ejemplo del propio .htaccess:


# Example:
#   Alias /myrailsapp /path/to/myrailsapp/public
#   RewriteBase /myrailsapp



Ahora ya podemos reiniciar nuestro apache y acceder a nuestro redmine poniendo http://mi_servidor/redmine/redmine1



martes, 24 de diciembre de 2013

Recuperación de partición tras mklabel de parted mediante rescue


GNU Parted (el nombre viene de la conjunción de las dos palabras inglesas partition y editor) es un editor de particioneslibre que se utiliza para crear y destruir particiones. Esto es útil para crear espacio para nuevos sistemas operativos, reorganizar el espacio del disco duro, copiar data entre discos duros y crear imágenes de disco. Fue desarrollado porAndrew Clausen y Lennert Buytenhek.

Está formado por una bibliotecalibparted, y en un front-end para la línea de comandosparted, que también sirve como implementación de referencia.
En 2013, GNU Parted solo está disponible para Linux y GNU Hurd.1


(Fuente Wikipedia)

En un artículo anterior explicaba como crear particiones de más de 2TB mediante parted.

Bien, imaginemos que por alguna razón nuestra tabla de particiones cambia (a causa de un mal apagado del servidor, se fué la luz, etc) y que ya no podemos acceder a dicha partición. Esto me pasó a mi tras apagar el servidor 'por la via del botonazo'. La partición sdb1 no era accesible y cuando miraba con el programa parted veía que la tabla de particiones habia cambiado de gpt a loop. Pues bien, pensé en usar el comando mklabel para volverle a cambiar la tabla de particiones a gpt, pero me daba el siguiente aviso: "La etiqueta de disco existente en /dev/sdb se destruirá y todos los datos en este disco se perderán. ¿Desea continuar?" Pues no, no quiero destruir mis datos. Pero.. ¿Que puedo hacer?. Si nos leemos el manual de parted en el apartado de mklabel nos dice que técnicamente no destruye los datos y que estos podrán ser recuperados mediante el comando rescue. Así pues, eso hice:

parted /dev/sdb

GNU Parted 2.3
Usando /dev/sdb
¡Bienvenido/a a GNU Parted! Teclee «help» para ver la lista de órdenes.
(parted) unit GB                                                          
(parted) print                                                            
Modelo: ATA ST4000VN000-1H41 (scsi)
Disco /dev/sdb: 4001GB
Tamaño de sector (lógico/físico): 512B/4096B
Tabla de particiones. loop

Numero  Inicio  Fin     Tamaño  Sistema de archivos  Banderas
 1      0,00GB  4001GB  4001GB  btrfs

(parted) mklabel gpt                                                      
Aviso: La etiqueta de disco existente en /dev/sdb se destruirá y todos los datos en este disco se perderán. ¿Desea continuar?
Sí/Yes/No? s                                                              
(parted) print                                                            
Modelo: ATA ST4000VN000-1H41 (scsi)
Disco /dev/sdb: 4001GB
Tamaño de sector (lógico/físico): 512B/4096B
Tabla de particiones. gpt

Numero  Inicio  Fin  Tamaño  Sistema de archivos  Nombre  Banderas

(parted) rescue                                                           
¿Inicio? 0                                                                
¿Fin? 4001                                                                
Información: Ha sido encontrada una partición btrfs primary en 0,00GB -> 4001GB.  ¿Quiere añadirla a la tabla de particiones?
Sí/Yes/No/Cancelar/Cancel? S                                              
(parted) print                                                            
Modelo: ATA ST4000VN000-1H41 (scsi)
Disco /dev/sdb: 4001GB
Tamaño de sector (lógico/físico): 512B/4096B
Tabla de particiones. gpt

Numero  Inicio  Fin     Tamaño  Sistema de archivos  Nombre  Banderas
 1      0,00GB  4001GB  4001GB  btrfs


¡Y funcionó! Además, al recuperar la partición, conservamos intacto el UUID de dicha partición. 

lunes, 18 de noviembre de 2013

Instalar ModSecurity2 (+OWASP) y Mod-Evasive en Ubuntu 13.10 con Apache


modSecurity™ es un firewall de aplicaciones Web embebible que ejecuta como módulo del servidor web Apache, provee protección contra diversos ataques hacia aplicaciones Web y permite monitorizar tráfico HTTP, así como realizar análisis en tiempo real sin necesidad de hacer cambios a la infraestructura existente.
(Fuente Wikipedia)


Mod_Evasive ayudará a detener los ataques básicos en un servidor (HTTP, ataques de denegación DDoS y ataques de fuerza bruta). La detección es realizada por la creación una tabla dinámica interna hash de las direcciones IP y URI, y denegando cualquier dirección IP por las siguientes causas:

-Solicitando las mismas páginas web muchas veces por segundo.
-Solicitando más de 50 conexiones simultaneas sobre el mismo objeto por segundo.
-Realizando solicitudes con listas negras temporales (sobre listas de bloqueo).

(Fuente Internexo)

Así pues, nuestra idea es instalar un servidor web Apache con un módulo que nos haga de cortafuegos de aplicaciones Web y con otro módulo que nos ayuden a detener los ataques básicos que recibimos en un servidor web. Además, tenedremos reglas generadas para programas comunes como:
  • Microsoft IIS, ASP, .Net and SharePoint
  • WordPress
  • cPanel
  • osCommerce
  • Joomla
Con estos sencillos pasos podremos tener un servidor web bastante más protegido que si simplemente instalamos nuestro servidor y lo dejamos desprotegido cara a Internet. Es hora de armar a nuestro Apache:

modsecurity

Instalamos modsecurity desde el repositorio de Ubuntu oficial:

apt-get install libapache-mod-security
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
  libapache2-modsecurity liblua5.1-0 modsecurity-crs
Paquetes sugeridos:
  lua geoip-database-contrib ruby
Se instalarán los siguientes paquetes NUEVOS:
  libapache-mod-security libapache2-modsecurity liblua5.1-0 modsecurity-crs
0 actualizados, 4 se instalarán, 0 para eliminar y 7 no actualizados.
Necesito descargar 664 kB de archivos.
Se utilizarán 3.741 kB de espacio de disco adicional después de esta operación.


En otras webs veréis que antes de instalar modsecurity se instalan unas dependencias. Eso tiene sentido si nos descargamos las fuentes de modsecurity y luego las queremos compilar. Nosotros lo estamos haciendo directamente desde el repositorio, así que si hay alguna dependencia ya nos lo dice el propio apt-get.

Ahora ya tenemos instalado el modsecurity. Nos queda configurarlo para que funcione como nosotros deseamos. Lo primero es crear el archivo de configuración basándonos en el que ya viene de ejemplo:

sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Ahora tocará configurar el modsecurity como nosotros deseemos. Cada cual en su servidor sabe que puede o no hacer. O que se espera que pase y que no pase. Si por ejemplo nuestro servidor es un wordpress o Joomla! en donde permitimos subir archivos, seguramente nos va a interesar cambiar la directriz de modsecurity de esta manera:

SecRequestBodyLimit 16384000
SecRequestBodyInMemoryLimit 16384000

De esta manera cambiamos el límite de tamaño de archivos que subimos a nuestro servidor de 128Kb a 16Mb . Pero esto sólo si es lo que deseamos que haga. Si es una web que no espera que se suban archivos, lo mejor seria dejarlo como está. 

Sea como sea, lo que seguro que tendremos que hacer es activar el motor modsecurity. Para ello modificaremos el modsecurity.conf :


SecRuleEngine On


Una vez configurado como deseamos el modsecurity, lo siguiente es bajarnos las reglas de OWASP Core Rule Set

OWASP Core Rule Set


OWASP Core Rule Set nos va a mejorar el conjunto de reglas de nuestro modsecurity de manera que se convierte en el compañero ideal en este viaje de seguridad que estamos haciendo. 

Esto si que no lo podemos instalar desde repositorio, y aunque pudiéramos en esta ocasión si que creo que vale la pena bajarse la última versión. Es el corazón de reglas que hara que estemos seguros. Lo bajamos y lo descomprimimos:

wget -O SpiderLabs-owasp-modsecurity-crs.tar.gz https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master

tar -zxvf SpiderLabs-owasp-modsecurity-crs.tar.gz

Bien, ahora ya tenemos el conjunto de reglas que copiaremos en la carpeta de configuración de modsecurity (todos los .conf copiados allí se consideran archivos de configuración del programa modsecurity):

cp -R SpiderLabs-owasp-modsecurity-crs-*/* /etc/modsecurity/

mv /etc/modsecurity/modsecurity_crs_10_setup.conf.example /etc/modsecurity/modsecurity_crs_10_setup.conf

Llegado a este punto debemos activar las normas. Funciona del mismo modo que apache. Están disponibles pero sino creamos el acceso directo no las dejamos activadas (de esa manera puedes activar unas normas si y otras no si fuera el caso). Las normas disponibles se guardan en /etc/modsecurity/base_rules y las normas activadas se guardan en /etc/modsecurity/activated_rules. Vamos a activarlas todas:

cd /etc/modsecurity/base_rules
for f in * ;
do
 sudo ln -s /etc/modsecurity/base_rules/$f /etc/modsecurity/activated_rules/$f ;
done

cd /etc/modsecurity/optional_rules
for f in * ;
do
sudo ln -s /etc/modsecurity/optional_rules/$f /etc/modsecurity/activated_rules/$f ;
done

Podemos comprobar que el directorio /etc/modsecurity/activated_rules de estar vacio ahora presenta muchos archivos:

/etc/modsecurity/activated_rules# ls

modsecurity_35_bad_robots.data                   modsecurity_crs_21_protocol_anomalies.conf     modsecurity_crs_47_common_exceptions.conf
modsecurity_35_scanners.data                     modsecurity_crs_23_request_limits.conf         modsecurity_crs_47_skip_outbound_checks.conf
modsecurity_40_generic_attacks.data              modsecurity_crs_25_cc_known.conf               modsecurity_crs_48_local_exceptions.conf.example
modsecurity_42_comment_spam.data                 modsecurity_crs_30_http_policy.conf            modsecurity_crs_49_header_tagging.conf
modsecurity_50_outbound.data                     modsecurity_crs_35_bad_robots.conf             modsecurity_crs_49_inbound_blocking.conf
modsecurity_50_outbound_malware.data             modsecurity_crs_40_generic_attacks.conf        modsecurity_crs_50_outbound.conf
modsecurity_crs_10_ignore_static.conf            modsecurity_crs_41_sql_injection_attacks.conf  modsecurity_crs_55_application_defects.conf
modsecurity_crs_11_avs_traffic.conf              modsecurity_crs_41_xss_attacks.conf            modsecurity_crs_55_marketing.conf
modsecurity_crs_13_xml_enabler.conf              modsecurity_crs_42_comment_spam.conf           modsecurity_crs_59_outbound_blocking.conf
modsecurity_crs_16_authentication_tracking.conf  modsecurity_crs_42_tight_security.conf         modsecurity_crs_60_correlation.conf
modsecurity_crs_16_session_hijacking.conf        modsecurity_crs_43_csrf_protection.conf        
modsecurity_crs_16_username_tracking.conf        modsecurity_crs_45_trojans.conf
modsecurity_crs_20_protocol_violations.conf      modsecurity_crs_46_av_scanning.conf

No basta con activarlas en modsecurity, ya que lo que tenemos que hacer es que el módulo modsecurity de apache las tenga en cuenta. Para ello haremos lo siguiente:

vim /etc/apache2/mods-available/security2.conf

y añadiremos la siguiente linea antes del
IfModule del final de linea

Include "/etc/modsecurity/activated_rules/*.conf"

Ya estamos en disposición de activar el módulo en nuestro servidor Apache:

sudo a2enmod security2
Considering dependency unique_id for security2:
Module unique_id already enabled
Module security2 already enabled

También tenemos que habilitar el módulo mod_headers para evitar este error que nos sale al reiniciar el Apache:

Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

Así que lo activamos:

sudo a2enmod headers
Enabling module headers.
To activate the new configuration, you need to run:
  service apache2 restart

Y ya lo tenemos todo instalado y configurado. Ahora reiniciamos Apache:

service apache2 restart

Y... ¿nos creemos que funciona y ya está?. No.. ¡vamos a probarlo!

Abre tu navegador y pon en la dirección http://nombredelhost/?id=23' or '1'='1 (Si es nuestro pc local podemos poner http://localhost/?id=23' or '1'='1 ) . Es importante darle un nombre al servidor que se resuelva, ya que sino puede detectar el sistema un problema con severidad "WARNING". 
Una vez puesta esa dirección, el servidor nos devolverá un MSG 403 de error, pero además en el archivo /var/log/apache2/modsec_audit.log podremos apreciar que nos sale entre otras cosas:

msg "SQL Injection Attack: SQL Tautology Detected."

¡Ataque detectado! Ya tenemos a nuestro cortafuegos de aplicaciones web trabajando.

mod-evasive


Para instalarlo nos apoyaremos en el repositorio oficial de Ubuntu:

apt-get install libapache2-mod-evasive

Una vez instalado el paquete, el modulo ya estará activado.

El archivo de configuración del módulo es bien sencillo:



    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10

    DOSEmailNotify      mail@mimail.edu
    #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
    DOSLogDir           "/var/log/apache2/mod_evasive"

Como veis no hay mucho que configurar. Hay una explicación muy buena y extensa en www.tail-f.com.ar que transcribo tal cual:

  • DOSHashTableSize  – Establece el número de nodos a almacenar para cada proceso de peticiones de la tabla hash (contenedor asociativo de recuperación de peticiones por medio de claves que agiliza las respuestas del servidor). Si aplicamos un número alto a este parámetro obtendremos un rendimiento mayor, ya que las iteraciones necesarias para obtener un registro de la tabla son menores. Por contra, y de forma evidente, aumenta el consumo de memoria necesario para el almacenamiento de una tabla mayor. Se hace necesario incrementar este parámetro si el servidor atiende un número abultado de peticiones, aunque puede no servir de nada si la memoria de la máquina es escasa.
  • DOSPageCount  – Indica el valor del umbral para el número de peticiones de una misma página (o URI) dentro del intervalo definido en DOSPageInterval. Cuando el valor del parámetro es excedido, la IP del cliente se añade a la lista de bloqueos.
  • DOSSiteCount  – Cuenta cuántas peticiones de cualquier tipo puede hacer un cliente dentro del intervalo definido en DOSSiteInterval. Si se excede dicho valor, el cliente queda añadido a la lista de bloqueos.
  • DOSPageInterval  – El intervalo, en segundos, para el umbral de petición de páginas.
  • DOSSiteInterval  – El intervalo, en segundos, para el umbral de petición de objetos de cualquier tipo.
  • DOSBlockingPeriod  – Establece el tiempo, en segundos, que un cliente queda bloqueado una vez que ha sido añadido a la lista de bloqueos. Como ya se indicó unas líneas atrás, todo cliente bloqueado recibirá una respuesta del tipo 403 (Forbidden) a cualquier petición que realice durante este periodo.
  • DOSEmailNotify  – Un e-mail será enviado a la dirección especificada cuando una dirección IP quede bloqueada. La configuración del proceso de envío se establece en el fichero mod_evasive.c de la forma /bin/mail -t %s, siendo %s el parámetro que queda configurado en este parámetro. Será necesario cambiar el proceso si usamos un método diferente de envío de e-mails y volver a compilar el módulo con apxs (por ejemplo, la opción t ha quedado obsoleta en las últimas versiones del comando).
  • DOSSystemCommand  – El comando reflejado se ejecutará cuando una dirección IP quede bloqueada. Se hace muy útil en llamadas a herramientas de filtrado o firewalls. Usaremos %s para especificar la dirección IP implicada. Por ejemplo, podemos establecer su uso con iptables de la forma siguiente:
    DOSSystemCommand “/sbin/iptables –I INPUT –p tcp –-dport 80 –s %s –j DROP”
  • DOSLogDir  – Establece una ruta para el directorio temporal. Por defecto, dicha ruta queda establecida en /tmp, lo cual puede originar algunos agujeros de seguridad si el sistema resulta violado.
  • DOSWhitelist  – La dirección IP indicada como valor del parámetro no será tenida en cuenta por el módulo en ningún caso. Para cada dirección IP a excluir ha de añadirse una nueva línea con el parámetro. Por ejemplo, dejaremos fuera del chequeo del módulo a un posible bot que use los siguientes rangos de direcciones:
    DOSWhitelist 66.249.65.*
    DOSWhitelist 66.249.66.*
    


Es quizás la opcion DOSSystemCommand la que nos da mucho juego ya que una vez detectado el ataque... ¿Que hacemos? Pues podemos crearnos un script y hacer lo que queramos. En el ejemplo de arriba te pone una posibilidad, que es añadir la ip en el iptables:

DOSSystemCommand “/sbin/iptables –I INPUT –p tcp –dport 80 –s %s –j DROP”

Si queremos hacer algo más complejo, pues nos hacemos un script que antes nos mande un mail, etc.. 

Hay que tener en cuenta crear la carpeta para los logs en /var/log/mod_evasive y darle permisos al usuario:grupo www-data (chown -R www-data:www-data /var/log/mod_evasive)

Ahora nos quedaría probarlo, para quedarnos tranquilos de que funciona. Para ello el mod-evasive viene con un script que nos hace la prueba:

perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl


/var/log/apache2# perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
(...)


Podemos observar que hay tantos 200 0K como hemos configurado en la directiva DOSBlockingPeriod   10

Al /var/log/syslog podemos ver:
mod_evasive[28508]: Blacklisting address 127.0.0.1: possible DoS attack.

Enlaces de interes:










That u don't know what you've got 'til it's gone