Proteger Drupal contra malintencionados que tratan de loguearse

  • 15 Ene 2020
  • Drupal 7, Fail2ban

Si te cansás de ver en los logs de Drupal un tsunami de entradas a la ruta /user de direcciones ip que no son las tuyas, Fail2ban puede darte una buena mano. Fail2ban es un servicio que se ocupa de leer archivos de log y buscar en cada registro patrones previamente configurados. De acuerdo al resultado de su búsqueda, ejecuta determinadas acciones para intentar mitigar los intentos de intrusión, por ejemplo, un parámetro al firewall para rechazar conexiones desde la dirección ip que generó el registro en el log.

Log de Drupal al log del sistema

Para comenzar, será fundamental configurar Drupal para que escriba los logs en un archivo en vez de hacerlo en la base de datos. Para esto, necesitamos instalar el módulo syslog. Qué es un módulo core, no hay que descargarlo.

Como bien se explica en la documentación oficial de Drupal la cofiguración de syslog es muy simple. Basta agregar una linea al archivo /etc/rsyslog.conf 

Una vez modificado el archivo, reiniciar el servicio

systemctl restart rsyslog

y comprobar que Drupal esté haciendo las cosas bien, por ejemplo enviando el formulario de login de usuario mientras en una consola controlamos los cambios al nuevo archivo de log

tail -f /var/log/drupal.log

Esto debería mostrarnos una linea más o menos como esta:

Feb 15 16:26:59 localhost drupal[677112]: https://www.dominio.com|1581780419|user|192.168.40.2|https://www.dominio.com/user|https://www.dominio.com/user|0||Login attempt failed for .

Instalación de Fail2ban

Para instalar Fail2ban en Fedora 31 basta ejecutar el siguiente comando: 

sudo dnf install fail2ban

Ya desde no estoy seguro que versión de Fedora, el paquete está disponible en el repositorio @update. Pero no no está se podría instalar antes el repositorio Epel.

Configurar Fail2ban

La configuración de Fail2ban se realiza a través del archivo /etc/fail2ban/jail.conf Abrimos este archivo con vi y buscamos drupal (el comando para buscar en vi es /). Agregamos al linea enabled = true y listo. El resultado debería verse más o menos así:

[drupal-auth]

enabled  = true
port     = http,https
logpath  = %(syslog_daemon)s
backend  = %(syslog_backend)s

Una vez modificado jail.conf arrancamos el servicio y lo habilitamos para ejecutarse al arranque

systemctl start fail2ban
systemctl enable fail2ban

Si todo salió bien, Fail2ban deberia haber bloqueado la dirección ip 192.168.40.2 (ver arriba la prueba de log de Drupal). Para ver las reglas del firewall: 

iptalbles -L -n |grep drupal

Si no vemos nada, deberíamos controlar la información registrada por Drupal y la configuración del filtro de Fail2ban para el jail Drupal que podemos encontrar en el archivo /etc/fail2ban/filter.d/drupal-auth.conf

# Fail2Ban filter to block repeated failed login attempts to Drupal site(s)
#
#
# Drupal must be setup to use Syslog, which defaults to the following format:
#
#   !base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message
#
#

[INCLUDES]

before = common.conf


[Definition]

failregex = ^%(__prefix_line)s(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})(\/[\w\.-]+)*\|\d{10}\|user\|<HOST>\|.+\|.+\|\d\|.*\|Login attempt failed for .+\.$

ignoreregex =


# DEV Notes:
#
# https://www.drupal.org/documentation/modules/syslog
#
# Author: Lee Clemens