Evitar ataques de fuerza bruta en Nginx con Fail2ban

Aprendemos a evitar los ataques fuerza bruta en Nginx con Fail2ban. Justo ayer os hablé de cómo crear nuestro propio entorno de desarrollo para WordPress con Docker y Nginx, por lo que seguiremos por esa senda.

De Fail2ban ya hemos hablado en la web. Esta herramienta se encarga de revisar los registros del sistema, generalmente ubicados dentro de «/var/log», y prohíbe las IP que muestran signos maliciosos. Por ejemplo, demasiadas fallas de contraseña, búsqueda de vulnerabilidades, etcétera. Generalmente, Fail2ban se utiliza para actualizar las reglas del cortafuegos para rechazas las direcciones IP, como he comentado, durante un período de tiempo especificado, aunque también se puede configurar cualquier otra acción (por ejemplo, enviar un correo electrónico)

Una de las ventajas de este servicio es que nos provee de una serie de filtros ya predefinidos y que podemos modificar, para la mayoría de los servicios más populares (apache, nginx, ssh, etc.)

No hace falta que os diga que Fail2ban puede reducir la tasa de intentos de autenticación incorrectos, pero NO puede eliminar el riesgo que presenta una autenticación débil. Esto lo podemos solventar, por ejemplo, con la autenticación en dos factores o mecanismos de autenticación públicos / privados.

Instalación y configuración de Fail2ban

En la entrada que escribí hace unos años, que he comentado al principio de la entrada, ya expliqué en que consistía la instalación. En cualquier caso, no viene mal realizar un recordatorio del procedimiento.

En sistemas como Debian, Ubuntu o Linux Mint

sudo apt install fail2ban

En las últimas versiones de RHEL, Centos o Fedora

sudo dnf install fail2ban

En versiones antiguas de RHEL o Centos

sudo yum install fail2ban

En SUSE y OpenSUSE

sudo zypper install fail2ban

En Arch y derivadas

sudo pacman -S fail2ban

Una vez instalado, ya podemos empezar a trabajar.

El primer paso será copiar el fichero de configuración del servicio y sobre esa copia realizar los cambios que deseemos.

sudo cp -p /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Añadir reglas para Nginx

Veamos una serie de ejemplos. Todos ellos se deben añadir al fichero jail.local, comentado antes.

Bloqueamos a los usuarios que fallen al utilizar la autentificación básica de Nginx

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
bantime = 600 # 10 minutes
maxretry = 6

Bloqueamos a los usuarios que fallen al autentificarse en una aplicación.

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 600 # 10 minutes
maxretry = 6

Bloquear a los badbots

[nginx-badbots]
enabled  = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 day
maxretry = 1

Bloquear a todos aquellos que intenten ejecutar un script

[nginx-noscript]
enabled = true
action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript
logpath = /var/log/nginx*/*access*.log
maxretry = 6
bantime  = 86400 # 1 day

Bloquear a todos aquellos que quieren utilizar el servidor como un proxy

[nginx-proxy]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"]
filter = nginx-proxy
logpath = /var/log/nginx*/*access*.log
maxretry = 0
bantime  = 86400 # 1 day

A continuación creamos los correspondientes ficheros de filtro, en la ubicación /etc/fail2ban/filter.d, cada uno en un fichero separado.

Fichero /etc/fail2ban/filter.d/nginx-proxy.conf

[Definition]
failregex = ^<host> -.*GET http.*
ignoreregex =

Fichero /etc/fail2ban/filter.d/nginx-noscript.conf

[Definition]
failregex = ^<host> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =

Fichero /etc/fail2ban/filter.d/nginx-auth.conf

[Definition]
failregex = no user/password was provided for basic authentication.*client: <host>
            user .* was not found in.*client: <host>
            user .* password mismatch.*client: <host>
ignoreregex =

Fichero /etc/fail2ban/filter.d/nginx-login.conf

[Definition]
failregex = ^<host> -.*POST /sessions HTTP/1\.." 200
ignoreregex =

Evitar los ataques por fuerza bruta en Wordpres

Podemos crear un filtro específico para evitar los ataques de fuerza bruta en el acceso a nuestro WordPress. Añadiendo al fichero jail.local el siguiente filtro:

[nginx-wp-login]
 
enabled = true
port = http,https
filter = nginx-wp-login
logpath = /ruta/log/wordpress/access.log
maxretry = 3
findtime = 120
bantime = 1200

Añadimos el fichero correspondiente /etc/fail2ban/filter.d/nginx-wp-login.conf

[Definition]
 
failregex = <host>.*] "POST /wp-login.php
ignoreregex =

Habilitar las notificaciones por correo

También podemos definir una dirección de correo en el fichero de configuración jail.local, para que nos avise cuando se produzca un bloqueo:

destemail = direccion@correo
mta = sendmail

Para que el envío funcione debemos tener instalado un servicio de envío de correo en el host, los más populares son: sendmail, postfix y exim.

Fuentes consultadas

Elbauldelprogramador.com – Bloquear ataques de fuerza bruta en Nginx y WordPress con fail2ban
Fail2ban for NGinx
Fail2ban for WordPress