Bloqueo Automático de IPs con Fail2ban en Servidores Web

Ciberseguridad

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

  1. Crear el script:
sudo nano /usr/local/bin/export_blocked_ips.sh
  1. 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"
  1. Hacerlo ejecutable:
sudo chmod +x /usr/local/bin/export_blocked_ips.sh
  1. Agregar al cron:
sudo crontab -e
  1. 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.