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