Come migliorare la sicurezza di un sito WordPress
  • Post last modified:18 Maggio 2020
  • Post category:WordPress
  • Post comments:0 Commenti

Introduzione

Quello che segue è un elenco di suggerimenti e attività che possono aiutare a migliorare la sicurezza di un sito web realizzato con WordPress. Alcuni suggerimenti sono generici ed applicabili a qualsiasi piattaforma, altri specifici per questo CMS.

Ho creato questa raccolta durante alcuni anni di esperienza, disavventure e lettura di tante fonti diverse. Non ho la pretesa di scrivere l’ennesima guida definitiva alla sicurezza ma ho pensato che fosse utile mettere “ordine” ai tanti appunti e condividerli. Il form dei commenti è a disposizione per segnalare errori, proporre modifiche e aggiunte, scambiare idee e pareri sull’argomento.

Come vedrete la lista è lunga. Per questo motivo ho deciso di dividerla in due parti, seppure contenute nello stesso articolo. La prima raccoglie concetti di base e attività generalmente più semplici. La seconda introduce argomenti più tecnici che richiedono maggiore cautela nella loro applicazione.

Potreste avere la sensazione che alcuni punti siano trattati in modo superficiale. Ed è proprio così. Ci sono argomenti che, per complessità, varietà di contesti e numero di soluzioni disponibili richiederebbero decisamente troppo spazio. Preferisco, se possibile, trattarli in futuro in articoli dedicati e più approfonditi.

Note importanti

L’applicazione di alcune informazioni riportate in questo articolo può causare malfunzionamenti al sito. Raccomando massima prudenza. Se possibile fate delle prove in area di test o assicuratevi prima di avere un backup completo del sito in produzione. Consiglio anche di documentare la situazione prima e dopo ogni modifica. Esclusi i danni gravi, sarà più semplice tornare indietro senza necessità di ripristinare completamente il sito dal backup.

Un altro suggerimento che posso dare, almeno per i punti trattati nella seconda parte, è di affidarsi ad una persona esperta se non si sa esattamente come agire. Chiedete a chi ha realizzato il vostro sito oppure cercate un professionista che vi supporti in queste attività.

<marketta>

Vorresti una mano per migliorare la sicurezza del tuo sito o ti interessa fare un’analisi per conoscere la situazione attuale? Visita la pagina Contatti e scrivimi per avere maggiori informazioni!

</marketta>

Per la trasparenza ci tengo a sottolineare che in questo articolo non ci sono link sponsorizzati o altre forme di promozione. Ho menzionato solo strumenti che ritengo utili e che ho provato personalmente.

Prima di chiudere questa noiosa introduzione vorrei sottolineare un aspetto importante: il processo di ottimizzazione della sicurezza non è un percorso chiaro e definito. Questo articolo rappresenta una traccia, non una soluzione. Non tutti i punti trattati possono essere applicati in qualsiasi contesto e non sempre l’effetto è quello sperato. E’ fondamentale iniziare con l’analisi della situazione di partenza per capire quali azioni intraprendere e successivamente monitorarne gli effetti. In sintesi, la sicurezza richiede tempo.

La sicurezza richiede riflessi pronti.
Photo by Tony R from FreeImages

Indice


Prima parte


Scelta dell’hosting

L’hosting è il “contenitore” che ospita il nostro sito e gli permette di funzionare. Per quanto possa sembrare semplice detta così, si tratta in realtà di un’infrastruttura fatta di tante componenti che devono essere configurate nel migliore dei modi per garantire velocità di esecuzione e sicurezza.

L’offerta di servizi di hosting è enorme e può essere difficile orientarsi. Da dove partire quindi? Se il vostro sito è costruito su WordPress, potete iniziare consultando la lista ufficiale degli hosting raccomandati. Utilizzare uno di questi fornitori non è ovviamente garanzia di sicurezza assoluta (del resto siamo solo al primo punto della lista), ma è un buon inizio e sapremo di avere alle spalle una struttura studiata per fornire anche un’adeguata protezione. Nulla vieta, naturalmente, di guardare ad altre aziende. Tuttavia è importante non badare solo al prezzo finale, ma consultare attentamente le caratteristiche e cercare opinioni in rete.

Aggiungo infine un dettaglio non strettamente legato alla sicurezza: la scelta dell’hosting deve essere basata anche sulle previsioni di crescita del sito, perché all’aumentare del traffico un servizio sottodimensionato sarebbe causa di rallentamenti o malfunzionamenti. Bisogna quindi trovare un compromesso tra caratteristiche minime e massime o una soluzione che possa “scalare” in base alle necessità. Ah, poi andrebbe considerata anche la qualità del supporto… ma sto divagando.

Impostare credenziali forti per tutti gli accessi

Qui scatta il “ma va??“. Lo so, è banale, ma non lo si ripete mai abbastanza: bisogna utilizzare credenziali difficili da scoprire. Con “credenziali” mi riferisco ai classici username e password.

Supponiamo di aver scelto e acquistato un servizio di hosting. A questo punto avremo già una serie di accessi ad aree riservate. Ad esempio:

  • il pannello di gestione dell’hosting
  • il pannello di gestione del database
  • la connessione FTP
  • una o più caselle di posta

E’ importante che tutti abbiano credenziali diverse e complesse: evitate parole di uso comune e dati che si possano facilmente reperire o indovinare.

Da questo punto di vista potrebbe aiutare lo stesso servizio di hosting, perché spesso propongono credenziali costituite da stringhe generate casualmente. Se invece devono essere create manualmente, prestate massima attenzione.

Generatore di password di un servizio di hosting.
Generatore di password di un servizio di hosting.

Per generare password forti potete affidarvi ad appositi servizi online. Ce ne sono tantissimi.

Quanto detto finora ci porta però ad un altro aspetto: la conservazione. Il classico post-it attaccato al monitor va bene per dare un tocco di colore alla postazione. Ma per una gestione più seria è bene utilizzare un password manager. Anche in questo caso, esistono molte alternative.

Che sia un servizio online o un software sul vostro computer, sceglietene uno e usatelo (è un ordine!). Io mi trovo bene con KeePass.

Forzare HTTPS

HTTPS è il protocollo che consente di instaurare connessioni protette tra gli utenti e il vostro sito. Se prima era d’obbligo solo quando di aveva a che fare con acquisti e sistemi di pagamento, oggi tutti i siti dovrebbero averlo. Seppure tecnicamente si possa ancora farne a meno, lo sconsiglio per diversi motivi.

Un certificato SSL, l’elemento necessario alla sicurezza della connessione, ormai ha costi irrisori o addirittura nulli. Molti servizi di hosting lo includono nella propria offerta e lo attivano di default o consentono di farlo con estrema semplicità. Esistono poi fornitori specializzati da cui è possibile acquistarne uno: in questo caso i prezzi variano in base alla tipologia di certificato ed al “livello di autorevolezza” che volete raggiungere (ad esempio, se volete che il nome della vostra azienda appaia nella barra del browser).

Bisogna poi considerare il problema della reputazione del sito: ormai tutti i più diffusi browser notificano all’utente quando un sito non è protetto con HTTPS e lo indicano come “non sicuro”. I motori di ricerca, Google in primis, hanno iniziato a penalizzare nei risultati i siti sprovvisti di certificato.

Il browser indica un sito non protetto con HTTPS.
Il browser indica un sito non protetto con HTTPS.

In linea generale, visitare un sito significa scambiare dati con esso: pensate a quando inserite le vostre credenziali per accedere ad un’area riservata o quando compilate un form di contatto. Non vorreste che le informazioni trasmesse fossero al riparo da estranei?

Come fare per attivare HTTPS? Il suggerimento è di partire sempre dall’hosting, verificare se include il certificato o può fornirlo come caratteristica aggiuntiva. Indipendentemente dal servizio, la prima cosa da fare è configurare il server affinchè supporti questo protocollo.

Se si crea un nuovo sito, è sufficiente installare WordPress usando l’indirizzo che inizia con “https://”; se invece si lavora su un sito esistente può essere sufficiente un plugin come Really Simple SSL.

Backup del sito

Il backup logora chi non ce l’ha.

Battute stupide a parte, avere una copia completa del sito ci consente di recuperarlo se si verificano problemi gravi. Nel caso di WordPress, “completo” significa l’intera cartella del sito e il database.

Un buon servizio di hosting può includere nel pacchetto almeno una copia quotidiana. In caso negativo o se, come me, preferite avere anche un altro livello di sicurezza, potete affidarvi ad uno dei tanti plugin dedicati a questo scopo.

Personalmente uso da qualche anno Duplicator Pro, che consente di pianificare liberamente i backup automatici e anche di inviarli ad uno storage esterno come Google Drive. Inoltre le copie prodotte possono essere ripristinate in ambienti diversi tramite un comodissimo processo guidato. Utile se volete trasferire il sito da un ambiente ad un altro senza dover prima installare una nuova copia di WordPress. Se volete provarlo esiste anche la versione gratuita che, seppure priva degli automatismi, consente l’utilizzo delle caratteristiche principali.

Alcune considerazioni sui backup:

  • un backup quotidiano può essere sufficiente in casi di aggiornamenti poco frequenti. Se il sito ha molto traffico e i contenuti variano spesso, è bene valutare la creazione di più copie in un giorno.
  • se possibile, spostare o copiare i backup in un posto diverso dal server su cui risiede il sito.
  • qualsiasi sia la destinazione, probabilmente lo spazio a disposizione non sarà infinito, per cui sarà necessario cancellare progressivamente i backup più vecchi. Tuttavia, maggiore è il numero delle copie conservate, maggiori sono le possibilità di andare indietro nel tempo (utile quando non ci si accorge immediatamente del problema).
  • può essere utile avere backup in più formati, ad esempio quello fornito dall’hosting e quello prodotto da un plugin.
  • di tanto in tanto, bisognerebbe ripristinare un backup in un’apposita area di test per verificare che la procedura funzioni.

Naturalmente, in base al contesto, ci possono essere altri fattori da considerare.

Utenti di WordPress

Partiamo dagli amministratori: di base, viene creato un account di questo tipo durante l’installazione di WordPress. Se necessario, se ne possono creare altri in un secondo momento. Considerata la loro importanza, bisogna prestare attenzione ad un paio di dettagli:

  • non usate come username dell’utente i termini “admin”, “administrator”, “amministratore” o il dominio del sito. Se ad esempio l’indirizzo è www.mariorossi.it, non usate “mariorossi”. Questi sono, almeno nella mia esperienza diretta, i termini più utilizzati nei tentativi di accesso.
  • per la password fate riferimento alle osservazioni fatte al paragrafo Impostare credenziali forti per tutti gli accessi. Magari approfittate delle password complesse proposte da WordPress quando si crea un nuovo utente.

Per quanto riguarda gli utenti in generale:

  • eliminate sempre gli utenti non necessari. Se create un account per un’altra persona, verificate periodicamente che questo sia realmente in uso. Se per qualche ragione non potete eliminarlo, cambiate la password. Verificate inoltre che non siano presenti account “fake” creati da temi e plugin.
  • quando create un account per un’altra persona, verificate attentamente quali attività deve svolgere sul sito. Ad esempio, se deve gestire i contenuti, il ruolo Editor è sufficiente e non serve che sia Administrator. In sostanza, assegnate sempre il ruolo “più basso” che consente di svolgere il lavoro.

Installazione aggiornamenti

Il mondo di WordPress si compone fondamentalmente di tre elementi:

  • il core (lo stesso WordPress)
  • i plugin
  • i temi

Tutti e tre sono in costante evoluzione: vengono introdotte nuove funzionalità, vengono corretti errori, vengono chiuse le falle che mettono a rischio la sicurezza.

Notifiche di aggiornamento plugin in WordPress.
Notifiche di aggiornamento plugin in WordPress.

Sopratutto per quest’ultima casistica, è fondamentale installare gli aggiornamenti che vengono periodicamente rilasciati. Un sito non aggiornato ha maggiori possibilità di essere compromesso e considerando i tanti elementi che lo costituiscono (pensate a quanti plugin si installano in genere), potete intuire quanti potenziali punti deboli ci possano essere.

Ci sono varie opzioni per automatizzare il processo:

  • alcuni servizi di hosting comprendono l’installazione di WordPress e una funzionalità di installazione automatica di tutti gli aggiornamenti disponibili
  • WordPress aggiorna se stesso (se non diversamente specificato) e consente, attraverso opzioni da impostare via codice, di aggiornare anche plugin e temi.
  • esistono servizi di terze parti, anche a pagamento, che consentono di gestire e aggiornare più siti WordPress da un’unica console esterna.

C’è poi la via completamente manuale, che noi paranoici e insicuri preferiamo senza ombra di dubbio.

Perchè bisogna sempre tenere conto di una cosa: ogni aggiornamento è potenziale fonte di problemi. Può succedere di tutto, da piccoli difetti visuali fino alla morte del sito.

Se preferite la via più lunga, ma anche più consapevole, ecco i miei suggerimenti:

  • prima di iniziare, fate un backup completo del sito.
  • per ogni notifica di aggiornamento, tenetevi forte, leggete il changelog! E’ noioso? Si. Richiede tempo? Certo. E non dovete leggere solo le modifiche dell’ultima versione, ma tutte quelle presenti dalla versione che avete attualmente fino all’ultima disponibile.
  • vi dirò di più: se potete, date un’occhiata alla prima pagina del forum di supporto di ogni plugin da aggiornare. Mi è capitato più di una volta di scoprire che l’ultima versione aveva fatto danni qua e là. In questi casi meglio aspettare.
  • iniziate con l’aggiornamento di WordPress, poi passate ai plugin e ai temi.
  • se usate un plugin per il miglioramento delle performance, al termine degli aggiornamenti pulite la cache.
  • al termine, aprite il sito in una finestra anonima del browser e fate un controllo generale.
  • ripetete il ciclo almeno una volta al mese, se prima o dopo i pasti decidete voi in base al livello di ansia che vi provoca.

Eliminare plugin e temi non utilizzati

Il titolo dice tutto: liberatevi di ciò che non utilizzate (disattivare non basta). Ciò che non c’è non costituisce un potenziale rischio di sicurezza e non rallenta il caricamento del sito (quindi potreste migliorare anche le performance).

Unico appunto: nel caso dei temi, conservatene sempre uno da usare in casi di emergenza. Va benissimo uno di quelli standard di WordPress.

Installare un plugin per la sicurezza

Esistono molti plugin dedicati alla sicurezza, generalmente in una versione gratuita e una più accessoriata a pagamento.

Ecco un elenco delle funzioni che più o meno tutti forniscono:

  • WAF (Web Application Firewall): tutti gli accessi al sito vengono analizzati per capire se si tratta di normali visitatori o tentativi di intrusione. Il traffico malevolo viene bloccato per impedire ulteriori contatti.
  • limiti di accesso: è possibile impostare regole per cui, ad esempio, un utente che fallisce troppi tentativi di login viene bloccato per un certo tempo. Utilissimo per proteggersi dai bot che cercano di accedere all’amministrazione del sito.
  • scansione dei file: tutti i file del sito sono periodicamente controllati alla ricerca di eventuale malware.
  • notifiche: invio di email per avvisare gli amministratori quando si verificano eventi rilevanti.
  • two-factor authentication: attivazione dell’autenticazione a due fattori per rendere più sicuro l’accesso alla dashboard.

Queste e tante altre caratteristiche rendono a mio parere fondamentale l’installazione di un plugin di questo tipo. Personalmente utilizzo la versione gratuita di Wordfence, che offre un’ottima possibilità di configurazione grazie al gran numero di impostazioni disponibili. Lo troverete menzionato più volte nell’articolo perché rappresenta una possibile soluzione in diverse circostanze.

Scegliere le giuste fonti

Prestate sempre attenzione alla fonte da cui scaricate un tema o un plugin.

Per le versioni gratuite fate riferimento alle rispettive directory di WordPress (temi | plugin). Controllate sempre la data di ultimo aggiornamento e la versione di WordPress supportata; date anche un’occhiata al forum di supporto. Cercate di capire se un plugin è regolarmente mantenuto.

Per le versioni a pagamento cercate il sito del produttore oppure uno store affidabile. Mi viene in mente Envato, ma ce ne sono anche altri.

Lasciate stare versioni “modificate” o di “dubbia provenienza”. Seppure l’idea di risparmiare dei soldi sia allettante, considerate che queste versioni potrebbero contenere malware. Inoltre è probabile che non possiate usufruire degli aggiornamenti automatici, mettendo ulteriormente a rischio la sicurezza del sito. Tralascio poi la questione legalità, che è scontata.

Disattivare o proteggere i commenti

Se nessuna sezione del sito prevede questa forma di partecipazione degli utenti, è opportuno disabilitare i commenti. Il classico form presente in genere in fondo alla pagina può essere bersaglio di bot che provano a inondarvi di spam.

Ci sono diversi modi per disattivare i commenti. Per non dilungarmi inutilmente, vi segnalo quest’ottima guida: How to Completely Disable Comments in WordPress.

Se invece volete lasciare la possibilità di commentare, non potete fare a meno di una sistema di protezione dallo spam. Lo stesso articolo suggerisce alcune alternative.

Aggiungere un captcha ai form

Anche il più semplice form di contatto dovrebbe essere protetto per bloccare spam e tentativi di intrusione. I più comuni plugin per la costruzione di form consentono di integrare facilmente Google reCaptcha inserendo le chiavi generate dal servizio. Per istruzioni specifiche fate riferimento alla documentazione del plugin che state utilizzando.

Anche il form di login di WordPress può beneficiare di questo metodo di protezione. Se utilizzate Wordfence avrete la possibilità di integrare reCaptcha in modo semplice dalla sezione “Login Security” delle impostazioni.

Cambiare l’indirizzo di amministrazione

Il discorso vale ovviamente per tutti i CMS più comuni, non solo per WordPress: l’indirizzo di amministrazione è documentato, quindi chi vuole sa esattamente dove mirare per “bombardare” il form di accesso.

Esiste tuttavia la possibilità di modificare il classico /wp-admin con un nome a nostra scelta. Per farlo è sufficiente installare il plugin WPS Hide Login.

Dopo l’installazione troverete una nuova opzione nelle impostazioni generali del sito, in cui digitare l’indirizzo dell’area amministrativa che andrà a sostituire quello standard.

Le impostazioni del plugin WPS Hide Login.
Le impostazioni del plugin WPS Hide Login.

Ovviamente fate attenzione a non dimenticare il valore impostato. Se dovesse succedere, sarà necessario disabilitare il plugin rinominando la sua cartella via FTP.

Nascondere la versione di WordPress

Per sapere se un sito è stato realizzato con WordPress basta poco. Spesso questa informazione è semplicemente riportata nel footer (il classico “powered by WordPress”), oppure è facilmente reperibile controllando il codice HTML di una qualunque pagina. La cosa più immediata da cercare è il meta tag “generator”, che riporta lo strumento utilizzato per creare il sito.

<meta name="generator" content="WordPress 5.3.2" />

Ci sono naturalmente altri elementi che evidenziano questo aspetto, tuttavia il problema principale è la visualizzazione del numero di versione.

Con questo dettaglio, un eventuale utente malintenzionato può risalire alle vulnerabilità presenti nella versione in uso ed utilizzarle per cercare di compromettere il sito.

Per rendere quindi un po’ più difficile la vita ai cattivi, è un buona idea nascondere questo numero, non solo nel tag menzionato, ma anche in tutti gli altri punti del codice in cui compare.

Come fare? Il suggerimento è di verificare innanzitutto che il plugin per la security che state utilizzando (ne avete uno, vero?) possegga già questa funzionalità. In Wordfence è disponibile l’opzione “Hide WordPress version”.

In alternativa esistono altri plugin dedicati a questo scopo, ad esempio Meta Generator and Version Info Remover.

Bisogna tuttavia tenere presente una cosa: nascondere la versione non impedisce di sapere che un sito è fatto in WordPress e non è un vero e proprio metodo di protezione. L’obiettivo è semplicemente quello di ridurre la quantità di informazioni sensibili divulgate.


Seconda parte


Usare un prefisso tabella univoco

Il prefisso tabella è la stringa anteposta ai nomi delle tabelle presenti nel database di WordPress, e da questi separata con un “_” (underscore). L’obiettivo è consentire l’utilizzo di un unico database per più installazioni di WordPress, ognuna con il proprio prefisso. Tuttavia, in fase di installazione, il CMS propone sempre il prefisso wp_ con il risultato, se non modificato, di sapere esattamente il nome completo di tutte le tabelle di default.

Questo dettaglio viene usato negli attacchi di tipo SQL Injection, quindi a prescindere dal numero di istanze WordPress che create su un singolo database, è utile impostare un prefisso univoco.

Nel caso di un nuovo sito, è facilmente modificabile durante il wizard di installazione di WordPress.

Per un sito esistente la questione è più delicata e ne ho parlato in questo post: Modificare il prefisso tabella in WordPress.

Disattivare gli editor di file integrati in WordPress

Una funzionalità di cui ho sempre faticato a capire il senso, è l’editor presente nella dashboard che consente di modificare direttamente i file dei temi e dei plugin.

Come aprire l'editor del tema in WordPress.
Come aprire l’editor del tema in WordPress.
Come aprire l'editor del plugin in WordPress.
Come aprire l’editor del plugin in WordPress.

Oltre ad essere assai scomodo da utilizzare per chi dovesse scrivere o modificare del codice, mette a rischio l’intero sito consentendo, di fatto, di introdurre errori o codice malevolo a chiunque sia in possesso delle credenziali di un account admin o riesca comunque ad ottenere l’accesso. A prova di ciò, WordPress stesso cerca di dissuadere l’utente che dovesse accedere all’editor mostrando un messaggio di avvertimento.

Per disattivare questa inutile caratteristica, è sufficiente aggiungere al file wp-config.php la riga seguente prima della chiusura della zona modificabile:

define( 'DISALLOW_FILE_EDIT', false );

/* That's all, stop editing! Happy publishing. */

Come risultato, verranno eliminate dal menu della dashboard le voci che consentono l’accesso agli editor.

Nascondere gli errori standard nella pagina di login

Sempre nell’ottica di ridurre la quantità di informazioni rivelate, possiamo fare in modo che il form di login non consenta di capire quando un determinato username esiste realmente.

Di default infatti, se il login fallisce, WordPress può comunicarci che:

  • il nome utente è sconosciuto (quindi non esiste, inutile continuare a provare).
  • la password per il nome utente inserito è errata (quindi l’utente esiste e può essere oggetto di un attacco brute force).
WordPress indica che l'utente inserito non esiste.
WordPress indica che l’utente inserito non esiste.
WordPress rivela che l'utente esiste anche se la password è errata.
WordPress rivela che l’utente esiste anche se la password è errata.

Per modificare questi messaggi con uno più generico, è possibile inserire questo codice nel file function.php del tema (meglio se child):

/**
 * Prevent showing default login errors
 */
function hide_login_errors() {
	return 'Tentativo di accesso fallito.';
}
add_filter( 'login_errors', 'hide_login_errors' );

Prima di utilizzare questo metodo, verificate se il plugin per la sicurezza che utilizzate comprende un’opzione dedicata a questo scopo, come accade in Wordfence con la voce “Don’t let WordPress reveal valid users in login errors”.

Modificare le chiavi di autenticazione

Nel file wp-config.php è contenuta una sezione denominata “Authentication Unique Keys and Salts”, costituita da una serie di costanti PHP valorizzate con lunghe stringhe generate in modo casuale.

Le chiavi di autenticazione nella configurazione di WordPress.
Le chiavi di autenticazione nella configurazione di WordPress.

Queste stringhe sono utilizzate per crittografare le informazioni di sessione generate in fase di login dell’utente e salvate nei cookies.

Le chiavi di autenticazione, se non impostate manualmente, vengono generate in autonomia dal setup di WordPress. Creando un nuovo sito, quindi, non è necessario preoccuparsene.

D’altra parte, la loro modifica su un sito esistente ha un impatto importante: invalida tutte le sessioni esistenti e costringe tutti gli utenti ad effettuare un nuovo login.

In caso di accessi sospetti o semplicemente come attività preventiva periodica, è possibile modificare queste chiavi utilizzando lo strumento di generazione ufficiale. Accedendo a questa pagina, e ad ogni refresh della stessa, viene fornito un frammento di codice che si può copiare e incollare al posto di quello presente nel file wp-config.php. Questa modifica ha effetto immediato e non richiede altre operazioni.

Disattivare la lista utenti nelle REST-API

Nelle REST-API di WordPress è presente un endpoint che restituisce una lista di tutti gli utenti che sono autori di almeno un contenuto (articolo, pagina, etc…).

E’ possibile verificarlo aggiungendo questa stringa dopo l’indirizzo del sito: /wp-json/wp/v2/users.

Ciò significa che, anche in un sito appena creato, è possibile ottenere lo username dell’utente amministratore.

Le REST-API di WordPress rivelano i nomi degli utenti.
Le REST-API di WordPress rivelano i nomi degli utenti.

Per evitare di rivelare questa informazione è possibile scegliere due strade:

  • richiedere l’autenticazione per utilizzare tutte le REST-API aggiungendo il codice presente nella documentazione ufficiale.
  • inibire solo la visualizzazione degli utenti con un plugin per la sicurezza. Wordfence ha un’opzione dedicata (“Prevent discovery of usernames through…”), ma anche altri plugin dovrebbero metterla a disposizione.

Attività avanzate sull’hosting

Come già detto, l’hosting contribuisce alla sicurezza generale del sito. Servizi pensati con particolare attenzione a questo argomento, sono dotati di sistemi di protezione che bloccano il traffico malevolo prima che raggiunga il sito.

Da parte nostra, tuttavia, è una buona idea prestare attenzione ad alcuni dettagli ed eventualmente porre rimedio o chiedere al supporto tecnico:

  • usare una versione aggiornata di PHP
  • verificare i permessi di file e cartelle (che dovrebbero essere rispettivamente 644 e 755)
  • disabilitare la visualizzazione degli errori di PHP
  • nascondere la versione di PHP e del web server

Le modalità di implementazione variano ovviamente in base ai servizi utilizzati, ma in genere prevedono l’intervento sul pannello di gestione dell’hosting o l’inserimento di opportune direttive nel file .htaccess (se il web server è Apache).

Header HTTP

Aggiungendo opportuni header in risposta alle chiamate HTTP possiamo dire al browser come deve comportarsi in merito ad alcuni aspetti di sicurezza.

Elenco di seguito alcuni degli header più comuni. Utilizzando Apache è sufficiente aggiungere le righe al file .htaccess. Nei commenti ho inserito i link alla documentazione, qualora vogliate approfondire.

# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
Header set X-Frame-Options SAMEORIGIN
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
Header set X-XSS-Protection "1; mode=block"
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
Header set X-Content-Type-Options "nosniff"

Bloccare l’esecuzione di file PHP nella cartella Uploads

La cartella wp-content/uploads non è pensata per contenere file PHP, per cui possiamo disattivare l’esecuzione di codice nel caso in cui qualcuno riuscisse a caricare degli script in questa cartella.

Se utilizzate Wordfence esiste un’opzione dedicata (“Disable Code Execution for Uploads directory”), per altri plugin di sicurezza vi suggerisco di verificare la documentazione.

In alternativa, è sufficiente creare un nuovo file .htaccess nella cartella wp-content/uploads e inserire queste righe:

<files *.php>
	deny from all
</files>

Bloccare l’accesso a file sensibili

Alcuni file presenti nella root di WordPress possono divulgare informazioni sensibili e per questo è utile impedirne l’accesso inserendo nel file .htaccess le seguenti righe:

<files .htaccess>
	Order allow,deny
	Deny from all
</files>
<files wp-config.php>
	Order allow,deny
	Deny from all
</files>
<files readme.html>
	Order allow,deny
	Deny from all
</files>
<files license.txt>
	Order allow,deny
	Deny from all
</files>
<files licenza.html>
	Order allow,deny
	Deny from all
</files>

Nel caso specifico stiamo bloccando l’accesso a cinque file. Potete ridurre la lista o estenderla aggiungendo nuovi blocchi <files>...</files>.

Per quanto riguarda i file readme e license nulla vieta di eliminarli, ma tenete presente che gli aggiornamenti di WordPress possono crearli nuovamente. Impedendo l’accesso con questo sistema, non dovrete ricordarvi ogni volta di verificarne la presenza.

Bloccare XML-RPC

Il file xmlrpc.php presente nella root del sito costituisce una “interfaccia” utilizzabile per comunicare con WordPress dall’esterno (una sorta di API). Serve per le funzioni pingbacks and trackbacks, ma può anche essere utilizzato da app mobile e plugin (ad esempio Jetpack).

Prima di impedirne l’accesso, bisogna accertarsi che non sia necessario per il corretto funzionamento del sito. Per attivare il blocco, inserire queste righe nel file .htaccess:

<files xmlrpc.php>
	Order allow,deny
	Deny from all
</files>

Se si desidera consentire l’accesso da indirizzi IP conosciuti, è possibile modificare il codice aggiungendo una riga Allow from per ciascun IP:

<files xmlrpc.php>
	Order allow,deny
	Deny from all
	Allow from xxx.xxx.xxx.xxx
</files>

Come detto in altre occasioni, verificate se il plugin per la sicurezza che utilizzate propone una funzionalità simile.

Two-Factor Authentication

Un sistema per rafforzare ulteriormente la procedura di login consiste nell’aggiungere un secondo elemento, oltre le normali credenziali, per poter effettuare l’autenticazione. Solitamente si configura un dispositivo fisico (uno smartphone) affinché generi un codice temporaneo da inserire dopo username e password. Esattamente ciò che accade per qualsiasi accesso bancario.

Il login di WordPress protetto con la Two-Factor Authentication.
Il login di WordPress protetto con la Two-Factor Authentication.

Su WordPress esistono diversi plugin che consentono di implementare la “2FA”. Personalmente ho provato con successo la funzionalità inclusa in Wordfence, che potete trovare anche come plugin separato chiamato Wordfence Login Security. Ma esistono numerose alternative.

Anche per quanto riguarda la generazione dei codici di autenticazione su dispositivo fisico esistono diverse app, sia su Android che iOS. Su Android ho trovato ottima FreeOTP+, gratuita e facilissima da usare.

Considerata la relativa facilità di configurazione generale e il notevole apporto alla sicurezza del sito, suggerisco caldamente di valutare l’attivazione di questo sistema.


Strumenti di analisi

In questo paragrafo extra ho raccolto una lista di strumenti che possono essere utili per verificare e monitorare alcuni aspetti della sicurezza di un sito.

  • log del server: possono essere fondamentali per rilevare attività anomale. Controllate sempre il log degli accessi e quello degli errori del web server e il log degli errori di PHP. In base al servizio di hosting possono essere accessibili in modi diversi: pannello di amministrazione, SSH, FTP.
  • log del plugin di sicurezza: qualsiasi plugin usiate, vi fornirà sicuramente molte informazioni sullo stato del sito e delle richieste che riceve. Controllate bene tutte le informazioni che vi fornisce nella dashboard ma anche nelle email di notifica.
  • malware scanner esterni: si tratta di servizi che effettuano una scansione dei siti alla ricerca di malware e altre vulnerabilità. Due tra i più diffusi sono Sucuri e Quttera.
  • MXToolbox – Blacklists: se un sito è stato compromesso e sta generando traffico malevolo potrebbe essere segnalato in una o più blacklist. Per verificare inserite il dominio di un sito in questo servizio.
  • Google – Rapporto sulla trasparenza: in modo simile alle blacklist, un sito compromesso può essere identificato e penalizzato anche da Google. Qui potete controllare se il vostro sito è stato segnalato.
  • verifica uptime: periodi di downtime possono indicare la presenza di un problema interno o picchi di traffico che saturano le risorse del server. Verificate che il sito sia sempre accessibile utilizzando un servizio esterno che effettua richieste periodiche. Un esempio è UptimeRobot, di cui ho parlato in questo post.

Conclusioni

Queste poche righe sono dedicate agli eroi che hanno letto fin qui. Datevi una pacca sulla spalla (se ne avete ancora la forza).

Vittoria!
Photo by Jose Bernalte from FreeImages

Seppure ampiamente migliorabile, spero che questa lunga lista abbia trasmesso il messaggio che lavorare sulla sicurezza di un sito è un processo necessario, lungo e mai banale. Che non ci sono click magici che risolvono i problemi. Spero anche di aver dato qualche indicazione utile per orientarsi nell’enorme quantità di soluzioni disponibili.

Come detto all’inizio non c’è nessuna presunzione di completezza e probabilmente ci saranno modifiche e integrazioni future. So già di aver lasciato qualcosa lungo la strada.

A voi i commenti.

Lascia un commento