Da quando ho iniziato il mio percorso nel mondo della programmazione, ho sempre avuto a che fare con siti in WordPress. Negli anni ho imparato a realizzarmi plugin e temi, evitando cosi la maggior parte dei problemi di vulnerabilità e imparando a mettere in sicurezza WordPress.
Per questo, ho deciso di approfittare di queste vacanze e del (purtroppo poco) tempo libero, per pubblicare le mie best practices che metto in atto quando pubblico un nuovo sito WordPress, in modo da evitare qualsiasi problema legato alla sicurezza WordPress.
WordPress ad oggi alimenta più del 35% dei siti pubblicati in tutto il web, rendendolo cosi un bersaglio per hacker e script kiddie (ovvero coloro che copiano e incollano codici trovati in rete per causare danni). Vediamo quindi come evitare gli errori più comuni su un installazione mettendo in sicurezza WordPress.
Protezione del database
Per prima cosa, quando installiamo un nuovo sito WordPress, dobbiamo sempre ricordarci di cambiare il prefisso usato per le tabelle del database. Prima di avviare l’installazione quindi, apriamo il file wp-config.php e modifichiamo il valore:
$table_prefix = '3FD48du_'; //sostituiamo il valore "wp_"
Sicurezza WordPress: le operazioni da fare dopo l’installazione
Una volta installato, è tempo di mettere in sicurezza WordPress, proteggendo file e assicurandoci di bloccare gli accessi indesiderati.
Evitare l’username admin o il default
Se hai ancora l’utente amministratore del sito con nome admin (o il primo utente con ID 1) dovresti provvedere ad eliminarlo. Per farlo, crea un nuovo utente amministratore, sloggati e riloggati con il nuovo utente e procedi ad eliminare l’utente admin.
Disabilita Pingback e Trackback
Cosa sono i Pingback e i Trackback? I trackback servono ai proprietari di un blog in WordPress per comunicare tra altri blog o siti web. Quando condivisiamo su un sito o su un altro blog un link al nostro sito wordpress, il nostro sito riceverà un Trackback, che lo avviserà appunto di essere stato citato. Sarà poi nostra cura accettare o rifiutare il trackback.
Il pingback è simile al trackback ma avviene in automatico. È quindi un segnale di ritorno che ci avvisa quando un blogger ha pubblicato all’interno del proprio spazio web un link al nostro articolo.
Disattivare queste due opzioni di consente di evitare attacchi di tipo DDoS (Distributed Denial of Service), per farlo andiamo in Impostazioni > Discussione e disabilitiamo le prime due voci.
Bloccare l’accesso a file sensibili
Per rendere ancora più sicuro il nostro sito WordPress, possiamo inibire l’accesso ad alcuni file sensibili presenti nel core. Per farlo, apriamo il file .htaccess presente nella root dell’installazione, e aggiugiamo le seguenti regole:
#Nego la possibilità di vedere le cartelle
Options -Indexes
#Blocca l'accesso al file htaccess
<files .htaccess>
Order allow,deny
Deny from all
</files>
#Blocca l'accesso al file wp-config.php
<files wp-config.php>
Order allow,deny
Deny from all
</files>
Blocchiamo anche l’accesso ai file di installazione, per farlo creiamo un file .htaccess nella cartella /wp-admin:
#Blocca i file di installazione
<files install.php>
Order allow,deny
Deny from all
</files>
<files setup-config.php>
Order allow,deny
Deny from all
</files>
Cartelle e file, i giusti permessi
E’ fondamentale la gestione dei permessi di cartelle e file per evitare che qualche malintenzionato riesca a caricare ed eseguire codice sul nostro sito WordPress, per farlo, impostiamo i giusti permessi alle cartelle e ai file.
Per l’esattezza, tutte le cartelle devono avere il permesso 755 mentre tutti i file devono avere permessi settati su 644.
Bloccare l’esecuzione di file PHP
Crea un nuovo file .htaccess all’interno della cartella /wp-content/uploads,
/wp-content/themes e /wp-content/plugins, aggiungendo queste direttive, che permettono il blocco dell’esecuzione di file PHP:
<Files *.php>
Deny from all
</Files>
Disabilita i suggerimenti di login errato
Altro punto importante relativo alla sicurezza del nostro sito WordPress, è quello di fornire minor informazioni possibili ad eventuali malintenzionati. Ad esempio, quando proviamo ad accedere con un utente non esistente, WordPress ci dirà che l’utente inserito non è valido, mentre se inseriamo un nome utente o una mail registrata, l’avviso che riceviamo è che la password inserita è errata, dando cosi un informazione preziosa, ovvero che il nome utente inserito è valido!
Per difenderci, possiamo modificare il messaggio con uno più generico, per farlo possiamo inserire nel file function.php del tema (o del tema child o di un plugin) questa funzione:
function replace_wp_login_error(){
return 'Il nome utente o la password inseriti non sono validi.';
}
add_filter( 'login_errors', replace_wp_login_error );
Sicurezza WordPress: WAF (Web Application Firewall) limitazione dei login errati e CDN
Esistono molti plugin gratuiti e a pagamento che permettono di aumentare la sicurezza del nostro sito WordPress, uno che vi consiglio è Wordfence (link al sito ufficiale). Una volta installato il plugin, seguite la procedura di configurazione. Le funzioni che vi consiglio di attivare sono:
– Limit Login Attempts
– Ban 404 error
– Enable File change alert
– Disable xmlrcp.php
Inoltre, con Wordfence, potrete (congilio di farlo) anche modificare l’url al quale accedete al backend di wordpress, modificando quindi l’url da wp-admin a, ad esempio /amministrazione.
Se il vostro sito ha traffico esclusivamente italiano, vi consiglio di abilitare la versione gratuita di Cloudflare, creando una regola Firewall che blocca (o richiede challenge) tutte le visite provenienti da indirizzi IP non italiani. In ogni caso, mitigare tutto il traffico tramite una CDN aumenta oltre che la velocità del sito, anche la sicurezza dello stesso.
Security Headers, difendersi dagli attacchi XSS
Il Cross-site Scripting (XSS) è una vulnerabilità che consente ad un attaccante remoto di “iniettare” script dannosi nelle pagine del nostro sito, con lo scopo di rubare informazioni riservate o installare malware sui browser degli utenti.
Per metterci al sicuro anche sotto questo aspetto, possiamo impostare nel file .htaccess questa direttiva:
Header set X-Frame-Options SAMEORIGIN
Questa direttiva blocca qualsiasi frame o iframe esterno al nostro dominio, se invece abbiamo la necessità di avere iframe che arrivano da altri domini, possiamo aggiungerli alla regola in questo modo:
Header set X-Frame-Options "ALLOW-FROM https://google.com"
Sempre nel file .htaccess inseriamo quest’altra regola:
Header set X-XSS-Protection "1; mode=block"
Con quest’altra regola invece, blocchiamo il caricamento di script esterni che potrebbero contenere malware o essere iniettati in temi o plugin non affidabili. Inseriamo:
Header set Content-Security-Policy "default-src 'self';
In questo modo, stiamo dicendo al nostro server di consentire il caricamento di script provenienti dallo stesso dominio (self).
ATTENZIONE: questa regola causerà però uno scorretto funzionamento di risorse che perforza di cose devono essere richiamate dall’esterno, come ad esempio GoogleAnalytics o script incorporati da una CDN (es: cdnjs). Per permettere l’esecuzione è possibile inserire i domini noti in whitelist, con la regola:
header set Content-Security-Policy "script-src 'self' www.google-analytics.com;
Eliminare, bloccare o inibire l’accesso a xmlrcp.php per una migliore sicurezza WordPress
XML-RPC è una specifica che consente la comunicazione tra WordPress e altri sistemi. È stato possibile farlo standardizzando tali comunicazioni, utilizzando HTTP come meccanismo di trasporto e XML come meccanismo di codifica.
XML-RPC è antecedente a WordPress: era presente nel software di blogging b2, da cui è nato il fork di WordPress nel 2003. Il codice che sta dietro il sistema è memorizzato in un file chiamato xmlrpc.php, nella directory principale del sito. Ed è ancora lì, anche se XML-RPC è in gran parte obsoleto ed è stato rimpiazzato quasi in totalità dalle RestAPI di WordPress.
Tramite questo file è possibile effettuare attacchi BruteForce senza essere bannati o evitando i limiti di login errati visti in precedenza. Vediamo quindi come disabilitarlo.
Nel file .htaccess della root, inseriamo:
<Files xmlrpc.php>
Order deny, allow
Deny from all
allow from 92.111.21.123 #permettiamo l'uso solo ad un IP noto
</Files>
Ultimi passaggi, nascondiamo “i fatti nostri”
Come ultimo passaggio, ti consiglio di nascondere al pubblico la versione di WordPress, quella del server e della versione di PHP, sempre intervenendo sull’htaccess.
Blocchiamo i file di licenza e readme del core di WordPress:
<Files license.txt>
Order allow, deny
Deny from all
</Files>
<Files readme.html>
Order allow, deny
Deny from all
</Files>
Nascondiamo anche gli errori PHP in chiaro, nel file wp-config.php inseriamo:
error_reporting( 0 );
ini_set( 'display_errors', 0 );
define( 'WP_DEBUG', false );
Nel file .htaccess presente nella root, nascondiamo le informazioni inviate dal server:
ServerSignature Off
Header unset X-Powered-By
E’ tutto! Grazie per l’attenzione e spero che, se ti trovi qui, non sia troppo tardi 😉