Vamos a explicar como proteger un servidor web Apache contra ataques DOS y DDOS mediante el módulo mod_evasive y el firewall nativo de Linux IPTables.
El servidor corre Debian Lenny, y hago incapie en esto porque la configuración de Apache varía mucho según la distribución que estemos utilizando.
Ya tenemos el servidor instalado y configurado y nos interesa protegerlo, para ello instalamos el módulo de Apache mod_evasive:
apt-get install libapache2-mod-evasive
También es posible descargar y compilar, pero prefiero siempre en la medida de lo posible, usar paquetes proporcionados por la distribución.
En Debian Lenny, el archivo de configuración de Apache es /etc/apache2/apache2.conf en el podemos escribir la configuración del módulo, o mejor, comprobar que existe la línea
Include /etc/apache2/mods-enabled/*.conf
y añadir la configuración del módulo en un fichero nuevo dedicado, por mantener el orden, por ejemplo mod-evasive.conf La configuración que viene por defecto es la siguiente.
<IfModule evasive20_module>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 300
</IfModule>
Lo primero que debemos observar es el nombre del módulo, es variable según la distribución en la que nos encontremos o si lo hemos compilado nosotros eligiendo otro nombre.
La explicación de cada parámetro la transcribo de tail -f | systemadmin
Para activar el módulo simplemente
# a2enmod mod-evasive
Como vemos tiene más opciones, la que ahora nos insteresa es la de DOSSystemCommand que es la que permite ejecutar acciones en el sistema.
IPTables es un programa para crear reglas de filtrado de tráfico de red, es un programa que debe ser ejecutado por un usuario con privilegios (root), pero siguiendo la Ley del permiso mínimo el servidor corre bajo un usuario no privilegiado, esta medida protege que ante un desbordamiento no quede una sesión privilegiada colgada.
El usuario que corre el servidor web no puede correr IPTables pero no está todo perdido, lo que tenemos que hacer es pasarle un mensaje a root con la IP que tiene que bloquear, y eso hemos visto ya como se puede hacer.
Primero añadimos la siguiente línea a nuestro fichero de configuración del módulo (en apache2.conf o en mod-evasive.conf)
DOSSystemCommand "/home/$USER/bin/checkIP %s"
En $USER/bin hemos escrito un script que actualizará un registro de IP que están haciendo más peticiones de la cuenta, el script tiene una pinte así
#!/bin/bash
# Este script llevara un fichero de log de los
# intentos de ataques DOS DDOS al servidor
DATE=$(date +%Y-%m-%d-%k-%M-%S);
LOGFILE="/home/$USER/bin/CheckIp.log";
echo $DATE $1 >> $LOGFILE;
Simplemente crea un log de IP’s con este formato:
2010-10-31-20-16-41 1.1.1.2
2010-10-31-20-16-41 86.217.15.159
2010-10-31-20-16-41 92.21.26.197
Ahora entra en juego root, que se encargará de supervisar este fichero y actuar si cambia, para ello nos apoyamos en incron, creamos una nueva regla de supervisión del sistema de fichero así
Abrimos el fichero
# incrontab -e
Editamos el fichero
/home/$USER/bin/CheckIP.log IN_MODIFY /root/bin/banIP
El script que hemos escrito banIP se ejecutará cada vez que se modifique el fichero CheckIP.log y pasara la IP a la lista de IPTables,
#!/bin/bash
LOGFILE="/home/$USER/bin/CheckIP.log";
IP=$(tail -n 1 $LOGFILE | cut -d" " -f 2);
/sbin/iptables -I INPUT -p tcp --dport 80 -s $IP -j DROP;
Para probar si está funcionando podemos ejecutar el script perl que proporciona el paquete mod_evasive, veremos algo como esto:
$ 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 403 Forbidden
Expiró el tiempo de conexión at test.pl line 12.
Con el reinicio del servidor se perderan las reglas si no se guardan.
Con esto hemos ganado unos cuantos puntos de seguridad, de por sí, mod_evasive evita exceso de peticiones, al combinarlo con IPTables liberamos a Apache de ese trabajo dejandolo en manos de un programa diseñado para eso.
Recent Comments
(114 weeks ago)
(238 weeks ago)
(277 weeks ago)
(277 weeks ago)
(323 weeks ago)
(323 weeks ago)
(323 weeks ago)
(323 weeks ago)
(324 weeks ago)
(324 weeks ago)