Instalar y Configurar Fail2Ban

Publicado

Recientemente noté peticiones repetivivas hacia mi servidor hacia recursos que no existen y generan muchos 404. Al parecer hay bots que intentan descubrir si tengo una instalación de Wordpress activa o vulnerable, ya que las peticiones más comunes son algo:

GET /wp-content/plugins/backup-backup/includes/backup-heart.php
GET /wp-content/
GET /wp-includes/js/wp-emoji-release.min.js
GET /wp-admin/css/colors/blue/CasperExV1.php
GET /wp-login.php

Si bien no uso Wordpress y probablemente no me afectan, tampoco me gusta darle el gusto a esos bots y prefiero que se queden con la duda, pero ¿cómo bloquearlos? Aquí es dónde entra Fail2ban. El proceso de instalación consta de clonar el repositorio y ejecutar los scripts en Python:

git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python3 setup.py install 

Puedes validar la instalación e iniciar el servidor con:

fail2ban-client -h
sudo fail2ban-client start #inicia servidor
sudo fail2ban-client version #imprime 1.1.0.dev1

Ahora falta indicarle a Fail2ban qué ips bloquear, para esto agregué un script en mi servicio que detecta si se está consultando una url de Wordpress.

app.use((req, res) => {
  const ip = req.headers["x-forwarded-for"] || req.socket.remoteAddress;
  const path = req.path;
  //las url de wordpress suelen incluir wp-algo
  if (path.includes("/wp-")) {
    //Imprime en el log algo como: [2024-01-30T21:23:09.683] [INFO] BADBOT 141.98.4.87 /wp-admin
    log.info("BADBOT", ip, req.path);
  }
  res.status(404).render("404");
});

El log se escribirá en el archivo /home/user/logs/web.log. Lo siguiente crear la configuración de fail2ban en /etc/fail2ban/jail.local. Llamé a la definición como miweb, se bloquearán los puertos http (80) y https (443) durante 48 horas si en las últimas 24 horas han ocurrido 5 incidencias:

[miweb]
enabled  = true
port     = http,https
logpath  = /home/user/logs/web.log
bantime  = 48h
findtime = 24h
maxretry = 5

Lo último es crear el archivo /etc/fail2ban/filter.d/miweb.conf con la definición del filtro. Se le indica que el host o IP a bloquear se encuentra entre la palabra BADBOT y otros caracteres que definen la ruta, al final de la línea. También que la fecha se encuentra al inicio de la línea con el formato necesario.

[Definition]
failregex = BADBOT <HOST> .*$
datepattern= ^\[%%Y-%%m-%%dT%%H:%%M:%%S\.

Recarga la nueva configuración con sudo fail2ban-client reload, deberá indicar OK. Hice la prueba desde mi celular usando solo los datos para evitar bloquear mi ip del hogar, efectivamente después del 5 intento de acceder a una url prohibida el servidor comenzó a rechazar las conexiones. Existen otras configuraciones predefinidas para servicios comunes que puedes probar y habilitar también.

Los siguiente comandos te permitirán saber qué ips se han bloqueado y si lo deseas desbloquearlos:

# imprime las jaulas configuradas
sudo fail2ban-client status
# imprime los detalles de ips bloqueadas de la jaula específica
sudo fail2ban-client status miweb
# desbanea una ip de la jaula
sudo fail2ban-client set miweb unbanip 141.98.4.87