Diventa Autore per CoreTech | Scopri di più





Wordpress Security

22/06/17 Riccardo Gallazzi Blog

×Non sei ancora nostro cliente RocketWeb? Diventa Partner CoreTech e visita il nostro configuratore prezzi

Uno dei compiti più importanti nella gestione di un sito WordPress è senz’altro la manutenzione della sicurezza del sistema e questa non può essere fatta agevolmente se non si dispongono delle tecnologie giuste, efficienti e, soprattutto, comode da utilizzare con pochi click, come il WordPress Toolkit di Plesk.

 

Secondo W3techs, WordPress è usato dal 28,1% dei siti Internet esistenti, rendendolo il bersaglio principale degli hacker.

In questo articolo vedremo delle best practices che garantiscono un buon livello di sicurezza e alcune delle migliori soluzioni presenti in rete; naturalmente non c’è la certezza di essere protetti al 100%, per cui la prima cosa a cui pensare è un sistema di backup affidabile e collaudato.

Soluzioni di backup

Un buon backup rappresenta la classica ancora di salvezza in diversi casi, quindi è necessario pianificare una politica ben strutturata e soprattutto automatizzata che conservi copie del database e dei file (i due macro-elementi che compongono un sito WordPress) salvate con una certa cadenza. I backup si possono salvare in Cloud presso uno storage provider o sul sito (non nella root del sito) per essere scaricati in seguito. La frequenza di backup va concordata con la frequenza di aggiornamento del sito.

Il backup può essere eseguito tramite plugin dedicato, come Duplicator, VaultPress, BackupBuddy o UpDraft, oppure tramite la funzione apposita (se disponibile) fornita dal vostro hosting provider, come ad esempio offre CoreTech con la soluzione RocketWeb Hosting: la funzione è molto comoda ed intuitiva per programmare i backup automatici. È importante testare i backup: un backup non funzionante è perfettamente inutile.

Gestione temi e plugin e aggiornamenti

Come regola aurea, usate solo temi e plugin provenienti da sviluppatori affidabili e di competenza comprovata. Aggiornate appena gli update sono disponibili, ma non prima di aver eseguito un backup: alcuni aggiornamenti possono causare problemi al corretto funzionamento del sito.

Anche il sistema deve essere aggiornato non appena possibile: con Plesk ad esempio, è possibile utilizzare un toolkit per la gestione delle installazioni Wordpress che controlla lo stato degli update e li esegue quando sono disponibili, senza dover necessariamente accedere ad ogni singolo sito. Una guida all’aggiornamento di Wordpress tramite il toolkit disponibile in Plesk è presente a questo indirizzo.

Consigliamo l’adozione di Sucuri Scanner di Sucuri, la rinomata azienda di web security. Questo plugin gratuito offre funzioni di logging avanzate, monitoring integrità file, scan malware e un Web Application Firewall (WAF). Questa funzione, l’unica a pagamento, blocca tutto il traffico dannoso prima che raggiunga il sito e possa far danni. Inoltre il WAF include funzioni di pulizia malware e rimozione sito da blacklist, molto utili in seguito ad un’infezione.

Un WAF alternativo è CloudFlare.

Gestione credenziali

Le credenziali sono costituite da una coppia di username e password, ed entrambi gli elementi vanno curati in modo opportuno.

Uno dei modi più usati dagli hacker, e più redditizi, per accedere ad un sito WordPress è tramite tentativi di login brute-force: degli script automatizzati scelgono da degli elenchi di parole comuni e password più usate (questo articolo di The Guardian indica ‘123456’, ‘password’ e ‘12345678’ come password più utilizzate) e tentano di accedere tramite combinazioni di queste.

Quindi occorre generare e conservare password sufficientemente complesse (almeno 16 caratteri alfanumerici e simboli), meglio se con un gestore di password come KeePass o LastPass.

 

Per garantire una maggiore sicurezza, è possibile sfruttare il plugin WP Security Question che aggiunge una domanda di sicurezza (ovviamente configurabile) alla maschera di login, recupero password e registrazione. In questo modo l’utente deve essere a conoscenza della risposta che può impostare autonomamente all’interno di WordPress.

Sistemi di autenticazione a due fattori (2-Factor Authentication, 2FA) da prendere in considerazione sono Authy, Two Factor Authentication, Google Authenticator – Two Factor Authentication (2FA) e Google Authenticator.

Utente “admin”

WordPress di default crea un utente chiamato “admin” con i permessi di amministratore, e dal momento che l’informazione è nota anche agli hacker (che quindi conoscono metà delle credenziali e sono facilitati nei tentativi di accesso brute-force), pertanto va eliminato, ma prima occorre creare un utente con permessi amministrativi con il quale accedere al sito per gestirlo (Users > Add New e selezionare Administrator nel campo Role).
Oppure si può ottenere lo stesso risultato con il plugin Username Changer.

Protezione pagina di login

È possibile proteggere la pagina di login tramite password con un’ulteriore maschera di accesso con nome utente e password definibili a piacere dall’utente.

Create un file di testo chiamato .htpasswd ed incollate la stringa, contenente nome utente in chiaro e password cifrata, che verrà restituita seguendo le indicazioni contenute a questo indirizzo.

Il file va posizionato nel livello immediatamente superiore alla directory root del sito per prevenire degli accessi non autorizzati.

Poi modificate il file .htaccess contenuto nella cartella /wp-admin ed aggiungete queste righe di codice:

 

AuthUserFile /percorso/.htpasswd

AuthType Basic

AuthName "Accesso consentito solo agli Amministratori"

Require user UtenteCreato

 

Con RocketWeb Hosting, grazie all’azione di Plesk, è possibile ottenere lo stesso risultato in un modo più comodo e veloce, come descritto in questa guida

Tuttavia alcuni plugin potrebbero presentare dei problemi in virtù della modifica appena fatta. Il problema si risolve modificando il file .htaccess contenuto nella cartella /wp-admin (e non quello posto nella root del sito) aggiungendo queste righe di codice:

 

 

Order allow,deny

Allow from all

Satisfy any

 

 

Limitazione accesso alla pagina di login

È anche possibile limitare l’accesso alla pagina di login solo a certi indirizzi IP.

Se eseguite la login sempre dallo stesso indirizzo IP (quindi lavorate con un IP statico), potete modificare il file .htaccess posizionato nella root del sito aggiungendo queste righe che consentono l’accesso solo dall’indirizzo indicato. Attenzione: se il vostro IP dovesse cambiare, non potrete più accedere al vostro sito. Occorre collegarsi tramite FTP, scaricare e modificare il file.

 

 

RewriteEngine on

RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]

RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$

RewriteCond %{REMOTE_ADDR} !^INDIRIZZO-IP$

RewriteRule ^(.*)$ - [R=403,L]

 

 

Se si usa un servizio DDNS (Dynamic DNS) che associa il proprio indirizzo IP dinamico ad un indirizzo web, allora questo è il codice da utilizzare:

 

 

RewriteEngine on

RewriteCond %{REQUEST_METHOD} POST

RewriteCond %{HTTP_REFERER} !^http://(.*)?INDIRIZZO-DDNS [NC]

RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]

RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$

RewriteRule ^(.*)$ - [F]

 

 

Limitazione tentativi di login

WordPress permette agli utenti di inserire la password un numero illimitato di volte, esponendo il sistema ad attacchi brute-force.

 

Di conseguenza è buona norma limitare il numero di login che un utente può tentare per periodo di tempo. Ad esempio un utente può provare 5 volte ad inserire la password, e al quinto errore il sistema blocca il suo indirizzo IP per un certo periodo (5 minuti, 1 ora, etc..).

Un sistema efficace per limitare il numero di tentativi di login si ottiene con il plugin Login Lockdown o WP Limit Login Attempts.

Gestione database

Di norma è possibile agire con due azioni mirate sul database che ne incrementano la sicurezza.

Il consiglio è quello di utilizzare il WordPress Toolkit messo a disposizione da Plesk in modo da automatizzare le procedure che altrimenti diventerebbero troppo complesse da seguire.

 

Infatti, nel piano Hosting RocketWeb Sun, grazie al plug-in di WordPress Toolkit, è possibile gestire con facilità e con pochi click tutte le operazioni di messa in sicurezza del vostro sito.

Per chi invece desidera un approfondimento sulla gestione manuale del database, di seguito viene indicata la procedura.

Per prima cosa è buona norma cambiare il prefisso delle tabelle, che di default è wp_. Questa informazione è nota agli hacker e di conseguenza la struttura dell’intero database.
Aprite il file wp-config.php ed cercate la linea con $table_prefix  = 'wp_';.

Sostituite ‘wp_’ con una stringa a piacere, ad esempio ‘y234ef_’ e modificate la riga in questione:

 

$table_prefix  = ‘y234ef_’ ;

 

Modificare le tabelle già esistenti non è altrettanto semplice. Prima dell’operazione eseguite il backup del database.

Poi in phpMyAdmin nella sezione SQL, o da riga di comando se avete accesso SSH, eseguite queste query che rinominano ognuna delle tabelle presenti.

 

RENAME table `wp_commentmeta` TO `y234ef_commentmeta`;

RENAME table `wp_comments` TO `y234ef_comments`;

Banner

RENAME table `wp_links` TO `y234ef_links`;

RENAME table `wp_options` TO `y234ef_options`;

RENAME table `wp_postmeta` TO `y234ef_postmeta`;

RENAME table `wp_posts` TO `y234ef_posts`;

RENAME table `wp_terms` TO `y234ef__terms`;

RENAME table `wp_termmeta` TO `y234ef__termmeta`;

RENAME table `wp_term_relationships` TO `y234ef_term_relationships`;

RENAME table `wp_term_taxonomy` TO `y234ef_term_taxonomy`;

RENAME table `wp_usermeta` TO `y234ef_usermeta`;

RENAME table `wp_users` TO `y234ef_users`;

 

Se sono presenti tabelle generate da plugin o temi, rinominate anche queste seguendo la struttura “RENAME table `nome_tabella` TO `nuovo_nome_tabella`;”.

Poi bisogna cercare nella tabella delle opzioni se ci sono altri campi che usano il prefisso wp_; la query restituirà diversi risultati, ciascuno va modificato.

 

SELECT * FROM `y234ef_options` WHERE `option_name` LIKE '%wp_%'

 

Lo stesso procedimento va eseguito sulla tabella dei metadati degli utenti che conclude le operazioni (al termine eseguite un backup di sicurezza).

 

SELECT * FROM `y234ef_usermeta` WHERE `meta_key` LIKE '%wp_%'

 

WordPress utilizza delle chiavi per cifrare le informazioni contenute nei cookie; vanno impostate sempre nel file wp-config.php.

Cercate la parte, solitamente posta sopra a quella relativa al prefisso del database precedentemente trattata, che è composta da 8 righe simili e inizia con “define('AUTH_KEY',         'put your unique phrase here');”.

Visitate questo indirizzo, copiate l’output e incollatelo direttamente nel file wp-config.php sostituendo le righe precedentemente trovate.

 

I giusti permessi dei file

I file e le cartelle richiedono i giusti permessi - lettura, scrittura, esecuzione; permessi insufficienti portano in genere ad un errore 50x, mentre permessi troppo poco stringenti pongono problemi di sicurezza.

I permessi vanno assegnati secondo il principio dei “minimi permessi”, cioè tanti permessi quanto basta per un corretto funzionamento, non di più.

Una trattazione facile ma completa è disponibile a questo link; le cartelle hanno permessi impostati a 755 (scrivibili da User, eseguibili e leggibili da User, Group e Other), i file a 644 (scrivibili dal User, leggibili da User, Group e Other) e il file wp-config.php, come misura preventiva, a 600.

I permessi si assegnano via FTP, tramite funzione web hosting (se disponibile, come nel caso di RocketWeb Hosting) o tramite plugin. In nessun caso il valore di file e cartelle deve essere impostato su 777 (rwx: leggibili, scrivibili ed eseguibili da User, Group e Other).

 

Eliminazione readme.html

All’interno di WordPress ci sono due file importanti che meritano la dovuta attenzione.

Il primo è readme.html che contiene informazioni sensibili sul sistema: va eliminato senza remora. Ripetere l’operazione ad ogni aggiornamento di WordPress perché il file viene rigenerato ad ogni update.

Inoltre assicuratevi che il file functions.php posto in ogni tema contenga questo comando:

 

remove_action(\'wp_head\', \'wp_generator\');

Protezione del file wp-config.php

 

Il secondo file, assolutamente da non cancellare, è wp-config.php, sito nella root del sito. Va protetto aggiungendo al file .htaccess (quello posto nella root del sito) queste linee di codice:

 

 

order allow,deny

deny from all

 

Banner

 

Disattivazione navigazione tra cartelle e indicizzazione file

La navigazione tra le cartelle del sito e l’indicizzazione del contenuto (attenzione: non si tratta dell’indicizzazione eseguita dai motori di ricerca al fine di determinare il ranking del sito) consente a chiunque, hacker inclusi, di conoscere dettagli sulla struttura del vostro sito e ne espone tutto il contenuto: pertanto questa situazione va evitata.

 

Aggiungete questa direttiva al file .htaccess posto nella root del sito:

Banner

Options -Indexes

 

Disattivazione esecuzione e modifica file .php

Le cartelle /wp-content e /wp-includes contengono dei file .php che è meglio non rendere eseguibili.

Create in ciascuna di queste due cartelle un file di testo e rinominatelo in .htaccess. Il contenuto del file è questa direttiva che disabilita l’esecuzione di codice php:

 

 

deny from all

 

 

I file .php possono essere modificati all’interno di WordPress, ponendo dei rischi in termini di sicurezza evidenti. Per disabilitare la possibilità di modificare i file, aggiungete questa riga al file wp-config.php:

 

// Disabilita modifica file

define( 'DISALLOW_FILE_EDIT', true );

 

Disattivazione di XML-RPC

XML-RPC è abilitato di default in WordPress per aiutare a connettere WordPress e app mobile (quindi pubblicare contenuti da remoto), tuttavia vista la sua natura pone un serio rischio in caso di attacco brute-force.

Se tradizionalmente un certo numero di password richiedono un numero uguale di tentativi (es. Voglio provare 50 password, faccio 50 tentativi, uno per password), il protocollo permette di utilizzare la funzione system.multicall che permette di provare centinaia di password con una singola richiesta.

Per disabilitare XML-RPC il metodo migliore è aggiungere queste linee di codice al file .htaccess posto nella root del sito:

<Files xmlrpc.php>

order allow,deny

deny from all

</Files>

 

 

Ripristino di un sito infetto

Purtroppo a volte gli sforzi non sono abbastanza e il sito viene infettato; a meno di eseguire una reinstallazione totale di Wordpress, l’operazione di ripristino e bonifica non è sempre alla portata degli utenti, ed è meglio rivolgersi a dei professionisti onde evitare problemi futuri, ad esempio dovuti a backdoor lasciate dagli hacker.

Se ci si vuole cimentare in un ripristino, per prima cosa occorre identificare l’infezione (e annotare come non ripetere una situazione simile), poi cambiare la password. Dovrà essere cambiata nuovamente al termine delle operazioni. I log di sistema possono offrire indizi importanti sulla natura e sull’origine dell’infezione.


In seguito contattare il provider: nel caso di hosting condiviso potrebbe essere un problema comune per il quale c’è già una soluzione. In ogni caso la collaborazione con il provider, anche solo per informarlo dell’infezione, è utile. Ad esempio si evita di trasecolare quando si vede il proprio sito sospeso.

Cancellare temi e plugin inutilizzati (controllate su WPScan Vulnerability Database), dove spesso si annidano le infezioni; utilizzare in sequenza i plugin Sucuri Scanner Theme Authenticity Checker per rilevare malware ed eliminarli.

Exploit Scanner cerca eventuali backdoor nascoste in file .php, .zip o codificate in base64 (attenzione: possono essere rilevati falsi positivi). Le cartelle dei temi, dei plugin e degli upload, e i file wp-config.php e .htaccess sono solitamente dove si annidano. Controllate gli utenti e i loro permessi, eliminate gli utenti sospetti e cambiate le chiavi di sicurezza del database con la procedura prima esposta.

Eventuali file hackerati vanno eliminati e rimpiazzati con delle versioni “pulite”; al termine delle operazioni cambiare nuovamente la password. 

Un metodo efficace per ripristinare il sito consiste nell’eseguire un’installazione pulita di WordPress e creare un nuovo database: poi si procederà ad importare i file e il dump del database modificando opportunamente il file wp-config.php (ed evitare, tra gli altri, l’odioso errore “Cannot establish a connection to the database”).

In pratica si procede come se si stesse trasferendo il sito, come descritto in questa guida di RocketWeb Hosting.

 

Conclusioni

Diversi studi mostrano come circa un sito su 4 sia basato su WordPress, e, come conseguenza di questa grande diffusione, è anche il sistema più bersagliato dagli hacker.

Seguendo le best practices discusse in questo articolo ed adottando sistemi che permettono di centralizzare in un’unica interfaccia tutti i propri siti web e di installare, configurare e gestire WordPress in modo semplice e sicuro, potrete ridurre sensibilmente le possibilità di incorrere in una situazione spiacevole.

Il WordPress Toolkit messo a disposizione da Plesk è uno di questi sistemi.

Tenete sempre conto che non è possibile eliminarla del tutto: in quest’ottica adottate sempre un piano di backup che vi consenta di eseguire un ripristino tempestivo del sito e ridurre il tempo di downtime.

L’offerta web hosting di RocketWeb, la quale abbiamo più volte citato in questo articolo, utilizza tecnologie leader di settore che consentono non solo una gestione immediata ed automatica per la sicurezza dei propri siti, ma rendono anche più performanti le prestazioni, grazie ad un’infrastruttura progettata ad hoc per chiunque sappia cosa gli serve e cosa vuole, senza scegliere a caso il provider internet per i propri progetti.

 

RocketWeb è il solo piano hosting che può essere completamente personalizzato tramite un comodissimo configuratore. A differenza della maggior parte delle offerte di piani hosting, CoreTech consente di scegliere parametri che di solito non vengono indicati ma che si possono trovare in postille solo nei contratti.