Bloqueo Automático de IPs con Fail2ban en Servidores Web
Introducción
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.
Instalación de Fail2ban
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 fail2ba
Configuración general
Fail2ban usa dos tipos de configuraciones principales:
- Filtros (.conf): Definen reglas para detectar patrones sospechosos en los logs.
- Jails (jail.local): Especifican qué filtros se aplican y qué acciones se tomarán.
Crear archivo de configuración local
Edita o crea el archivo jail.local:
sudo nano /etc/fail2ban/jail.local
Ejemplo básico
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
[sshd]
enabled = true
filter = sshd
logpath = /var/log/auth.log
Protección para Nginx
Activar jail para Nginx
Agrega al archivo jail.local:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/*access.log
maxretry = 5
bantime = 3600
findtime = 600
Crear filtro para Nginx
Crea el archivo:
sudo nano /etc/fail2ban/filter.d/nginx-http-auth.con
Contenido:
[Definition]
failregex = ^<HOST> .* "GET /wp-login.php HTTP/.*" .*$
^<HOST> .* "(403|404)" .*$
ignoreregex =
Probar el filtro
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-http-auth.conf
Protección para errores 502 y logs personalizados
Agregar jail personalizada
En jail.local:
[nginx-badips]
enabled = true
filter = nginx-badips
logpath = /var/log/nginx/{your_site}.com-error.log
maxretry = 3
bantime = 86400
findtime = 3600
Crear filtro personalizado
sudo nano /etc/fail2ban/filter.d/nginx-badips.conf
Contenido:
[Definition]
failregex = ^.*client <HOST>.*(502|Resource temporarily unavailable).*
ignoreregex =
Probar el filtro
sudo fail2ban-regex /var/log/nginx/{your_site}.com-error.log /etc/fail2ban/filter.d/nginx-badips.conf
Monitoreo y reportes
Ver estado de Fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-badips
Exportar IPs bloqueadas mensualmente
- Crear el script:
sudo nano /usr/local/bin/export_blocked_ips.sh
- Contenido:
#!/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"
- Hacerlo ejecutable:
sudo chmod +x /usr/local/bin/export_blocked_ips.sh
- Agregar al cron:
sudo crontab -e
- Agregar línea:
0 0 1 * * /usr/local/bin/export_blocked_ips.sh
Reinicio y monitoreo
Reinicia Fail2ban para aplicar cambios:
sudo systemctl restart fail2ban
Monitorea actividad:
sudo tail -f /var/log/fail2ban.log
Conclusión
Fail2ban es una herramienta poderosa para automatizar el bloqueo de IPs maliciosas. Protege servicios críticos como SSH y Nginx, y permite una configuración flexible y reportes periódicos. Con su implementación adecuada, mejoras significativamente la seguridad de tu servidor.