Il modulo di Remote Procedure Call di WordPress è molto utile per interfacciare il proprio blog con il mondo esterno, ma è anche un punto di ingresso molto apprezzato dai vari bot a caccia di password facili e sistemi non aggiornati.

Se nei log compaiono troppe cose simili a questa:

91.121.108.229 - - [30/Nov/2015:03:14:19 +0100] "POST /xmlrpc.php HTTP/1.0" 200 560 "-" "-"

E’ ora di preoccuparsi.

Con fail2ban è possibile rendere molto più lenta e quindi inefficace la caccia automatizzata alla password.

Prima di tutto configuriamo un nuovo filtro in /etc/fail2ban/filter.d chiamato nginx-xmlrpc.conf

#
# WordPress XMLRPC filter /etc/fail2ban/filter.d/nginx-xmlrpc.conf:
# 
# 

[Definition]
failregex = ^<HOST> .*POST .*xmlrpc\.php.*
ignoreregex =

Quindi aggiungiamo il filtro alla configurazione in /etc/fail2ban/jail.conf

[nginx-xmlrpc]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"]
filter = nginx-xmlrpc
logpath = %(nginx_access_log)s
maxretry = 6
bantime  = 1200
backend = auto

Dopo 6 utilizzi si ottiene un ban di 20 minuti. Attenzione però che non distingue tra richieste legittime e richieste che sono parte di un attacco di bruteforce di username e password. L’unico indicatore di una richiesta parte di un attacco è il fatto che provenga dallo stesso indirizzo IP di altre N richieste. Se si ottiene un blocco anche per attività legittime potrebbe convenire aumentare il maxretry.

La configurazione è valida per NGINX, ma si può facilmente adattare anche per Apache httpd.