WordPress e alcuni consigli per migliorare la sicurezza (2)
da Massimo Della Rovere · pubblicato il 7 Aprile, 2013 · modificato il 13 Agosto, 2016

In questo articolo continueremo a proporre alcuni consigli che possono aiutarci a migliorare la sicurezza generale di WordPress. Nel primo articolo sulla Sicurezza WordPress abbiamo visto: Tenere WordPress sempre aggiornato, secret keys e password all’interno del file wp-config.php, proteggere il file system da accessi diretti HTTP, cambiare il suffisso del database, usare il protocollo HTTPS per l’amministrazione, utilizzare SSH per collegamenti remoti con FTP e phpmyadmin.

Questa volta, invece, cercheremo di dare maggiore attenzione alla parte riguardante la protezione del pannello di amministrazione, cercando di proteggerla in maniera più adeguata rispetto alla versione standard, vedremo anche qualche consiglio che ci possa far accorgere velocemente di un’eventuale intrusione esterna con l’analisi dei file modificati. Ovviamente non poteva mancare il principe dei consigli, cioè effettuare sempre una pianificazione di un backup completo, in maniera tale da poter ripristinare i file e le risorse multimediali in caso di virus ed altro.

Consiglio (7) – Proteggere la directory di amministrazione

Come sappiamo bene, WordPress mette a disposizione un potente pannello di amministrazione, il quale però deve essere protetto a dovere, infatti anche se molto utile all’amministratore di sistema, diventa anche una delle prime cose che si cerca di violare. Normalmente tutti i file necessari alla gestione della parte Admin e il login di accesso avvengono tramite la directory wp-admin presente nella directory principale.

Anche se l’accesso di questa directory avviene tramite un login obbligatorio, io consiglio di mettere un controllo e una verifica di accesso ancora prima di richiamare il login di WordPress, questo per il semplice motivo che se la versione di WordPress installata contiene una chiamata URL difettata o un bug di sicurezza, anche se questa è conosciuta dalla persona che vuole violare il sistema, non potrà essere usata se prima non viene sorpassato il controllo del server sulla directory a livello di file system.

Se usate Apache, il file da utilizzare per aggiungere questo controllo è .htaccess, che deve essere creato dentro la directory /wp-admin. Ci sono varie maniere che possono essere usate per proteggere una directory, le più usate sono: il controllo dell’indirizzo IP o l’autenticazione tramite username e password. Il primo può essere utile se ci colleghiamo alla parte amministrativa sempre dalla stessa postazione e vogliamo disabilitare la connessione da un luogo diverso, la seconda invece è utile se ci connettiamo da luoghi sempre diversi che non possiamo conoscere a priori. In ogni caso tenete presente che niente vieta di usare i due modi contemporaneamente.

Consentire accesso al pannello di amministrazione tramite IP

# Inserire questo codice in .htaccess nella directory /wp-admin
# ovviamente cambiate l'indirizzo IP con quello che usate

<Limit GET POST>
  order deny,allow
  deny from all
  allow from 188.233.117.251
</Limit>

Consentire accesso al pannello di amministrazione tramite password

Prima di creare un file .htaccess da inserire nella directory wp-admin dobbiamo creare un file contenente gli username e le password per l’accesso alla directory. La cosa più semplice è quella di creare un file .htpasswd nella directory admin e inserire la riga dell’utente utilizzando il Tools per generazione htpasswd. Una volta che avete eseguito correttamente questa operazione inserite il seguente codice nel file .htaccess.

# Comandi da inserire nel file .htaccess
# Cambiare il path con il nome della vostra directory

AuthType Basic
AuthName "Area Protetta"
AuthUserFile /vostra-directory/wp-admin/.htpasswd
Require valid-user

Schermata di esempio per richiesta utente e password da web server

Protezione WP/Admin

Attenzione al componente ajax se viene utilizzato dal vostro tema

Se per caso utilizzate delle chiamate ajax dal front-end, dovete abilitare l’accesso al file specifico, infatti anche se la ritengo una scelta infelice, purtroppo wordpress ha messo questo file proprio nella directory di amministrazione. Quindi per consentire l’accesso aggiungete dopo le righe precedenti le seguenti istruzioni di autorizzazione:

# Consentire l'accesso al file script
# dedicato alle chiamate AJAX di wordpress

<Files admin-ajax.php>
  order allow,deny
  allow from all
  satisfy any
</Files>

Consiglio (8) – Rendere il login più silenzioso

Una cosa che non ho mai sopportato della fase di  login di WP è che parla troppo, infatti dopo una richiesta di autenticazione fallita viene specificato esattamente il motivo, cioè se l’utente non esiste o se è la password ad essere sbagliata.

// Definizione funzione per la creazione di
// un messaggio di errore in fase di collegamento

function my_login_messages($error) {
  return '<strong>ERROR</strong>: Autenticazione di accesso non valida.';
}

// Aggiungo la funzione al filtro di login_errors

add_filter('login_errors','my_login_messages');

Anche se questo può sembrare comodo, in realtà è molto più pericoloso di quanto possa essere utile, infatti sono informazioni molto preziose per chi tenta di scoprire i nomi degli account prima di effettuare un brute force sulla password. Per fortuna esiste una soluzione semplice per risolvere questo problema, infatti basta inserire un filtro nel nostro file function.php del tema che utilizziamo e cambiare il messaggio.

Errore di Autenticazione

Consiglio (9) – Rafforzare i controlli standard durante il login

Una volta che eseguiamo il login, giustamente WordPress controlla la corrispondenza del nostro utente con la password e in caso positivo ci fa accedere al pannello di admin. Purtroppo esistono diverse tecniche che permettono di eseguire innumerevoli tentativi fino ad indovinare la corrispondenza del nostro account con la nostra password. Per ovviare a questo, dobbiamo cercare di complicare le cose a chi utilizza queste tecniche di intrusione, ad esempio possiamo inserire un bel codice CAPTCHA, il quale se non soddisfatto non genererà nessuna elaborazione di controllo utente e password tramite il modulo WordPress, il tools che sembra più affidabile e difficile da violare in questo momento è il software reCAPTCHA di proprietà Google.

reCaptcha

Anche se questo dovrebbe essere più che sufficiente, personalmente aggiungerei anche il controllo dello user-agent del browser richiedente, infatti ognuno di noi ha un browser preferito con cui accede alla parte admin, quindi potremmo far un controllo del browser che esegue la richiesta ed eseguire il controllo della password solo se questo corrisponde. Questa tecnica è molto efficace, infatti la maggior parte dei tools che tentano le password a ripetizione non spediscono uno useragent particolare e quindi otterrebbero sempre un codice di errore per autorizzazione fallita, anche se per assurdo indovinassero sia lo username che la password. Questo controllo può essere eseguito con un semplice filtro da inserire nel file function.php del nostro tema.

// Definizione funzione per aggiungere dei controlli
// personalizzati durante la fase di collegamento

function my_login_check($user,$username,$password)
{
  global $is_safari, $is_chrome, $is_opera, $is_IE;

  // Controllo se specificato username e password
  if (empty($username) or empty($password)) return $user;
    else $autenticazione = true;

  // Controllo che il browser di accesso sia safari
  if (!$is_safari) $autenticazione = false;

  // Messaggio e disattivazione filtro se autenticazione fallita
  if (!$autenticazione) {
   $user = new WP_Error('denied','ERROR: Autenticazione non valida.');
   remove_action('authenticate','wp_authenticate_username_password',20);
  }

  // Definizione variabile di ritorno funzione
  return $user;
}

// Aggiungo la funzione al filtro di autenticazione

add_filter('authenticate','my_login_check',10,3);

Consiglio (10) – Disabilitare la funzione di recupero password

Se non avete esigenze particolari e non utilizzate la registrazione utenti, ad esempio per consentire i commenti, potete disabilitare la richiesta di password smarrita che nella maggior parte di volte non viene utilizzata e che invece potrebbe essere usata da qualcuno che abbia violato in qualche maniera la vostra posta elettronica. Per disattivare questa funzione basta aggiungere un filtro al file function.php:

// Definizione funzione per impostare il flag
// che controlla la richiesta di reset password

function my_login_restrict_password_reset() {
  return false;
}

// Aggiungo la funzione al filtro di reset permessa

add_filter('allow_password_reset','my_login_restrict_password_reset');

Consiglio (11) – Pianificazione della funzione di backup

Una copia di backup del nostro sito non è solo importante per i motivi ovvi che tutti conosciamo, ma è importante anche per la sicurezza. Infatti è l’unica maniera per poter ripristinare velocemente il nostro ambiente operativo dopo che questo è stata violato e che sono stati modificati i file del core o il database principale. WordPress mette a disposizione moltissimi plugin per eseguire le funzioni di backup, sia tramite delle copie locali o utilizzando i vari servizi di storage online presenti in cloud.

Vi conviene leggere attentamente tutte le caratteristiche dei plugin disponibili sul sito ufficiale di wordpress.org ==> http://goo.gl/gCJ2F e scegliere quello più adatto alle vostre esigenze. In ogni caso, qualsiasi sia il plugin e il metodo che scegliete, ogni tanto eseguite anche un backup manualmente da memorizzare in un posto sicuro, questo perchè se viene violata la parte di amministrazione di wordpress, molto spesso vengono messi a disposizione anche i repository dei backup che potrebbero essere cancellati, creando un problema molto difficile da risolvere. Quindi utilizzate un client FTP per poter effettuare una copia della directory di wordpress ed eseguite il backup completo del database tramite i tools che avete come ad esempio myphpadmin.

Consiglio (12) – Bloccare script injection

Molte volte succede che qualche modulo del core di wordpress o forse più spesso qualche plugin scritto con poca attenzione, possa avere un difetto di progettazione e permettere delle injection con cui un’eventuale hacker può modificare dei file di sistema o eseguire del codice arbitrario collegato ad una vostra pagina web. Una delle tecniche più usate per risolvere questo problema è bloccare l’accesso con .htaccess.

# Protezione contro script injection di carattere generale
# con il controllo delle stringhe più conosciute su URL

RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]

In realtà esistono molti controlli che possono essere aggiunti al codice che vi ho allegato, molti dipendono anche dal sistema operativo che viene utilizzato, in ogni caso la cosa migliore è quella di ricercare su google con una stringa del tipo “wordpress block script injection” vi allego un link per velocizzare http://goo.gl/yx7A3I.

Indice generale degli articoli correlati

9 Commenti

  1. Ciao, Ottima guida, complimenti!

    Sto provando ad inserire nel file function.php del tema il punto 10 e da quanto ho capito dovrebbe rimuovere la voce recupera password dalla schermata di Login.
    Ma con la versione 4.3.1 di WP non sta funzionando.. sono l'unico ad avere questo problema o sbaglio qualcosa? Grazie

  2. Ciao Simone sul mio tema funzione bene, però come sai basta solo qualche differenze e le cose possono essere diverse. Mandami qualche dettaglio in piú per e-mail e vedo se posso aiutarti.

  3. Ciao Massimo, grazie per il tuo articolo. Ho riscontrato che il consiglio 8, sembra non funzionare posizionando il codice nel function.php di un child theme. Ti risulta?

  4. Ciao Andrea, per sicurezza e per controllare se il codice avesse qualche errore, ho copiato le righe riportate nell'articolo nel file function.php di un sito locale, però mi sembra che funzioni tutto correttamente.

  5. Ho riprovato, con un child theme da zero. Il tuo codice funziona perfettamente. Grazie ancora per i tuoi preziosi suggerimenti

  6. Complimenti per la guida davvero ottima, l'unica cosa che non riesco a fare è il punto 7 infatti mi compare il modulo di autenticazione nel sito e non mi fa navigare :( inserisco il tuo sito nei miei preferiti e spero di poter leggere altri interessanti articolo come questo in futuro ;) Grazie

  7. Grazie Vincenzo, sono contento che la guida ti sia stata utile, per il punto che non riesci ad eseguire se vuoi mandami anche una mail dettagliata di esattamente quello che hai fatto e il risultato che vuoi raggiungere, cercherò di risponderti il prima possibile. Puoi scrivere al seguente indirizzo email wordpress(at)otherplus(dot)com.

  8. Tutto Ok, la domanda però è: ma perchè alcuni di questi accorgimenti non vengono inseriti di default all’interno di wordpress?

  9. Bruno, sicuramente molte cose possono essere migliorate direttamente nel core di wordpress, specialmente la suddivisione delle cartelle e i compiti dei vari file di include, però molti aspetti non dipendono dal software di WP, ma dipendono dal sistema operativo che si usa e l’eventuale server web installato, con windows i permessi sono diversi che con linux, con apache il controllo e la protezione delle directory è diversa che con IIS o Nginx, in questi casi bisogna intervenire manualmente non può essere il compito di un CMS.

condividi