Para bloquear los intentos fallidos recurrentes de inicio de sesión en WordPress, por ejemplo para evitar ataques de fuerza bruta puedes realizarlo con Fail2ban. Esta herramienta suele estar en la mayoría de paneles como HestiaCP instalado por defecto y para ello será necesario crear el fichero de definición.
La ruta por defecto es "/etc/fail2ban/filter.d/", por lo que puedes usar un editor de texto por SSH para crear el fichero de la siguiente forma (Editor vi por ejemplo):
# vi /etc/fail2ban/filter.d/wordpress.conf
Deberás incluir la siguiente definición:
[Definition]
failregex = ^<HOST> .* "POST .*wp-login.php
^<HOST> .* "POST .*xmlrpc.php
Una vez creado tendrás que indicar en el fichero que utiliza fail2ban para la configuración de las jails los parámetros para la nueva definición de WordPress. Por lo tanto, modifica el fichero mediante un editor de texto:
# vi /etc/fail2ban/jail.conf
Y añade al final de él los siguientes valores:
[wordpress]
enabled = true
filter = wordpress
port = http,https
action = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath = /var/log/apache2/domains/*error.log
maxretry = 10
findtime = 600
bantime = 7200
Como se puede observar, en logpath esta indicado la ruta de los registros de errores de HestiaCP de los dominios con un * porque separa los logs de los dominios. Por lo tanto, puedes modificar la ruta para indicar que revisé uno en particular o otra ruta de los logs.
En HestiaCP otra manera de hacerlo sería crear individualmente jails para únicamente los dominios que quieras.
Por último, recarga la configuración de fail2ban para que se haga efectiva la modificación mediante el siguiente comando:
# systemctl reload fail2ban.service
Para verificar que está funcionando correctamente realiza el siguiente comando que muestra las jails que están activas:
# fail2ban-client status
Luego puedes probarlo haciendo intentos fallidos y consultar las IP baneadas por la jail de WordPress:
# fail2ban-client status wordpress
Para desbanear una IP baneada por esta jail sería el siguiente comando:
# fail2ban-client set wordpress unbanip DIRECCIONIP
Los siguientes pasos únicamente son necesarios para utilizar Cloudflare
Para utilizar Cloudflare como CDN con Fail2Ban es necesario utilizar la API que proporciona Cloudflare, porque en caso de no configurarlo de este modo seguirá permitiendo el acceso a la IP que debería haber sido bloqueada. También sería posible utilizar la "Real IP" para bloquear los intentos, pero en este caso se indicará solamente el procedimiento para la API v4 de Cloudflare.
Deberás añadir en la ubicación de fail2ban dentro de action.d el siguiente fichero, en HestiaCP ya esta creado por defecto:
# vi /etc/fail2ban/action.d/cloudflare.conf
En el caso de HestiaCP puedes modificarlo solamente para introducir los cfuser y cftoken obtenidos de Cloudflare desde el enlace https://dash.cloudflare.com/profile/api-tokens. El contenido sería el siguiente:
# Obtener Cloudflare API key: https://dash.cloudflare.com/profile/api-tokens usar la Global API Key
# CloudFlare API codigos de error: https://www.cloudflare.com/docs/host-api.html#s4.2
[Definition]
# Option: actionstart
# Notes.: command executed on demand at the first ban (or at the start of Fail2Ban if actionstart_on_demand is set to false).
# Values: CMD
actionstart =
# Option: actionstop
# Notes.: command executed at the stop of jail (or at the end of Fail2Ban)
# Values: CMD
actionstop =
# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
actioncheck =
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
# API v1
#actionban = curl -s -o /dev/null https://www.cloudflare.com/api_json.html -d 'a=ban' -d 'tkn=<cftoken>' -d 'email=<cfuser>' -d 'key=<ip>'
# API v4
actionban = curl -s -o /dev/null -X POST -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \ -H 'Content-Type: application/json' -d '{ "mode": "block", "configuration": { "target": "ip", "value": "<ip>" } }' \ https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
# API v1
#actionunban = curl -s -o /dev/null https://www.cloudflare.com/api_json.html -d 'a=nul' -d 'tkn=<cftoken>' -d 'email=<cfuser>' -d 'key=<ip>'
# API v4
actionunban = curl -s -o /dev/null -X DELETE -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \ https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$(curl -s -X GET -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \ 'https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=<ip>&page=1&per_page=1' | cut -d'"' -f6)
[Init]
# Nombre de la jail en tu fichero jail.local por defecto = [jail name]
name = default
# Option: cfuser
# Notes.: Remplazar <cfuser> en actionban and actionunban with cfuser por el valor siguiente
# Values: Tu cuenta de usuario de CloudFlare
cfuser = user@mail.com
# Option: cftoken (Global API Key)
# Notes.: Remplazar <cftoken> en actionban y actionunban con cftoken por el valor siguiente
# Values: Tu CloudFlare API key
cftoken = TU_API_KEY
Luego indica en el fichero jail.local la nueva acción:
# vi /etc/fail2ban/jail.local
También deberás modificarlo para incluirla en la jail pertinente del servicio Web utilizado en el servidor. En caso de utilizar el panel HestiaCP añadir la acción en la jail creada de Wordpress:
[wordpress]
enabled = true
filter = wordpress
port = http,https
action = cloudflare
# iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath = /var/log/apache2/domains/*error.log
maxretry = 10
findtime = 600
bantime = 7200
Por ultimo, reinicia el servicio fail2ban:
# systemctl restart fail2ban
Esperamos haberte ayudado con este tutorial. ¿Lo has probado? ¡Déjanos tus comentarios! 🙂
Recuerda, si tienes consultas sobre esta u otra cuestión relacionada con tus servidores en Clouding, no dudes en escribir a soporte@clouding.io ¡Estamos a tu lado para lo que necesites!