Control de ataques a servicios con Fail2ban

fail2banSegún la definición en su página de GitHub, Fail2ban es un demonio que banea hosts que han causado múltiples errores de autenticación. Pero realmente esta herramienta de seguridad informática va más allá y no solo nos ayudará en la tarea de intentar minimizar los ataques remotos que se realizan continuamente, normalmente por fuerza bruta, contra fallos de autenticación de nuestro servidor, sino que puede llegar a ser una gran herramienta de monitorización y control de seguridad de servicios de todo tipo.

Quizás inicialmente su funcionalidad se limitaba a la búsqueda de fallos de autenticación en los ficheros log de sistema. Lo cierto es que ahora mismo podría denominarse «filter2action» ya que permite definir la búsqueda de cualquier patrón o filtro en forma de expresión regular contra un log indicado para desencadenar una acción determinada que puede ir desde bloqueo a nivel de firewall como la ejecución de comandos o notificación por email.

Vamos a ver en qué consisten estas acciones, filtros y jaulas y cómo configurarlas según nuestras necesidades.

Instalación

Podemos instalar fail2ban mediante paquetería si la encontramos en nuestra distribución o de forma manual.

Recomiendo instalar al menos una versión superior a la 0.9 ya que se han realizado importantes cambios tanto en la configuración como en la funcionalidad del cliente.

Por ejemplo, para CentOS 7 instalaremos el repo EPEL y procederemos con la instalación normalmente.

[root@linux ~]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm
[root@linux ~]# yum intall fail2ban -y

Para la instalación manual descargamos los fuentes del repositorio github y descomprimimos en un directorio. Despues ejecutamos el script de instalación python que se facilita.

[root@linux ~]# tar xvfj fail2ban-0.9.1.tar.bz2
[root@linux ~]# cd fail2ban-0.9.1
[root@linux ~]# python setup.py install

 

En el directorio files podemos encontrar diferentes scripts de inicialización del servicio según distribución, además de scripts para logrotate y monitoreo de fail2ban con Nagios, Logwatch o Cacti.

Para la configuración de fail2ban disponemos de diferentes ficheros existentes en el directorio /etc/fail2ban. Estos son:

  • Acciones disponibles: Directorio /etc/fail2ban/action.d
  • Filtros disponibles: Directorio /etc/fail2ban/filter.d
  • Jaulas: Fichero /etc/fail2ban/jail.conf

Configuración base

No suele ser necesario modificar la configuración base de fail2ban pero de ser así crearemos una copia en fail2ban.local para sobrescribir los parámetros sin afectar a futuras actualizaciones.

En este fichero de configuración podemos especificar el nivel de log, la ruta dónde se almacenará, ficheros pid y socket. Además en las últimas versiones se ha implementado la gestión de persistencia de hosts baneados mediante el uso de una base de datos sqlite. Aquí también podremos definir la ruta de esa base de datos y el tiempo que deseamos mantener esa persistencia. 

Configuración de acciones

Dentro del directorio action.d nos encontramos con los ficheros de definición de las distintas acciones que podemos desencadenar.

Tal y como se muestra en el fichero de ejemplo dummy.conf una acción consiste en una acción de inicio, una acción de parada, una acción de chequeo, una acción de baneo y una de desbaneo. También se pueden cargar ficheros de configuración adicionales con before y after e inicialización de variables en la sección Init.

[Definition]
actionstart = touch /var/run/fail2ban/fail2ban.dummy
              printf %%b "<init>\n" >> /var/run/fail2ban/fail2ban.dummy
actionstop = rm -f /var/run/fail2ban/fail2ban.dummy
actioncheck = 
actionban = printf %%b "+<ip>\n" >> /var/run/fail2ban/fail2ban.dummy
actionunban = printf %%b "-<ip>\n" >> /var/run/fail2ban/fail2ban.dummy

[Init]
init = 123

Configuración de filtros

En el directorio filter.d encontramos los ficheros de definición de filtros.

En los filtros podemos definir las secciones INCLUDES, Init y Definition.

En la sección INCLUDES podemos cargar otros ficheros de configuración antes o después del fichero en que nos encontramos.

En la sección Init podemos definir e inicializar diferentes variables que luego podemos usar en el filtro.

La sección Definition nos permitirá definir las expresiones regulares que den con el patrón deseado para desencadenar las acciones.

Disponemos de los parámetros failregex en que definimos la expresión regular que detecta nuestro patrón. Se utiliza poco pero también podemos hacer uso del parámetro ignoreregex donde podemos definir con expresiones regulares aquellas líneas que queremos que sean ignoradas en el resultado final de aplicar el filtro.

[INCLUDES]
before = common.conf

[Definition]
__pam_re=\(?pam_unix(?:\(\S+\))?\)?:?
_daemon =  vsftpd

failregex = ^%(__prefix_line)s%(__pam_re)s\s+authentication failure; logname=\S* uid=\S* euid=\S* tty=(ftp)? ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
            ^ \[pid \d+\] \[.+\] FAIL LOGIN: Client "<HOST>"\s*$

ignoreregex =

Fail2ban viene con varios filtros preconfigurados para servicios y herramientas como Apache, Nginx, Dovecot, Nagios, MySQL, Postfix, vsftpd, Sendmail, etc.

Configuración de jaulas

El fichero jail.conf es el encargado de definir que jaulas o conjuntos de filtros y acciones estarán activas y los parámetros necesarios para su correcto funcionamiento.

Fail2ban permite sobrescribir la configuraciones por defecto simplemente creando el correspondiente fichero con extensión .local. Crearemos el fichero jail.local para evitar problemas en futuras actualizaciones.

Al igual que en otros ficheros de configuración podemos cargar antes o después de este otros ficheros de configuración según necesidad mediante la sección INCLUDES.

En la sección DEFAULT definimos parámetros por defecto que nos permitirán ignorar ips, especificar el máximo número de intentos o el tiempo entre ellos. Estos parámetros pueden ser ajustados en la definición de cada jaula.

Por defecto una jaula aplicará un filtro que tenga como nombre el mismo que la jaula y ejecutará la acción por defecto de bloqueo por iptables.

Dentro de cada jaula disponemos de los siguientes parámetros para su configuración:

  • Enabled: habilita la jaula.
  • Logpath: lista de ficheros log que serán parseados en busca de coincidencias.
  • Action: lista de definición de de acciones a ejecutar si hay coincidencias al aplicar el filtro.
  • Banaction: se puede especificar el nombre de la acción directamente en este parámetro.
  • Port: puertos involucrados en la jaula.
  • Protocol: lista de protocolos involucrados en la jaula.
  • Bantime: tiempo en segundos que el host será baneado
  • Maxretry: número máximo de intentos permitidos.
  • Findtime: un host es baneado si ha generado en número máximo de intentos permitidos en el tiempo en segundos especificado aquí.
[apache-badbots]
# Ban hosts which agent identifies spammer robots crawling the web
# for email addresses. The mail outputs are buffered.
enabled  = true
port     = http,https
logpath  = %(apache_access_log)s
bantime  = 172800
maxretry = 1

 

Utilidades de línea de comandos.

Fail2ban viene con dos utilidades que no serán muy útiles a la hora de consultar, actualizar o generar la configuración del servicio. Estas utilidades son fail2ban-client y fail2ban-regex.

Fail2ban-client

Con este comando podemos consultar o modificar el estado de las jaulas directamente sin recargar la configuración. Para obtener la ayuda de este comando ejecutamos:

[root@linux ~]# fail2ban-client -h

Por ejemplo, para conocer el estado de las jaulas usaremos.

[root@linux ~]# fail2ban-client status <JAIL>

Para banear/desbanear una ip usaremos.

[root@linux ~]# fail2ban-client set <JAIL> banip <IP>
[root@linux ~]# fail2ban-client set <JAIL> unbanip <IP>

Puedes consultar la lista completa de comandos en este enlace.

Fail2ban-regex

Con este comando podremos testear nuestras expresiones regulares para comprobar su correcto funcionamiento al ser aplicadas contra un fichero log especificado. Podemos validar un filtro ya definido o especificar la expresión regular a mano. 

[root@linux ~]# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
[root@linux ~]# fail2ban-regex /var/log/auth.log "Failed [-/\w]+ for .* from <HOST>"

 

Actualmente fail2ban es una gran herramienta que nos permitirá evitar gran parte de ataques tipo DDoS y fuerza bruta contra todo tipo de servicios.

En el caso de servicios web como Apache será el complemento ideal para otras herramientas como ModSecurity o incluso mod-evasive de las que podremos hablar en otro momento.