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 y con la actual 9.
Tabla de contenido
⇧
1. 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.
⇧2. 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
⇧
3. 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.
⇧