Qualche giorno fa stavo facendo una scansione su un sito di un cliente col plugin Sucuri Security per verificare la presenza di un sospetto malware (fortunatamente non presente), quando nel report stampato dopo la scansione mi consigliano di utilizzare gli header di sicurezza.

Bene… e che cosa sono?

Dato che sono sempre desideroso di imparare cose nuove, ho fatto una breve ricerca ed ho scoperto che esistono alcune particolari impostazioni di sicurezza che prescindono dall’utilizzo di WordPress e sono attivabili direttamente sul server che ospita il tuo sito web. Ovviamente, se utilizzi WordPress, queste misure di sicurezza verranno “ereditate” anche dal nostro amato CMS, incrementandone ulteriormente la robustezza agli attacchi informatici.

L’articolo è intitolato “header di sicurezza”, anche se in realtà queste impostazioni di sicurezza sono raggruppabili in 3 categorie, di cui ti parlerò in dettaglio nel resto dell’articolo:

  1. Disabilitazione dei Server Banner
  2. Header di sicurezza
  3. Disattivazione dei metodi HTTP custom

Nota importante prima di proseguire

Alcune di queste impostazioni possono essere abilitate tramite il plugin All In One WP Security & Firewall. Per una configurazione completa, come quella riportata in questo articolo, ti consiglierei di non utilizzare il plugin, ma di andare a scrivere a mano direttamente nel file .htaccess della tua installazione di WordPress. Dato che la modifica di questo file potrebbe compromettere la funzionalità e la raggiungibilità del tuo sito web, se non sei sicuro, ti conviene fartelo fare da una persona esperta in queste cose.

Inoltre, queste regole valgono solo per i server web Apache, per i server IIS o NginX vi sono una serie di altre impostazioni che puoi trovare in questo articolo di Scott Helme.

Vediamo ora quali sono queste impostazioni di sicurezza consigliate da Sucuri.

1) Disabilitazione dei Server Banner

Nei messaggi HTTP di risposta sono contenute alcune informazioni riguardo al server, come la versione del server Apache, e le versioni di PHP e MySQL. Questo non è del tutto positivo, perché un attaccante scaltro, conoscendo la vulnerabilità di tali versioni potrebbe sferrare con successo un attacco al tuo sito web e guadagnare così un accesso illegale al server.

Per disabilitare l’invio di queste informazioni, è sufficiente inserire queste righe all’interno del file .htaccess:

ServerSignature Off
ServerTokens ProductOnly

La prima, “ServerSignature Off” ordina di non mostrare la versione di Apache nelle pagine di errore (per esempio la famosa “404”), mentre la seconda “ServerTokens ProductOnly” (in certe versioni “ServerTokens Prod”) impone al server di non inserire le versioni di software nell’header delle risposte.

Fa’ attenzione nell’uso di queste direttive, in quanto non tutti i server potrebbero interpretarle correttamente per cui il tuo sito potrebbe diventare irraggiungibile. Per esempio, il server NginX va in errore con la seconda, per cui ti conviene far riferimento all’articolo di Scott Helme, già citato, se usi un server di questo tipo.

2) Inserimento degli header di sicurezza

Nel messaggio di risposta HTTP che il server invia a seguito della richiesta del browser, è possibile inserire alcuni header particolari, per attivare alcune funzionalità di sicurezza. Una pagina che mostra quali sono è quella del progetto OWASP, mentre un altro sito fornisce un servizio che ti permette di stabilire se il tuo sito web ha dei buoni parametri di sicurezza.

Il blocco da inserire nel file .htaccess è il seguente:

<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
Header append X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
Header unset X-Powered-By
Header edit Set-Cookie ^(.*)$ "$1; httpOnly; secure"
</IfModule>

Tralasciando i tag <IfModule mod_headers.c>…</IfModule>, il significato di ogni riga è questo:

  • Header set X-Content-Type-Options “nosniff”: serve a prevenire gli attacchi mime-based.
  • Header append X-Frame-Options “SAMEORIGIN”: impedisce il clickjacking, ossia il dirottamento del click.
  • Header set X-XSS-Protection “1; mode=block”: questo header di sicurezza viene compreso solamente da Internet Explorer 8 e superiori, in cui attiva un particolare filtro per prevenire alcune tipologie di attacchi XSS.
  • Header unset X-Powered-By: rimuove l’header “X-Powered-By” contenente la versione di PHP in uso.
  • Header edit Set-Cookie ^(.*)$ “$1; httpOnly; secure”: modifica l’header “Set-cookie” inserendovi due parametri che ne incrementano la sicurezza.

3) Disattivazione dei metodi HTTP custom

Una delle caratteristiche del protocollo HTTP è la possibilità di definire dei metodi custom. Infatti, oltre ai metodi classici GET, POST, HEAD, ve ne sono tanti altri utilizzati da applicazioni particolari (per esempio la piattaforma Microsoft Sharepoint per la condivisione di documenti).

Normalmente un server dovrebbe rispondere a questi metodi con un messaggio di errore. Tuttavia, WordPress risponde con un 200 (OK), restituendo il contenuto della pagina richiesta.

Dato che questo comportamento potrebbe comportare delle vulnerabilità dal punto di vista della sicurezza informatica, se sei sicuro che non ti servano, puoi disabilitare i metodi custom inserendo nel file .htaccess il blocco di righe seguente:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)
RewriteRule .* - [R=405,L]
</IfModule>

In questo modo rimangono abilitati solo i metodi GET, POST, HEAD, che sono quelli normalmente utilizzati. Per tutti gli altri verrà restituito un codice di errore 405 (Method not allowed).

In sintesi

Riassumendo, quanto detto nell’articolo non garantisce la sicurezza al 100% del tuo sito web, ma contribuisce al miglioramento di essa in maniera significativa, specialmente se al sito hai già applicato i consigli che ti ho dato nel mio report “I 10 gravi errori che riducono la sicurezza di WordPress“.

Infine, questo è il blocco di testo completo da inserire all’interno del tuo file .htaccess sui server Apache per attivare gli header di sicurezza e le altre impostazioni di cui ti ho parlato nell’articolo:

########## SECURITY SETTINGS: START ##########
ServerSignature Off
ServerTokens ProductOnly

<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
Header append X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
Header unset X-Powered-By
Header edit Set-Cookie ^(.*)$ "$1; httpOnly; secure"
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)
RewriteRule .* - [R=405,L]
</IfModule>
########## SECURITY SETTINGS: END ##########

Se ti è piaciuto questo articolo, e se hai trovato utili i contenuti, ti invito a lasciare un commento e a condividerlo sui social network, grazie!