martes, 11 de septiembre de 2018

Detectar, controlar y banear los Ataques DoS con Fail2Ban

Sobre el tema de Hardening a nuestros servidores GLAMP ya ha hablado mucho en este blog. Primero os conté cómo hacer Hardening en nuestro servidor GLAMP  con Apache en Prefork.Después, en el artículo "El server me sabe a poco" fui más allá y configuré Apache en FastCGI con libapache y PHP_FPM además de añadir balanceadores de carga para así llegar a las 0 failed requests en el stressing test donde conseguí que llegasen 40K de requests con una concurrencia de 5K.Pero no fue hasta el post que le dediqué a Pandora FMS, una herramienta muy buena que utilizo para monitorizar los sistemas y las redes, donde hablé de precisamente esto, cómo monitorizar nuestros servidores que tenemos en el balanceador de carga y cómo adelantarse a un posible fallo. En estos posts, os he ido introduciendo conceptos como los de seguridad por oscuridad o configurar iptables, pero una política de iptables así sin más si saber ni entender cuándo te pueden estar haciendo un ataque DoS es bastante useless, así que es eso precisamente de lo que vengo a hablar en este post, sobre cómo utilizar Fail2Ban para banear a los equipos que estén realizando un DoS o un ataque de fuerza bruta contra nuestros servidores.



Para utilizar Fail2Ban sería recomendable que tuviésemos en nuestro sistema los siguientes requerimientos:

  • iptables
  • tcp-wrappers (tcpd)
  • Gamin
  • Un comando de mail también sería algo interesante.
Para instalar con el clásico apt-get install, ya sabéis. Cuando lo tengamos todo, descargamos Fail2Ban con apt-get install Fail2Ban -y. Como veis no es muy compleja la instalación.

Fail2Ban es un software que nos ayudan contra posibles intrusiones. Yo lo voy a utilizar para detectar y bloquear un ataque de DoS contra el APache que tengo configurado en un servidor con Debian 9.5.0. Por la configuración no os preocupéis, casi siempre son las mismas opciones dentro del archivo de configuración que se encuentra en /etc/fail2ban/jail.conf

#
# HTTP servers
#

[apache-auth]

enabled = true
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 3
filter = apache-auth
bantime = 600


[apache-badbots]
# Ban hosts which agent identifies spammer robots crawling the web
# for email addresses. The mail outputs are buffered
enabled = true
filter = apache-badbots
port     = http,https
logpath  = %(apache_access_log)s
bantime  = 600
maxretry = 3


[apache-noscript]
enabled = true
filter  = apache-noscript
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 3
bantime = 600

[apache-overflows]
enabled = true
filter = apache-overflows
bantime = 600
port     = http,https
logpath  = %(apache_error_log)s
maxretry = 3

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

# SSH servers
#

[sshd]
enabled = true
port    = ssh
filter = sshd
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 600

Aquí os dejo las partes importantes de mi /etc/fail2ban/jail.conf y que son las que nos van a servir para este post. Como veis, siempre son los mismos parámetros en cada sección. Es importante añadir el log correcto para Apache y para SSH. Por supuesto, lo que vamos a hacer es bloquear los DoS que pueda recibir nuestro Apache y también bloquear los posibles ataques de fuerza bruta que pueda recibir nuestro SSH. Esto es elevarlo al siguiente nivel ya que podemos tirar de seguridad por oscuridad y cambiar el default port de SSH, pero tenemos que contar que podemos tener delante a un buen pentester o atacante y que aún por esas saque el puerto de SSH.

Podemos tener una strong password, pero un ataque de fuerza bien efectuado nos puede hacer mucho daño, por lo que cuanto más reduzcamos la probabilidad de que este pase, más seguros estaremos aunque esta seguridad no pueda ser nunca al 100%.


Cada sección de jail.conf, hace referencia a un filtro que se encuentra en /etc/fail2ban/filter.d/, siendo cada filtro un fichero. En nuestro caso, no tenemos el que hace referencia a http-get-dos, por lo que lo deberemos crear. Lo que sí tenemos en Fail2Ban para Debian 9 es el filtro para HaProxy, algo que me hico ilusión al verlo. Pero volviendo al archivo de http-get-dos, esto es lo que tendremos que escribir dentro del archivo.


Después de esto lo que tendremos que hacer para que se guarden los cambios es reiniciar fail2ban con systemctl restart fail2ban. También podéis utilizar /etc/init.d/fail2ban imagino, pero yo utilizo siempre systemctl siempre por si diese fallo, comprobar el status y después abrir journalctl.


Si typeamos el comando iptables -L veremos cómo se han introducido las reglas de iptables de fail2ban relativas a Apache y SSH, por lo que sabemos que tenemos cargadas las reglas y que fail2ban funciona. Ya lo único que nos queda es probar que efectivamente banea al atacante cuando recibe la consulta número 401, ya que en el maxretry hemos establecido el valor 400.


Y lanzando el stressing test con la tool ab de apache2-utils, vemos que banea a la IP desde la que he realizado el ataque. Esto nos permite incrementar la seguridad de nuestro servidor web ya que bloquea al atacante y por supuesto mejora la disponibilidad del servicio, ya que en la consulta 401 ya lo bloquea y permite otras conexiones sin que caiga el servicio.

Añadiendo este post a los anteriores, podemos conseguir un 50,80 e incluso 100% de optimización con estas configuraciones tan básicas. Además hemos montado un sistema de monitorización con Pandora FMS que nos permitirá conocer mejor el estado de nuestros sistemas y detectar posibles futuros errores. 

Ya lo único es revisar diariamente el estado del servidor y comprobar que todo va bien y hacer pequeños cambios si vemos que el servidor se puede resentir. 

¿Hackeamos el Mundo?

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...

Entrada destacada

El server me sabe a poco.

Soy un fanático del Rock y de Debian . (Creo que voy a inventar Rockbian, que suena bien y todo xD) Llevaba tiempo queriendo unir estos 2 c...