Bloqueo Automático de IPs con Fail2ban en Servidores Web

Ciberseguridad

Fail2ban es una herramienta eficaz para proteger tu servidor contra intentos maliciosos como fuerza bruta, crawling agresivo o accesos indebidos. Funciona analizando los logs del servidor y aplicando reglas de bloqueo (usualmente a través de iptables) contra las IPs que cumplan ciertos criterios definidos.

1. Instalación de Fail2ban

Fail2ban está disponible en la mayoría de distribuciones Linux y se instala fácilmente mediante el gestor de paquetes.

Paso 1. Instalar Fail2ban

Ejecuta el siguiente comando según tu distribución:

Ubuntu/Debian:

sudo apt update
sudo apt install fail2ban

CentOS/RHEL:

sudo yum install epel-release
sudo yum install fail2ban

Verificar la instalación

Asegúrate de que Fail2ban esté instalado y funcionando:

sudo systemctl status fail2ban

Si no está activo, inicia el servicio:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

2. Configuración General de Fail2ban

Fail2ban usa dos tipos de configuraciones principales:

  1. Filtros (.conf): Definen las reglas para detectar patrones sospechosos en los logs.
  2. Jails (jail.local): Especifican qué filtros se aplican y las acciones que se tomarán.

Paso 2. Crear un archivo de configuración local

Para evitar que actualizaciones sobrescriban tus configuraciones personalizadas, crea o edita el archivo jail.local:

sudo nano /etc/fail2ban/jail.local

Este archivo se usa para activar reglas específicas y configurar cómo Fail2ban actuará sobre los logs.

Ejemplo de configuración básica

Agrega esta configuración inicial:

[DEFAULT]
bantime = 3600      # Tiempo en segundos que una IP permanecerá bloqueada (1 hora)
findtime = 600      # Tiempo en segundos para contar intentos fallidos (10 minutos)
maxretry = 5        # Número máximo de intentos permitidos antes de bloquear

[sshd]
enabled = true      # Activar protección para SSH
filter = sshd
logpath = /var/log/auth.log

Esta configuración bloqueará IPs que fallen 5 veces en intentar conectarse al servidor SSH dentro de 10 minutos, bloqueándolas por 1 hora.


3. Configuración para Nginx

Si deseas proteger tu servidor web, Fail2ban puede analizar los logs de Nginx para bloquear accesos maliciosos.

Paso 3. Activar protección para Nginx

En el archivo jail.local, agrega una sección para proteger Nginx:

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/*access.log
maxretry = 5
bantime = 3600
findtime = 600
  • filter: Define el filtro que identificará los intentos sospechosos.
  • logpath: Especifica el archivo de log de Nginx que será analizado.

Paso 4. Crear el filtro para Nginx

Fail2ban necesita un filtro personalizado para detectar accesos no autorizados en los logs de Nginx.

Crea el archivo:

sudo nano /etc/fail2ban/filter.d/nginx-http-auth.conf

Agrega el siguiente contenido:

[Definition]
failregex = ^<HOST> .* "GET /wp-login.php HTTP/.*" .*$
            ^<HOST> .* "(403|404)" .*$
ignoreregex =
  • <HOST>: Detecta la dirección IP.
  • failregex: Define los patrones de comportamiento sospechoso, como intentos de acceder a rutas no permitidas.
  • ignoreregex: Se usa para excluir ciertos patrones del bloqueo (puede quedar vacío si no necesitas excluir).

Probar el filtro

Antes de activarlo, verifica que el filtro funcione correctamente:

sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-http-auth.conf

4. Protección para Errores 502 y Logs Personalizados

Si necesitas bloquear IPs que generan errores específicos (como 502 Bad Gateway) o accesos frecuentes a logs de un sitio particular, sigue estos pasos:

Paso 5. Configurar para errores específicos

En jail.local, agrega una configuración específica para los logs del sitio web:

[nginx-badips]
enabled = true
filter = nginx-badips
logpath = /var/log/nginx/{your_site}.com-error.log
maxretry = 3
bantime = 86400
findtime = 3600

Paso 6. Crear el filtro para errores

Crea el filtro:

sudo nano /etc/fail2ban/filter.d/nginx-badips.conf

Agrega este contenido:

[Definition]
failregex = ^.*client <HOST>.*(502|Resource temporarily unavailable).*
ignoreregex =

Prueba el filtro para asegurarte de que funciona:

sudo fail2ban-regex /var/log/nginx/{your_site}.com-error.log /etc/fail2ban/filter.d/nginx-badips.conf

5. Monitorear y Generar Reportes

Paso 7. Verificar el estado de Fail2ban

Para comprobar el estado de las jails activas:

sudo fail2ban-client status

Para verificar una jail específica (como nginx-badips):

sudo fail2ban-client status nginx-badips

Paso 8. Exportar las IPs bloqueadas

Puedes generar un archivo con las IPs bloqueadas mensualmente usando un script:

  1. Crea el script:
sudo nano /usr/local/bin/export_blocked_ips.sh
  1. Contenido del script:
#!/bin/bash
LOG_FILE="/var/log/fail2ban.log"
OUTPUT_FILE="/var/log/blocked_ips_$(date +%Y-%m).txt"

grep 'Ban' $LOG_FILE | awk '{print $NF}' | sort | uniq > $OUTPUT_FILE
echo "Reporte generado: $OUTPUT_FILE"
  1. Hazlo ejecutable:
sudo chmod +x /usr/local/bin/export_blocked_ips.sh
  1. Programa la ejecución mensual:
sudo crontab -e

Agrega:

0 0 1 * * /usr/local/bin/export_blocked_ips.sh

6. Reiniciar y Probar Fail2ban

Después de configurar todo, reinicia Fail2ban para aplicar los cambios:

sudo systemctl restart fail2ban

Monitorea los bloqueos para asegurarte de que las jails funcionan correctamente:

sudo tail -f /var/log/fail2ban.log

Conclusión

Fail2ban es una herramienta poderosa para automatizar el bloqueo de IPs maliciosas y mejorar la seguridad de tu servidor. Con una configuración adecuada y personalizada, puedes proteger servicios críticos como SSH y Nginx, además de generar reportes periódicos para monitorear las amenazas. Implementa Fail2ban hoy mismo y refuerza la seguridad de tu infraestructura.