Logo Wordpress y Candado

Crear filtro para WordPress login.php con fail2ban

Posted on Posted in Seguridad, Wordpress

Una buena idea para proteger un sitio WordPress hosteado en Linux es la de usar la aplicación Fail2ban. Esta “especie de framework de iptables” puede leer los logs de acceso a nuestro servidor e identificar intentos de acceso no permitidos.

Es decir, que lee los logs del servidor e identifica las lineas como estas:

sshd[27235]: Invalid user admin from xx.xxx.xx.xxx

Fail2Ban aplica filtros a cada linea de log y la compara con expresiones regulares. Si encuentra repetidos intentos desde una misma IP la banea. Esto, junto a una buena política de contraseñas, reduce en gran medida los ataques por fuerza bruta.

Instalando Fail2Ban

La instalacion es bastante trivial. En caso de que aptitude sea nuestro gestor de paquetes:

sudo apt-get update
sudo apt-get install fail2ban

Una vez instalado ya estamos en condiciones de configurarlo para proteger distintos servicios expuestos a internet como el acceso SSH, el FTP, PhpMyAdmin, SQL, etc…

Cómo configurarlo para que funcione con WordPress?

Si bien el paquete de instalación viene con filtros predefinidos para usos comunes de como SSH, FTP, Apache, etc… no trae un filtro para identificar los intentos de login en WordPress como por ejemplo:

xx.xx.xx.xx - - [13/Oct/2017:21:41:26 -0300] "POST /wp-login.php HTTP/1.1"

Esta linea de log de apache nos esta indicando que una cierta IP hizo una request del tipo POST al wp-login.php de WordPress. Este puede ser un usuario legitimo o un intento de “adivinar” la contraseña. En caso de que estos POST se repitan en un corto intervalo de tiempo procederemos a “banear” la IP de origen por un tiempo.

Por suerte esto es muy facil de hacer con esta aplicación. Para ello debemos crear un filtro personalizado y establecer la regex para que coincida con esas lineas de log.

Nos movemos a la carpeta /etc/fail2ban/filter.d (o la que corresponda a su distribución) y creamos un nuevo archivo que yo llamé wordpress-login.conf. En el mismo establecemos la siguiente definición:

# Fail2Ban configuration file for WordPress login
# by Esteban Panelli (estebanpanelli.info)

[Definition]

failregex = ^<HOST>.*POST \/wp-login\.php HTTP.*

ignoreregex =

Para que esto funcione es necesario crear una jail. Para ello nos vamos a nuestro archivo de definiciones de jails que puede ser jail.local y creamos las definiciones:

[wordpress-login]

enabled = true

findtime = 600
maxretry = 10
bantime = 600

port = http,https
filter  = wordpress-login
logpath = /var/log/apache2/access.log

Importante

Para esta jail se modificaron los valores de findtime, maxretry y bantime para evitar banear usuarios legítimos. Esta configuración deja una ventana de 10 pruebas cada 10 minutos, un atacante pordria identificar esto y lanzar un ataque ajustado a estos parámetros. Aún así se puede mejorar la seguridad generando otras reglas adicionales para matchear usuarios existentes, notificaciones por mail, etc…

Recomendaciones

Si bien este programa proporciona una buena capa de proteccion, no es la panacea de los problemas de intrusión. Siempre recomendamos revisar “a ojo” los logs de forma periódica.

Dejá una respuesta