Home » Blog » Guide tecniche » Proteggere WordPress da attacchi bruteforce con Fail2ban
Fail2ban è un servizio lato server che consente di monitorare file di log al fine di individuare tentativi di accesso non autorizzati o attacchi bruteforce e bannare gli indirizzi IP degli attackers.
Può essere utilizzato con qualsiasi servizio che fa uso di file di log, come ad esempio SSH, postfix, dovecot, Nginx, Apache ecc. WordPress nativamente non registra informazioni sui login falliti o altri tentativi malevoli su file di log, nonostante PHP lo consenta nativamente mediante l’utilizzo della funzione syslog.
Come spesso accade in queste situazioni, esiste un plugin molto utile ci consentirà di utilizzare Fail2ban con WordPress in pochi minuti. Il plugin è WP Fail2ban.
Questo plugin si occuperà di registrare su syslog non solo i tentativi di login falliti ma anche ad esempio l’enumerazione di utenti sfruttando xmlrpc.php, spam nei commenti ecc.. al fine di consentire di bannare gli indirizzi IP degli attackers utilizzando Fail2ban.
Per facilitare la configurazione, insieme al plugin vengono rilasciati dei filtri Fail2ban da copiare e incollare all’interno di /etc/fail2ban/filters.d. Tutto ciò che rimane da fare è configurare il plugin e creare la jail su /etc/fail2ban/jail.d.
Con questa guida imparerai a proteggere WordPress da attacchi bruteforce e login non autorizzati usando Fail2ban. Se non lo hai mai usato prima ti invitiamo a leggere la nostra guida a Fail2ban.
Indice dei Contenuti
Come per qualsiasi altro plugin presente nei repository di WordPress basta accedere al backend del sito come amministratore, recarsi nella sezione Plugin, cliccare su Aggiungi nuovo, cercare WP Fail2ban, installarlo e attivarlo.
A questo punto occorre aprire il file wp-config.php di WordPress per inserire le regole di configurazione del plugin. È possibile saltare questo passaggio ed utilizzare l’interfaccia grafica acquistando la versione pro.
Come prima cosa bisogna decidere quali sono gli eventi da monitorare. È possibile visualizzare la lista completa degli eventi supportati da WP Fail2ban in questa pagina. In questa guida andiamo a configurare i seguenti eventi:
Inserire all’interno di wp-config.php le seguenti costanti PHP:
define('WP_FAIL2BAN_BLOCKED_USERS', '^admin$'); define('WP_FAIL2BAN_LOG_SPAM', true); define('WP_FAIL2BAN_BLOCK_USER_ENUMERATION', true);
I tentativi di login falliti e quelli andati a buon fine vengono già loggati dal plugin, ergo non occorre far nulla per abilitare questo evento.
Di default gli eventi vengono tracciati utilizzando LOG_AUTH di syslog. È possibile utilizzare anche LOG_AUTHPRIV inserendo in wp-config.php la seguente costante:
define('WP_FAIL2BAN_AUTH_LOG', LOG_AUTHPRIV);
Su Ubuntu server syslog inserisce i log tracciati con LOG_AUTH e LOG_AUTHPRIV in /var/log/auth.log.
Salvare wp-config.php e proseguire con la verifica dei log.
Prima di configurare le jail su Fail2ban assicuriamoci che gli eventi vengano loggati con successo. Proviamo dunque ad effettuare un login errato e controllare /var/log/auth.log. Se tutto andrà per il verso giusto visualizzeremo un log simile al seguente:
Jun 28 10:27:39 squeezemind-server-1 wordpress(www.squeezemind.it)[6794]: Authentication attempt for unknown user mario from 97.57.139.142
Se proviamo a loggarci con la username admin visualizzeremo un log simile al seguente:
Jun 28 10:54:33 squeezemind-server-1 wordpress(www.squeezemind.it)[7697]: Blocked authentication attempt for admin from 97.57.139.142
A questo punto non rimane che configurare Fail2ban.
Come già detto il plugin contiene al suo interno tre filtri Fail2ban che si trovano all’interno della directory filter.d. Come prima cosa occorre copiare tali filtri all’interno di /etc/fail2ban/filter.d come utente amministratore del server.
Fatto questo inserire le jail all’interno del file di configurazione presente su /etc/fail2ban/jail.d/ o creare un nuovo file .conf:
[wordpress-hard] enabled = true filter = wordpress-hard logpath = /var/log/auth.log maxretry = 3 bantime = 24h findtime = 3m port = 80,443
In questo caso si è deciso di utilizzare il filtro wordpress-hard.conf che consente di tracciare tutti gli eventi loggati da WP Fail2ban. La regola banna per 24 ore tutti gli indirizzi IP sulle porte 80 e 443 che effettuano un minimo di 3 tentativi non autorizzati nell’arco di 3 minuti.
Salvare e controllare che non vi siano errori di sintassi:
sudo fail2ban-server -t OK: configuration test is successful
Non rimane che riavviare Fail2ban per rendere operativo il monitoring:
sudo service fail2ban restart
Se il server è dietro Cloudflare occorre utilizzare le API gratuite per bannare l’indirizzo IP reale dell’attacker utilizzando il firewall Cloudflare.
Come prima cosa estrapolare la Global API Key in fondo alla pagina del profilo Cloudflare:
Fatto questo modificare il file /etc/fail2ban/action.d/cloudflare.conf e settare cftoken e cfuser corrispondenti rispettivamente alla Global API key e all’indirizzo email dell’account Cloudflare:
cftoken = 1234567890abcdefghijklmopqrstuvwxyz99 cfuser = [email protected]
Salvare e modificare la jail appena creata inserendo la direttiva action = cloudflare:
[wordpress-hard] enabled = true filter = wordpress-hard logpath = /var/log/auth.log maxretry = 3 bantime = 24h findtime = 3m port = 80,443 action = cloudflare
A questo punto non rimane che mettere in white list gli indirizzi IP di Cloudflare. Per farlo inserire in wp-config.php la costante WP_FAIL2BAN_PROXIES riportando tutti gli indirizzi IP e le subnet da filtrare separati da virgola:
define('WP_FAIL2BAN_PROXIES','173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/12,172.64.0.0/13,131.0.72.0/22');
Salvare e riavviare Fail2ban. A questo punto non rimane che fare dei test di tentativi di login falliti per far scattare il ban. Se tutto andrà a buon fine, dopo qualche minuto verrà aggiunta una nuova regola sul firewall di Cloudflare:
A questo punto se si tenta di accedere di nuovo al sito web, Cloudflare ne impedirà l’accesso restituendo l’errore 1006 Access denied:
Sempre dalla pagina di Cloudflare sarà possibile monitorare tutti gli eventi scatenati dal firewall:
Come per tutte le altre regole è possibile monitorare l’operato di Fail2ban con il seguente comando:
sudo fail2ban-client status wordpress-hard Status for the jail: wordpress-hard |- Filter | |- Currently failed: 0 | |- Total failed: 0 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 0 |- Total banned: 0 `- Banned IP list:
Nel caso in cui si volesse togliere un ban ad un indirizzo IP specifico – ad esempio 97.57.139.142 – utilizzare il seguente comando:
sudo fail2ban-client set wordpress-hard unbanip 97.57.139.142
Se ti è piaciuta questa guida e vuoi essere aggiornato sulla pubblicazione delle nuove, iscriviti gratuitamente alla nostra newsletter! Non riceverai mail email di spam, le odiamo tanto quanto te!