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

Installazione e configurazione di WP Fail2ban

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:

  • Login fallito
  • Tentativo di login con username admin
  • Spam nei commenti
  • Enumerazione utenti

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.

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.

Configurazione di 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

WP Fail2ban e Cloudflare

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 = miaemail@gmail.com

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:

Monitoraggio

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!

Condividi su:
Tag: Wordpress

Articoli pubblicati di recente

Come avere tanti Mi Piace su Facebook

Come aumentare i Mi Piace su Facebook? È uno dei bisogni primari di chi si…

15 Marzo 2020

Facebook Pixel: cos’è e come crearne uno

L'utilizzo del Pixel di Facebook è fondamentale per l'ottimizzazione di una campagna pubblicitaria Facebook ma…

17 Febbraio 2020

Social network più famosi: lista aggiornata al 2024

Quali sono i social network più famosi? Ormai i social network a disposizione del pubblico…

28 Gennaio 2020

Google BERT update: tutto quello che c’è da sapere

Google BERT è l'algoritmo di Google entrato in funzione il 25 Ottobre del 2019. A…

24 Gennaio 2020

Analisi SWOT: come si fa ed esempio pratico

L'analisi SWOT è parte integrante e importantissima di un piano marketing efficace. Grazie a questo…

22 Gennaio 2020

Come apparire su Google Maps

Apparire su Google Maps è estremamente importante per un'attività locale. Consente non solo di ottenere…

2 Gennaio 2020