Para protegernos de los ataques por fuerza bruta contra nuestras instalaciones de Drupal tenemos varias opciones, la primera es usar el módulo Ban y la otra es usando el software Fail2ban que requiere acceso de administrador al servidor donde tengamos instalado el CMS. Primero tenemos que tener configurado Drupal, esto funciona con la versión 7, 8, 9 y con la actual 10.
Configuración de Drupal
Empezamos en el panel de nuestro sitio, activamos el módulo Syslog y en seguida nos dirigimos hacia Configuración > Desarrollo > Registro y errores. Verificamos que aparezcan opciones referentes a Syslog y guardamos tal cual sin tocar nada. La siguiente captura es solo de referencia y está configurada para un entorno de desarrollo, y no en producción.
Para verificar que funcione ejecutamos el Cron manualmente desde Configuración > sistema > Cron. Entonces revisamos el archivo de nuestro sistema /var/log/syslog donde debemos encontrar registro al final de este de que el cron se ejecuta correctamente.
Instalación de Fail2ban
Para instalar Fail2ban en Ubuntu, Debian y derivados:
sudo apt install -y fail2ban
Lo iniciamos y activamos para que se ejecute en cada inicio:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
Configuración de Fail2ban
Con el software instalado y corriendo nos dirigimos al directorio /etc/fail2ban/filter.d
y editamos el archivo drupal-auth.conf
. Podemos usar nano
o el editor de nuestra preferencia como usuario root o con sudo
.
El archivo tendrá un texto como el siguiente:
# 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
Le borramos la línea completa que contiene failregex
. Y le agregamos la siguiente regla ahí mismo:
failregex = ^%(__prefix_line)s(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})(\/[\w\.-]+)*\|\d{10}\|user\|<HOST>\|.+\|.*\|\d\|.*\|Login attempt failed from .+\.$
La diferencia entre el filtro de Fail2ban predeterminado es que solo funciona con Drupal 7, en cambio la versión nueva funciona con la 8 y la 9, y además detecta intentos de bots que no usan la cabecera HTTP "referer".
Lo que sigue es activar el filtro, editamos o creamos el archivo /etc/fail2ban/jail.local y le colocamos lo siguiente al final siempre y cuando no exista el mismo contenido:
[drupal-auth]
enabled = true
port = http,https
filter = drupal-auth
logpath = /var/log/syslog
backend = %(syslog_backend)s
bantime = 604800
maxretry = 1
logpath: hace referencia al archivo de Syslog que usa nuestro sistema, Debian y Ubuntu usan el mismo. En el cual se registra cada intento fallido de iniciar sesión.
bantime: el tiempo en segundos que durará bloqueada la IP detectada, en este ejemplo equivale a 7 días.
maxretry: el número de intentos requeridos para bloquear la IP, el valor de 1 significa que si una persona se equivoca 1 sola vez automáticamente será bloqueada.
filter: es el nombre del filtro a usar, por ejemplo en este caso que se usa el drupal-auth.conf se debe usar drupal-auth.
Podemos usar varias configuraciones con opciones independientes, por ejemplo al usar diferentes sitios web con el mismo filtro. Solo tenemos que usar cabeceras diferentes [drupal-auth-ejemplo], [drupal-auth-ejemplo2], etc.
Para comprobar el funcionamiento del filtro usamos fail2ban-regex:
fail2ban-regex -v /var/log/syslog /etc/fail2ban/filter.d/drupal-auth.conf
Nos arroja estadísticas sobre cuántas líneas del log son candidatas al bloqueo y cuántas no, lo ideal es que sean muy pocas o cero las líneas que detecte, de lo contrario puede significar que no está configurado correctamente y podríamos bloquearnos a nosotros mismos.
Reiniciamos Fail2ban:
sudo systemctl restart fail2ban
Finalmente verificamos que podamos acceder a nuestra página, una forma muy efectiva de revisar si está funcionando Fail2ban, es por ejemplo acceder con la red de datos de un dispositivo móvil y probar el bloqueo con nosotros mismos, o intentar con un bantime de unos minutos de duración en el filtro.