WordPress è il CMS Open Source più utilizzato al Mondo, attualmente infatti circa il 42% dei siti Internet sarebbe animato da questa piattaforma per la gestione dei contenuti.
Un risultato di questo genere ha portato da una parte alla creazione di una vasta community di sviluppatori che si occupano di revisionare il codice sorgente del progetto rilasciando puntualmente correzioni di bug e di vulnerabilità, dall’altra ha però attirato l’attenzione di un numero sempre maggiore di cybercriminali sui milioni di installazioni di WordPress presenti in Rete.
Come tanti altri siti Web, anche quelli basati su questa soluzione sono quindi esposti a violazioni e attacchi in grado di causare interruzioni di servizio, sottrazioni di dati e iniezioni di script malevoli nelle pagine con possibili rischi anche per i visitatori.
WordPress viene attaccato più frequentemente rispetto ad altri CMS come per esempio Joomla, Drupal e Magento, questo non perché sia meno sicuro ma in quanto nettamente più diffuso. Trattandosi di un’applicazione molto semplice da installare e gestire, spesso viene scelto da utenti che non dispongono di competenze tecniche elevate in tema di Cybersecurity e, in alcune circostanze, questo aspetto potrebbe rappresentare un ulteriore elemento di rischio.
Esistono però delle contromisure non particolarmente complesse che chiunque è in grado di applicare per rendere più sicuro il proprio sito. Vediamo quali.
Scegliere un hosting ottimizzato per WordPress
Il primo passo da affrontare per garantire la sicurezza di un’installazione di WordPress è la scelta dell’hosting che deve essere quanto più possibile ottimizzato per questa piattaforma. Ciò significa innanzitutto che esso deve fornire preferibilmente un ambiente LAMP (Linux, Apache, MySQL e PHP) o LNMP (Linux, Nginx, MySQL e PHP) simile a quello utilizzato dagli sviluppatori del CMS per la sua implementazione.
L’hosting dovrebbe mettere a disposizione anche antivirus, antispam e firewall che permettano di bloccare l’azione di malware, l’invio massivo di posta indesiderata e gli attacchi mirati a violare il sistema ospitante.
È poi importante che il servizio supporti la creazione periodica di
backup automatici e che permetta la creazione manuale di copie di sicurezza quando se ne presenta la necessità. Nel caso in cui ci si voglia concentrare soprattutto sulla propria attività online, può essere una buona soluzione optare per un hosting gestito che si occupi anche di monitorare lo stato di salute di un’installazione e di aggiornare regolarmente e automaticamente il core di WordPress, i plugin e i temi installati, magari suggerendo le estensioni più affidabili dal punto di vista della sicurezza e impedendo o sconsigliando l’installazione di quelle che potrebbero presentare dei rischi.
Se si lavora come sviluppatori, o si vogliono effettuare delle modifiche importanti al proprio sito Web o al suo tema, potrebbe essere utile disporre di un
ambiente di staging, cioè di uno spazio isolato accessibile solo tramite credenziali, nel quale effettuare una copia integrale di un’installazione del CMS e sincronizzare quest’ultima con quella del sito pubblico soltanto dopo aver verificato il buon esito del cambiamento apportato.
È inoltre molto importante che l’hosting scelto abbia installato un
certificato SSL che permetta agli utenti di navigare tramite una connessione sicura sotto
HTTPS. Quest’ultimo, è un protocollo che consente di cifrare tutte le comunicazioni che avvengono tra browser e server, in tal modo si impedisce ad estranei di accedere ai dati veicolati. Se si gestisce un sito Web basato su WordPress e si desidera migrare da HTTP ad HTTPS è possibile fare riferimento a questa breve
guida.
Scelta dello username
Un aspetto molto spesso trascurato ma fondamentale per quanto riguarda la sicurezza riguarda la scelta dello username e della password per l’autenticazione al pannello di controllo di WordPress, soprattutto quando si parla dell’utente
amministratore.
A tal proposito è bene tenere conto del fatto che il nome di quest’ultimo deve essere definito in fase di installazione e non può essere modificato successivamente a differenza di quanto accade con il nickname che, però, non è un dato necessario per il login.
In realtà anche il nome utente dell’amministratore è un’informazione modificabile utilizzando degli appositi plugin, intervenendo sul database o creando un nuovo amministratore con il quale eliminare quello precedente e al quale riassegnare i contenuti da esso creati.
È però più pratico e sicuro scegliere da subito un nome che sia diverso da una soluzione facilmente intuibile come “Admin”, WordPress permette tra l’altro di utilizzare sia lettere maiuscole che minuscole per la sua definizione rendendone ancora più complessa l’identificazione.
Scegliere una password sicura
Per quanto riguarda invece la
password, posto che è sempre buona sceglierne una sufficientemente sicura già al momento dell’installazione, è altrettanto consigliabile aggiornarla regolarmente. Per far questo, dal pannello di controllo di WordPress è necessario cliccare sulla voce “Utenti” del menù laterale per poi cliccare sul collegamento “Modifica” in corrispondenza dell’utente su cui si desidera intervenire.
Si apre così una pagina in cui è presente la sezione “Gestione dell’account” che mette a disposizione il pulsante “Imposta nuova password”.
Di default il sistema genera automaticamente una password immediatamente utilizzabile e mette a disposizione uno strumenti in grado di misurarne l’efficacia.
Nel caso in cui si voglia personalizzare la password è importante scegliere delle stringhe più lunghe possibili formate da lettere maiuscole e minuscole, numeri e caratteri speciali (ad esempi “#” o “@”). La facilità di memorizzazione non è invece un buon criterio di scelta, soprattutto ora che i browser più utilizzati consentono di salvare le password in modo sicuro e di sincronizzarle tra più dispositivi.
Limitare i tentativi di login
Tra gli indizi che permettono di scoprire se un’installazione WordPress è sotto attacco vi sono sicuramente i tentativi di login ripetuti. Gli utenti malevoli infatti utilizzano spesso tecniche automatiche basate sulla
Brute Force che consistono nel tentativo di violare una piattaforma tramite credenziali di autenticazione sempre differenti fino a trovare quelle corrette.
Questo tipo di attacchi hanno anche l’effetto di pesare sulle prestazioni e le risorse di un sito Web perché creano traffico inutile, fortunatamente esistono però diversi plugin che impediscono questo tipo di attività concedendo soltanto un limitato numero di tentativi di autenticazione.
Tra i più utilizzati vi è per esempio
Loginizer che si installa come qualsiasi altra estensione dal pannello di amministrazione del CMS cliccando su “Plugin” e successivamente su “Aggiungi nuovo”. Fatto questo è sufficiente digitare Loginizer sul motore di ricerca dei plugin per poi cliccare su “Installa”, attendere la fine della procedura e selezionare “Attiva”.
Loginizer diviene così disponibile tra le estensioni installate e se ne possono personalizzare le impostazioni i tramite il collegamento chiamato “Settings”.
Le impostazioni di Loginizer contengono una sezione chiamata “Brute Force” tramite la quale è possibile indicare il numero di tentativi di login prima del blocco temporaneo di un utente (
lockout) e la durata del blocco stesso (ad esempio ¼ d’ora).
Si può impostare un limite al numero di
lockout prima che l’utente subisca un blocco più esteso e la durata di quest’ultimo (ad esempio per 24 ore). L'informazione relativa al numero di tentativi di login effettuati può essere conservata per un periodo predefinito per poi essere resettata e riportare il contatore a zero.
Loginizer permette inoltre di creare una
blacklist di indirizzi IP dai quali bloccare i tentativi di login e una
whitelist contenente gli IP autorizzati per l’autenticazione.
È necessario porre attenzione nel setup delle varie regole relative a Max Retries, Lockout Time, Max Lockouts e Extended Lockouts al fine di evitare di bloccare anche il proprio accesso.
Modificare l'URL della pagina di login
Un’installazione di WordPress standard prevede che il login per l'accesso al pannello di controllo debba essere effettuato tramite un URL specifico, ad esempio:
https://nome-sito.it/wp-login.php
In alternativa è possibile indicare al browser il percorso relativo alla directory che contiene i file dell’area di amministrazione:
https://nome-sito.it/wp-admin
Dato che per un utente malevolo è abbastanza semplice scoprire la tecnologia con la quale è stato realizzato un sito Web, trovare l’indirizzo per raggiungere la pagina “wp-login.php” può essere altrettanto facile. A tale scopo è sufficiente una breve analisi del codice HTML restituito in output o l’utilizzo degli strumenti che Chrome e Firefox dedicano agli sviluppatori.
Personalizzare l’indirizzo della propria pagina di login può quindi contribuire a rendere WordPress ancora più sicuro, per far questo è possibile utilizzare il file .htaccess che WordPress crea automaticamente in ambiente Linux al momento dell’installazione. Si tratta infatti di un documento contenente delle direttive che devono essere osservate dal Web engine, cioè l’applicazione (ad esempio Apache) che gestisce le richieste provenienti dai browser e fornisce delle risposte sulla base delle risorse presenti nel server.
Il file .htaccess viene generato nella
root del Web server, questo significa che accedendo tramite un client FTP allo spazio Web in cui è ospitato un sito lo si può trovare nella directory principale, quella che contiene tutti i file e le cartelle di un’installazione.
Prima di modificarlo è buona norma crearne una copia di backup, fatto questo lo si può editare e inserire una nuova direttiva. Se per esempio si volesse modificare il percorso alla pagina di login cambiando il nome della directory “wp-admin” in “pannello”, si potrebbe definire una direttiva come la seguente:
RewriteRule ^pannello/(.*) wp-admin/$1?%{QUERY_STRING} [L]
Prima di ricaricare l’.htaccess sul server si deve intervenire anche sul file di configurazione di WordPress, “wp-confing.php”, anch’esso presente nella root, e inserire al suo interno queste righe di codice con cui comunicare al CMS la nuova directory di amministrazione.
define('WP_ADMIN_DIR', 'pannello');
define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . WP_ADMIN_DIR);
Fatto questo l’ultimo passaggio prevede di editare il file “functions.php” (disponibile nella cartella “wp-includes” di Wordpress o del tema utilizzato) e di aggiungere in esso il codice seguente che permette a WordPress di riconoscere il nuovo URL come percorso per la pagina di login:
add_filter('site_url', 'wpadmin_filter', 10, 3);
function wpadmin_filter( $url, $path, $orig_scheme ) {
$old = array( "/(wp-admin)/");
$admin_dir = WP_ADMIN_DIR;
$new = array($admin_dir);
return preg_replace( $old, $new, $url, 1);
}
Una volta salvate tutte le modifiche effettuate si possono ricaricare i tre file nelle loro rispettive posizioni e verificarne il funzionamento. Lo stesso risultato si può ottenere anche utilizzando alcuni plugin, come per esempio
WPS Hide Login e
Protect Your Admin, ma la procedura descritta è sicuramente meno impattante per le prestazioni rispetto all’installazione di una nuova estensione.
Vale la pena menzionare che la modifica della URL della pagina di login potrebbe interferire con gli automatismi in uso da parte dei provider di servizi gestiti (come per esempio anche nel caso del servizio Wordpress Gestito di Aruba).
Database: modificare i nomi delle tabelle
Come è noto WordPress è un’applicazione Open Source, questo significa che il suo codice sorgente e la struttura del database MySQL ad esso associata sono accessibili liberamente da chiunque, anche per scopi commerciali o per attività di hacking.
I nomi delle tabelle di un database possono però diventare delle informazioni utili per chi volesse effettuare un attacco a carico di un sito Web ed è quindi consigliabile un intervento finalizzato a modificarli.
Conoscere i nomi delle tabelle di un database rappresenta un potenziale pericolo soltanto nel caso in cui un hacker riuscisse a sfruttare un'altra vulnerabilità, presente sul sito, che gli permetta di effettuare delle query sul database.
Nel caso specifico di WordPress non è necessario cambiare completamente i nomi delle tabelle, operazione che potrebbe rivelarsi particolarmente lunga e complessa, è invece sufficiente cambiarne il prefisso.
Di default quest’ultimo è “wp_”, ragion per cui la tabella che contiene i dati relativi agli articoli si chiama ad esempio “wp_posts”, quella dei commenti “wp_comments” e così via.
Si ipotizzi ora di voler utilizzare il nuovo prefisso “wpk5_”, per far questo (soltanto dopo aver effettuato un backup completo della propria installazione di WordPress) il primo passaggio da affrontare riguarda il file “wp-config.php”, di cui si è parlato nel capitolo precedente, che contiene anche la seguente riga di codice:
$table_prefix = 'wp_';
“$table_prefix” è il nome della variabile che conserva l'informazione relativa al prefisso utilizzato per i nomi delle tabelle, per utilizzare il valore “wpk5_” invece di “wp_” si deve quindi sostituire il primo con il secondo in questo modo:
$table_prefix = ' wpk5_';
Fatto questo è necessario rinominare manualmente le tabelle, tale procedura può essere effettuata lanciando tante istruzioni SQL basate sul comando RENAME quanti sono i prefissi da modificare o tramite un’interfaccia visuale come
PhpMyAdmin. Nel primo caso, per rinominare ad esempio la tabella “users” si deve inviare la seguente istruzione e poi procedere nello stesso modo per tutte le altre tabelle:
RENAME table 'wp_users' TO ' wpk5_users';
Nel secondo caso da PhpMyAdmin si deve cliccare invece sul nome del database desiderato e, una volta visualizzata la sua struttura, selezionare tutte le tabelle e, in corrispondenza del menu “Se selezionati” scegliere l’opzione “Sostituisci il prefisso della tabella”.
Quest'ultima permette di accedere ad un form dove sono presenti due campi in cui inserire il prefisso da sostituire con il suo sostituto:
Un click su “Continua” permette di concludere anche questa fase e di affrontare l’ultimo passaggio dell’operazione.
I campi “option_name” e ‘meta_key”, appartenenti rispettivamente alle tabelle ora chiamate “wpk5_options” e “wpk5_usermeta”, potrebbero contenere infatti dei riferimenti ai nomi precedenti delle tabelle, tali dati vanno dunque ricercati e corretti sostituendo il vecchio prefisso con il nuovo.
A questo scopo è possibile sfruttare il linguaggio SQL che mette a disposizione la clausola LIKE, una veloce ricerca di tutti i record che contengono la stringa “wp_” nel campo “option_name” della tabella “wpk5_options” può essere eseguita ad esempio lanciando la seguente istruzione:
SELECT * FROM 'wpk5_options' WHERE 'option_name' LIKE '%wp_%';
Anche in questo caso è opportuno sottolineare che la modifica dei nomi delle tabelle potrebbe interferire con gli automatismi in uso da parte dei fornitori di servizi gestiti come Wordpress Gestito di Aruba.
Disabilitare il Directory Indexing
Le cartelle in cui sono memorizzati i file di un sito Web funzionano esattamente come quelle create in un comune PC e, quando aperte tramite il browser, potrebbero mostrare il loro intero contenuto ammenoché la configurazione del server che le ospitano non lo impedisca.
Può quindi succedere che digitando l’URL di una determinata directory, ad esempio “
https://nome-sito.it/wp-content/uploads/” un qualsiasi utente possa visualizzare tutti i file che sono stati caricati al suo interno. Tale operazione è consentita dal
Directory Indexing, o
Directory Browsing, un’impostazione che in pratica espone pubblicamente il contenuto online di una cartella.
Per disabilitarla è necessario intervenire sul file .htaccess e inserire la seguente direttiva:
Options -Indexes
Fatto questo i file presenti in una directory non saranno più visibili da browser e un eventuale tentativo di aprirla darà luogo al cosiddetto
Errore 403 (
Forbidden - You don't have permission to access this resource), un codice di stato del Web server che si verifica quando quest’ultimo conosce il significato della richiesta inviata dal browser ma non può completarla.
Installare un plugin per la sicurezza
Soprattutto se non si dispone delle necessarie competenze in tema di sicurezza può essere una buona idea installare un plugin appositamente dedicato a questo aspetto.
Ricordando che è sempre consigliabile
scaricare esclusivamente estensioni presenti nella directory ufficiale di WordPress che siano state utilizzate da un buon numero di utenti, godano di buone recensioni e che vengano frequentemente aggiornate dagli sviluppatori (segno che il plugin è attivamente mantenuto), si può avere un’idea dell’offerta disponibile semplicemente seguendo il percorso “Plugin > Aggiungi nuovo” del pannello di controllo e digitando la keyword “Security” nel motore di ricerca dei plugin.
Tra le tante soluzioni proposte è possibile presentare l’esempio di
Wordfence Security che include un firewall e uno scanner anti malware contro tutte le minacce più note che generalmente insidiano un sito Web basato su WordPress. L’estensione viene inoltre aggiornata molto di frequente in modo da garantire sempre la massima copertura possibile.
Una volta installato e attivato, Wordfence Security permette di effettuare un’attività di monitoraggio in tempo reale del traffico di Rete, individuando i pacchetti di dati che potrebbe costituire un potenziale periodo.
Nello stesso tempo protegge le pagine dall’installazione di backdoor che potrebbero essere utilizzate per sottrarre dati o prendere il controllo di un sito, individua gli URL sospetti, protegge la pagina di login da attacchi basati sulla Brute Force e supporta l’autenticazione a 2 fattori, ricerca le vulnerabilità conosciute eventualmente presenti in un sito e verifica che quest’ultimo non sia stato blacklistato a causa di attività malevole.
Wordfence Security è anche in grado di riparare file danneggiati e di effettuare un confronto tra i file di un sito e quelli presenti nel repository ufficiale di WordPress per accertare l’integrità dei primi.
Chiaramente, dato che in alcuni casi l’installazione di un plugin aggiuntivo potrebbe determinare un calo di performance, primo di ricorrere a Wordfence Security o a qualsiasi altro plugin dello stesso tipo è buona norma verificare che l’hosting utilizzato non comprenda già delle soluzioni firewall e anti brute force con cui proteggere adeguatamente il proprio sito.