Bloqueo Automático de IPs con Fail2ban en Servidores Web
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:
- Filtros (.conf): Definen las reglas para detectar patrones sospechosos en los logs.
- 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:
- Crea el script:
sudo nano /usr/local/bin/export_blocked_ips.sh
- 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"
- Hazlo ejecutable:
sudo chmod +x /usr/local/bin/export_blocked_ips.sh
- 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.