← Volver al listado de tecnologías
Capítulo 6: Fail2Ban - Protección contra Fuerza Bruta
Capítulo 6: Fail2Ban - Protección contra Fuerza Bruta
¿Qué es Fail2Ban?
Fail2Ban monitorea logs del sistema y bloquea automáticamente IPs que muestran comportamiento malicioso (intentos de login fallidos, escaneos, etc.).
┌─────────────┐ Monitorea ┌─────────────┐
│ Logs │ ──────────────► │ Fail2Ban │
│ (auth.log) │ │ │
└─────────────┘ └──────┬──────┘
│
│ Detecta patrón
▼
┌─────────────┐
│ Firewall │
│ (ban IP) │
└─────────────┘
Instalación
sudo apt update
sudo apt install fail2ban
Configuración
Nunca edites los archivos originales. Usa archivos .local:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Configuración Global
[DEFAULT]
# Tiempo de baneo (10 minutos)
bantime = 10m
# Ventana de tiempo para contar fallos
findtime = 10m
# Fallos permitidos antes del ban
maxretry = 5
# Backend para monitorear logs
backend = systemd
# Acción por defecto (UFW)
banaction = ufw
# Email para notificaciones (opcional)
destemail = [email protected]
sender = fail2ban@servidor
action = %(action_mwl)s
Baneo Incremental
Los reincidentes reciben baneos más largos:
[DEFAULT]
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w
Jails
Los “jails” son configuraciones para servicios específicos.
SSH
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
SSH con Autenticación Agresiva
[sshd-aggressive]
enabled = true
port = ssh
filter = sshd[mode=aggressive]
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
Nginx
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
Gestión de Fail2Ban
Iniciar/Detener
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo systemctl status fail2ban
Verificar Jails Activos
sudo fail2ban-client status
Estado de un Jail Específico
sudo fail2ban-client status sshd
Muestra: IPs baneadas, total de bans, etc.
Desbanear IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
Banear IP Manualmente
sudo fail2ban-client set sshd banip 192.168.1.100
Filtros Personalizados
Los filtros usan expresiones regulares para detectar patrones.
Ver Filtro Existente
cat /etc/fail2ban/filter.d/sshd.conf
Crear Filtro Personalizado
Ejemplo para bloquear escaneos de WordPress:
sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
^<HOST> .* "POST /xmlrpc.php
ignoreregex =
Jail correspondiente:
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 1d
Probar Filtro
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress.conf
Whitelist
Para evitar banearte a ti mismo:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 TU_IP_PUBLICA
Notificaciones por Email
Instala un MTA:
sudo apt install msmtp msmtp-mta
En jail.local:
[DEFAULT]
destemail = [email protected]
sender = [email protected]
mta = mail
action = %(action_mwl)s
Verificación
# Estado general
sudo fail2ban-client status
# IPs actualmente baneadas
sudo fail2ban-client status sshd | grep "Banned IP"
# Logs de Fail2Ban
sudo tail -f /var/log/fail2ban.log
# Verificar reglas de firewall
sudo ufw status
Troubleshooting
Fail2Ban no inicia
sudo fail2ban-client -t
Esto verifica la configuración sin iniciar el servicio.
IP no se banea
Verifica que el log path sea correcto:
ls -la /var/log/auth.log
Verifica que el filtro coincida:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Demasiados falsos positivos
Ajusta maxretry y findtime, o agrega IPs a ignoreip.