← Volver al listado de tecnologías

Capítulo 6: Fail2Ban - Protección contra Fuerza Bruta

Por: SiempreListo
linuxseguridadfail2banbrute-forceips

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.