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