Mitigar ataques DDoS en un servidor web usando Fail2ban

Mitigar ataques DDoS en un servidor web usando Fail2ban

COMPARTIR 0 TWITTEAR

Controlar las peticiones excesivas en nuestro servidor web

¿Qué es Fail2ban?

Es un script programado en Python que “observa” los logs de Apache en busca de patrones sospechosos y es capaz de tomar medidas para bloquear a los atacantes ya sea con iptables o lanzando un comando de nuestra elección. Se distribuye bajo licencia GNU.

Instalar y configurar Fail2ban en Debian

apt-get install fail2ban

El directorio de configuración de Fail2ban se encuentra en: /etc/fail2ban/ en donde existen dos directorios mas: action.d y filter.d.

  • action.d: Encontraremos las acciones que Fail2ban realizará cuando alguno de nuestros filtros encuentre alguna IP haciendo maldades. Estas acciones pasan por filtrado con iptables, envio de e-mails de aviso o hasta realizar una llamada utilizando Asterisk.

  • filter.d: Tenemos todos los filtros que utilizaremos para identificar a nuestros atacantes.

Configuración para evitar DoS (Denial of Service)

Primer paso

Editamos el archivo /etc/fail2ban/jail.conf y agregamos las siguientes líneas al final:


[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/apache2/ARCHIVO_ACCESS_LOG_DE_TU_SERVIDOR
maxretry = 300
findtime = 300
bantime = 300
action = iptables[name=HTTP, port=http, protocol=tcp]

  • maxretry: Especifica cuantos intentos vamos a dejar antes de banear la ip.

  • findtime: Es el período de tiempo en segundos que estamos contando los “reintentos” (300 segundos = 5 minutos).

  • bantime: Es el tiempo que debemos esperar para liberar las peticiones, osea el tiempo que la IP estará baneada, en este caso se trata de 5 minutos.

Segundo paso

Ahora creamos el archivo de filtrado en /etc/fail2ban/filters.d/http-get-dos.conf y dentro de el colocamos el siguiente contenido:


 [Definition]
  failregex = ^ -.* "(GET|POST). *
  ignoreregex =

El parámetro failregex es una expresión regular que coincidirá con cualquier entrada GET en sus registros, por lo que, básicamente, todas las entradas válidas y no válidas son una coincidencia. Se debe configurar en el archivo jail.conf, el maxretry y findtime cuidadosamente a fin de evitar falsos positivos.

Tercer paso

Reiniciamos Fail2ban

/etc/init.d/fail2ban restart

Hasta ahora con esta configuración ya tenemos un servidor bastante seguro ante ataques ocasionales de denegación de servicio, pero es probable que necesite ajustes mas estrictos en maxretry y findtime para controlar los ataques de denegación de servicio distribuido (DDoS).

Verifiquemos el funcionamiento

Una manera sencilla de comprobar el funcionamiento de nuestra configuración anterior es utilizando ab (Apache Benchmark - parte del paquete apache2-utils) , así:

ab -n 500 -c 10 http://tu-sitio-web-punto-com:80/

Si lo vamos a comprobar de manera local, debemos debemos comentar el parámetro ignoreip en el archivo de configuración /etc/fail2ban/jail.conf y luego reiniciamos Fail2ban, y hacemos la prueba así:

ab -n 500 -c 10 http://127.0.0.1:80/

Esto enviara 500 page-loads en 10 conexiones simultaneas al servior web. Y por las reglas de maxretry y findtime que colocamos, las peticiones GET entrantes desde nuestra IP serán baneadas, y luego de que se cumpla el bantime podremos acceder nuevamente al sitio web.

Echamos un vistazo al log en /var/log/fail2ban.log y deberíamos ver algo como esto:


2014-02-22 05:37:21,943 fail2ban.actions: WARNING [http-get-dos] Ban YOUR_IP_ADDRESS
2014-02-22 05:42:22,341 fail2ban.actions: WARNING [http-get-dos] Unban YOUR_IP_ADDRESS


Esto nos puede ayudar a controlar las peticiones en exceso que realizan scripts mal intencionados para realizar fuerza bruta en formularios de acceso, entre otros, con está técnica y los valores bien afinados deberíamos lograr evitar las peticiones inadecuadas a nuestro servidor.

Archivado en Ataques informáticos, DDoS, DoS, hack, Linux, Seguridad, Servidor, Web
COMPARTIR 0 TWITTEAR

Comentarios (18)

Usa tu cuenta de Facebook para dejar tu opinión.

  • […] Los ataques (DDoS) son muy comunes entre de hackers, porque son capaces de provocar que el sitio deje de funcionar. Casualmente hace poco os hablábamos de una herramienta que conocemos como Fail2ban, con la que mitigar este tipo de ataques. […]

  • Jhon Ramírez dice:

    Hola, hice todo como dices aquí y no funciona me saca error, me puedes dar una ayuda? estoy usando un DEBIAN WHEEZY. este es el error que sale.

    Restarting authentication failure monitor: fail2banTraceback (most recent call last): File “/usr/bin/fail2ban-client”, line 401, in if client.start(sys.argv): File “/usr/bin/fail2ban-client”, line 370, in start return self.__processCommand(args) File “/usr/bin/fail2ban-client”, line 180, in __processCommand ret = self.__readConfig() File “/usr/bin/fail2ban-client”, line 375, in __readConfig ret = self.__configurator.getOptions() File “/usr/share/fail2ban/client/configurator.py”, line 65, in getOptions return self.__jails.getOptions(jail) File “/usr/share/fail2ban/client/jailsreader.py”, line 64, in getOptions ret = jail.getOptions() File “/usr/share/fail2ban/client/jailreader.py”, line 75, in getOptions ret = self.__filter.read() File “/usr/share/fail2ban/client/filterreader.py”, line 53, in read return ConfigReader.read(self, “filter.d/” + self.__file) File “/usr/share/fail2ban/client/configreader.py”, line 59, in read SafeConfigParserWithIncludes.read(self, [bConf, bLocal]) File “/usr/share/fail2ban/client/configparserinc.py”, line 105, in read fileNamesFull += SafeConfigParserWithIncludes.getIncludes(filename) File “/usr/share/fail2ban/client/configparserinc.py”, line 76, in getIncludes parser.read(resource) File “/usr/lib/python2.6/ConfigParser.py”, line 286, in read self._read(fp, filename) File “/usr/lib/python2.6/ConfigParser.py”, line 510, in _read raise e ConfigParser.ParsingError: File contains parsing errors: /etc/fail2ban/filter.d/http-get-dos.conf [line 2]: ‘ failregex = ^ -.*\\”(GET|POST). *\n’ [line 3]: ‘ ignoreregex =\n’

Publica tu opinión usando tu cuenta de Facebook.

¿Te ha gustado? ¡No te pierdas nada más!

follow us in feedly

Nuestros blogs