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.
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
local0.* /var/log/drupal.log
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 .
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.
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