Hoy veremos cómo detener un ataque al archivo xmlrpc.php de un blog de WordPress usando Fail2ban. Una de las cosas malas de tener tu blog de WordPress en tu propio servidor web es que te tienes que preocupar de la seguridad, cosa que no pasa si ya te lo dan montado en algún hosting o utilizas alguna plataforma como wordpress.com.
Como sabrás si has leido todos los posts éste blog está alojado en una Raspberry Pi que actúa como servidor web entre otras cosas. Llevo tiempo viendo cómo parpadean constantemente las luces de la tarjeta de red y para las pocas visitas que tiene no es normal.
Me puse a mirar los logs de apache y veía que había un montón de solicitudes al archivo xmlrpc.php y a la página de acceso a la zona privada wp-login.php. Tenía que bloquear esos intentos de acceso ya que es una forma de ataque de fuerza bruta para tomar el control del blog. Pese a que tengo una contraseña bastante segura y es prácticamente imposible que dieran con ella, es una forma de saturar el servidor; hace uso del procesador para gestionar tantas peticiones y hace que las páginas carguen más lentamente.

En un principio lo que hice fué mirar el log en /var/log/apache2/access.log y filtrar las líneas que contenían las palabras xmlrpc y wp-login con:
tail -f /var/log/apache2/access.log | egrep '(xmlrpc|wp-login)'
O si sólo quieres ver las IPs:
tail -f /var/log/apache2/access.log | awk '/(xmlrpc)|(wp-login)/ {print $1}'
Después bloqueaba las IPs con la orden:
sudo route add -host 89.A4.121.237 reject
Con ésto se le corta acceso intantáneamente a esa IP al servidor. Lo malo es que al reiniciar se pierden todas las IPs y hay que volver a empezar a meterlas una a una. No es que suela reiniciarlo muy a menudo, pero aunque sea una vez cada 2 meses no lo consideraba el método más efectivo.
Detener un ataque a xmlrpc.php y/o wp-login.php con Fail2ban
Dándole vueltas a cómo podría solucionarlo me acordé de una herramienta que usaba cuando tenía el puerto SSH abierto el cual recibía al igual que ahora un montón de peticiones de acceso. Se trata de Fail2ban. Lo que hace esta aplicación es monitorear los logs del sistema y las IPs que se porten mal las bloquea haciendo uso de IPTables. Recordaba que con SSH era muy efectivo así que se debería poder usar para éste caso.
Instalado fail2ban
sudo apt update sudo apt install fail2ban
Configurando fail2ban
Crear archivo /etc/fail2ban/filter.d/apache-xmlrpc.conf con el siguiente contenido:
[Definition] failregex = ^<HOST> .*POST .*xmlrpc\.php.* ignoreregex =
Para los ataques a wp-login.php crea el archivo /etc/fail2ban/filter.d/apache-wplogin.conf con el siguiente cotenido
[Definition] failregex = ^<HOST> .*POST .*wp-login\.php.* ignoreregex =
Por último crea el archivo /etc/fail2ban/jail.local con el siguiente contenido
[apache-xmlrpc-access] enabled = true port = http,https filter = apache-xmlrpc logpath = /var/log/apache*/*access.log maxretry = 1 bantime = 86400 [apache-wplogin-access] enabled = true port = http,https filter = apache-wplogin logpath = /var/log/apache*/*access.log maxretry = 4
Ajusta los valores a tu gusto; maxretry especifica el número de veces que debe aparecer la IP para ser bloqueada, es decir, el número de intentos. Yo lo tengo puesto para que al primer intento de acceso a xmlrpc y al cuarto a wp-login sea bloqueado. Con bantime indicamos el número de segundos que la IP se mantendrá bloqueada. En mi caso 86400 segundos (1 día) para xmlrpc y por defecto (10 minutos) para wp-login.
Reiniciando el servicio fail2ban
Por último hay que reiniciar el servicio con:
sudo systemctl restart fail2ban
Con esto ya puedo tener la tranquilidad de que cuando un atacante intente acceder al archivo xmlrpc.php o a wp-login.php será bloqueado y dejará de molestar durante una temporada y si reinicio el servidor seguirá protegido. Espero que te sea útil.
Información obtenida principalmente de http://diegoh.com/install-fail2ban-ubuntu-to-block-attacks-wordpress-xmlrpc/
No olvides dejar tus experiencias en los comentarios.