Bloquear Intentos fallidos de Login en Drupal con Fail2ban

Para protegernos de los ataques por fuerza bruta contra nuestras instalaciones de Drupal tenemos varias opciones, la primera es usar el modulo 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 próximamente 9.

drupal 2020 logo

Configuración de Drupal

Empezamos en el panel de nuestro sitio, activamos el modulo "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 esta configurada para un entorno de desarrollo, y no en producción.

drupal config dev syslog

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 ejecuto 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 linea 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 ademas 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 durara bloqueada la IP detectada, en este ejemplo equivale a 7 días.

maxretry: el numero de intentos requeridos para bloquear la IP, el valor de 1 significa que si una persona se equivoca 1 sola vez automáticamente sera 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 arrojara estadísticas sobre cuantas lineas del log son candidatas al bloqueo y cuantas no, lo ideal es que sean muy pocas o cero las lineas que detecte, de lo contrario puede significar que no esta configurado correctamente y podríamos bloquearnos nosotros mismos.

Reiniciamos Fail2ban:

sudo systemctl restart fail2ban

Finalmente verificamos que podamos acceder a nuestra página, una forma muy efectiva de revisar si esta funcionando Fail2ban, es por ejemplo acceder con la red de datos de un dispositivo móvil e intentar bloquearnos nosotros mismos, o probar con un bantime de unos minutos de duración en el filtro.

Categorías

Comentarios