Rafforzamento di MySQL per il tuo sito WordPress

Pubblicato: 2023-01-18

WordPress, il CMS più popolare, gira su MySQL, il database più popolare in circolazione. Dedicare un po' di tempo per garantire che l'installazione di MySQL e l'installazione della configurazione del database di WordPress siano adeguatamente protette contro i vettori di attacco comuni può aiutarti a ridurre i rischi. Ciò è particolarmente vero se gestisci tu stesso il tuo server MySQL.

Vale la pena notare che molte installazioni di WordPress utilizzano MariaDB, che è un fork di MySQL. Poiché entrambi funzionano in modo molto simile, useremo MySQL per indicare sia MySQL che MariaDB. Indipendentemente dal tipo di RDMS in esecuzione, rafforzare il tuo MySQL può aiutarti a ridurre al minimo i rischi di attacchi da parte di hacker. Tuttavia, ciò non sostituisce altre misure di sicurezza, come l'installazione di un firewall per applicazioni Web, la garanzia di disporre dell'ultima versione di plug-in, temi e WordPress e il rafforzamento di WordPress.

Attenzione , questo articolo è rivolto a MySQL 8.0 in esecuzione su Linux (Ubuntu). Mentre i concetti si tradurranno in altri sistemi operativi e versioni di MySQL/MariaDB, i comandi e i percorsi dei file utilizzati in questi esempi potrebbero differire. Prima di apportare modifiche a un sistema di produzione, si consiglia vivamente di testare eventuali modifiche in un ambiente di staging o di pre-produzione.

In questo articolo, rivolto principalmente a coloro che gestiscono il proprio MYSQL, offriamo diversi suggerimenti e tutorial su come proteggere MySQL. Anche così, vale la pena leggere l'ampio elenco di best practice presentato in questo articolo per chiunque gestisca siti Web WordPress. La protezione del tuo server MySQL è un passaggio fondamentale per mantenere un WordPress sicuro e proteggerti da diversi tipi di attacchi di forza bruta, iniezione di malware e altri tipi di attacchi.

Sommario

  • Prendi in considerazione l'utilizzo di un database come servizio (DBaaS
  • Mantieni aggiornato MySQL
  • Esegui MySQL su una macchina dedicata
  • Associa MySQL a un indirizzo IP
  • Limitare l'uso di strumenti GUI basati sul web
  • Eseguire il demone MySQL utilizzando un utente dedicato
  • Usa lo script mysql_secure_installation
  • Crea un utente del database WordPress dedicato
  • Assicurarsi che local_infile sia disabilitato
  • Disabilita la cronologia dei comandi MySQL
  • Assicurarsi che mysqld non sia avviato con l'argomento –skip-grant-tables
  • Eseguire il backup del database
    • Eseguire backup frequenti
    • Verifica frequentemente l'integrità dei tuoi backup
    • Archivia i tuoi backup in modo sicuro
  • Abilitare e applicare le connessioni TLS
    • Cambia il prefisso della tabella
    • Come implementare le modifiche
    • Mantenere il tuo WordPress sicuro

Prendi in considerazione l'utilizzo di un database come servizio (DBaaS)

Vale la pena considerare Database as a Service se non stai ospitando WordPress su un piano gestito. Sostituisce il modello tradizionale di installazione di MySQL in locale con un servizio a cui ti connetti. Questo potrebbe essere adatto al tuo caso d'uso se stai eseguendo il tuo sito WordPress con un provider di hosting che offre servizi di database gestiti. Le opzioni disponibili generalmente includono Amazon RDS, DigitalOcean Managed MySQL e Linode Managed MySQL). A prima vista, questi servizi possono essere più costosi rispetto all'esecuzione di MySQL da soli. Tuttavia, svolgono tutto il lavoro pesante dell'esecuzione di database di livello di produzione. La maggior parte dei servizi include preimpostazioni di best practice di sicurezza, patch di sicurezza e manutenzione continue e backup.

L'utilizzo di un database come servizio (DBaaS) è ​​una delle migliori opzioni in termini di sicurezza e affidabilità. Anche se questo non è obbligatorio, è comunque un bene da avere. Tuttavia, se stai cercando di gestire MySQL da solo, la seguente è una raccolta di suggerimenti per l'hardening da tenere a mente.

Mantieni aggiornato MySQL

Così come è importante assicurarsi di eseguire l'ultima versione di WordPress, è importante mantenere aggiornato MySQL. Come la maggior parte degli altri software, gli aggiornamenti del server MySQL vengono rilasciati periodicamente. Questi aggiornamenti risolvono bug, mitigano le vulnerabilità e forniscono nuove funzionalità. Dovresti mantenere MySQL aggiornato con le ultime patch di sicurezza per ridurre i rischi legati all'esecuzione di software con vulnerabilità note. Tieni presente che una volta aggiornato, ti verrà richiesto di riavviare il "daemon mysql". Questo è un processo che potrebbe comportare tempi di inattività. Come sempre, pianifica in anticipo.

Esegui MySQL su una macchina dedicata

Molte installazioni di WordPress eseguono MySQL, PHP e un server web (come Nginx o Apache HTTP Server) sulla stessa macchina. Questo non è ottimale, sia in termini di prestazioni che di sicurezza. MySQL dovrebbe idealmente funzionare su un server dedicato per ridurre il raggio di esplosione di un attacco. Se un utente malintenzionato riesce a compromettere e aumentare i privilegi sul server Web, sarebbe molto più difficile per quell'attaccante spostarsi lateralmente e compromettere anche il server MySQL.

Associa MySQL a un indirizzo IP

È possibile configurare MySQL in modo che accetti solo connessioni TCP/IP da un'interfaccia IPv4 o IPv6 specifica. Tutto quello che devi fare è impostare l'opzione di configurazione bind-address su un indirizzo IP specifico. Ciò fornisce ulteriori controlli e restrizioni su come le applicazioni client (nel nostro caso WordPress) possono connettersi a MySQL. Per impostazione predefinita, questa impostazione è impostata su *, il che significa che MySQL pronto all'uso ascolterà su tutte le interfacce.

Se non configurato per ascoltare un IP specifico, tutti gli IP possono essere utilizzati per connettersi a MySQL. Questa impostazione è particolarmente importante da impostare se si esegue MySQL sulla stessa macchina di un server Web che si sta esponendo a Internet (in questo caso, è necessario impostare l'indirizzo di collegamento su 127.0.0.1 in modo che MySQL ascolti solo su localhost) .

Ad esempio, se desideri che il server MySQL accetti solo connessioni su un indirizzo IPv4 specifico, puoi aggiungere una voce simile all'esempio seguente. Dovresti inserirlo nel gruppo di opzioni [mysqld] nel file di configurazione /etc/mysql/mysql.conf.d/mysqld.cnf del tuo server.

indirizzo-bind=192.168.0.24

Nota che una volta impostato questo, dovrai riconfigurare WordPress per connettersi al database utilizzando questo indirizzo IP (a meno che non lo stia già facendo) poiché le connessioni su altri indirizzi host del server non sarebbero consentite.

Limitare l'uso di strumenti GUI basati sul web

Molte installazioni di WordPress includono strumenti di gestione grafica front-end basati sul web. Esempi comuni includono Cpanel, phpMyAdmin o Adminer. Questi strumenti semplificano la gestione di MySQL e di altri aspetti dell'infrastruttura sottostante. Mentre un'interfaccia grafica basata sul Web può aiutarti a gestire i tuoi database MySQL, queste interfacce possono aumentare la superficie di attacco aggiungendo un altro vettore. Inoltre, c'è il rischio che vengano scoperti e sfruttati dagli aggressori per eseguire query SQL distruttive o dannose contro il tuo database. Gli attacchi possono persino comportare un'acquisizione completa del tuo sito Web WordPress.

L'unico server sicuro è quello spento e scollegato, ma il rischio può essere gestito. La disinstallazione dei sistemi non critici è un'opzione; tuttavia, questi possono anche essere bloccati e limitati per ridurre al minimo il rischio.

È possibile limitare l'accesso a questi strumenti in vari modi. Puoi installare phpMyAdmin per WordPress da remoto, riducendo così al minimo i rischi per il server web. In alternativa, potresti anche prendere in considerazione l'utilizzo di strumenti come MySQL Workbench o Beekeeper Studio sulla tua macchina locale e connetterti al tuo server di database tramite un tunnel SSH.

Eseguire il demone MySQL utilizzando un utente dedicato

Come con altri servizi in esecuzione su un server, puoi eseguire il demone MySQL con un utente dedicato. Quando esegui MySQL utilizzando un utente dedicato, puoi definire con precisione quali autorizzazioni vengono assegnate a tale utente all'interno del sistema. L'esecuzione di MySQL con un utente dedicato segue anche il principio del privilegio minimo poiché ciò riduce il raggio di diffusione di una vulnerabilità di MySQL. Diminuisce inoltre la possibilità che venga sfruttata una configurazione errata poiché un utente con restrizioni non sarà in grado di accedere a risorse non correlate a MySQL (come configurazioni e segreti del sistema operativo).

La buona notizia è che le installazioni tramite gestori di pacchetti (come apt o yum) si occupano automaticamente di questo passaggio durante l'installazione di MySQL. Un modo rapido per verificare se MySQL è in esecuzione con un utente dedicato consiste nell'eseguire quanto segue sulla macchina che esegue il demone MySQL.

ps -ef | egrep "^mysql.*$"

Se MySQL è in esecuzione utilizzando un utente dedicato, dovresti aspettarti di vedere restituita almeno una riga dall'output di ps.

Usa lo script mysql_secure_installation

Il pacchetto mysql-server viene fornito con un'utilità di script di shell chiamata mysql_secure_installation. Puoi utilizzare questo script per impostare un punto di partenza sicuro per il server MySQL. Pertanto, dovresti eseguirlo dopo una nuova installazione di MySQL. Questa utilità ti aiuta a:

  • Imposta una password per gli account root
  • Rimuovi gli account root accessibili dall'esterno di localhost
  • Rimuovi gli account utente anonimi
  • Rimuovi il database di test (a cui, per impostazione predefinita, possono accedere gli utenti anonimi)

Per richiamare mysql_secure_installation, esegui il seguente comando:

sudo mysql_secure_installation

Una volta avviato il processo di installazione, ti verranno presentate diverse richieste che ti chiedono se desideri abilitare il plug-in di convalida della password , che viene utilizzato per testare la sicurezza delle password che scegli per gli utenti MySQL. Si consiglia di abilitare questo plugin.

Dopo aver abilitato il plug-in di convalida della password, lo script ti chiederà di specificare una politica di convalida della password. Qui, dovresti scegliere una politica di password sicura. Successivamente ti verrà chiesto di reimpostare la password dell'utente root.

Successivamente, lo script ti chiederà di rimuovere gli utenti MySQL anonimi. Questo è importante per ridurre qualsiasi possibilità che gli aggressori ottengano l'accesso al server del database sfruttando un utente MySQL anonimo.

Il prompt successivo ti chiederà se desideri disabilitare gli accessi utilizzando l'utente root durante l'autenticazione remota al server MySQL. L'autenticazione remota tramite l'utente root è pericolosa e raramente richiesta. Invece, dovresti utilizzare SSH su MySQL e utilizzare il client MySQL sul server per autenticarti come utente root o, preferibilmente, utilizzare un tunnel SSH per inoltrare la porta MySQL remota alla tua macchina locale e connetterti utilizzando un client locale.

Successivamente, ti verrà chiesto di eliminare i database predefiniti (se esistono) forniti da MySQL. Questa è la pratica consigliata per i server MySQL di produzione.

Elimina il database predefinito

Infine, ti verrà chiesto se desideri ricaricare le tabelle dei privilegi per rendere effettive tutte le modifiche che sono state applicate.

Crea un utente del database WordPress dedicato

Le migliori pratiche di sicurezza dettano la segregazione di utenti e privilegi in base a mansioni o ruoli. Ciò significa che ogni applicazione che utilizza il database dovrebbe avere un proprio utente dedicato con la quantità minima di autorizzazioni del database MySQL necessarie per svolgere il proprio lavoro. Pertanto, ti assicurerai che i privilegi dell'utente non vadano oltre quanto richiesto.

Questa pratica dovrebbe estendersi alle distribuzioni che eseguono più siti Web WordPress: ogni sito Web WordPress dovrebbe avere il proprio database dedicato e utente MySQL. Ciò garantisce che in qualsiasi momento solo un utente alla volta abbia accesso a un database e che gli utenti non possano accedere ad altri database, evitando accessi non autorizzati e violazioni dei dati.

La seguente istruzione SQL (sostituisci <host> e <password> e <database> per soddisfare le tue esigenze) può essere utilizzata per creare un utente dedicato per il tuo sito Web WordPress e concedere privilegi per l'uso regolare. Tieni presente che alcuni plugin, temi e aggiornamenti di WordPress potrebbero occasionalmente richiedere privilegi aggiuntivi per funzionare correttamente (consulta la guida ufficiale di WordPress su questo per ulteriori informazioni)

Assicurati che local_infile sia disabilitato

L'istruzione LOAD DATA consente di caricare i file di dati nelle tabelle del database. In condizioni specifiche, questo può essere abusato per leggere i file dal server MySQL. Pertanto, a meno che tu non abbia un caso d'uso specifico per questo nel tuo sito WordPress, dovresti disabilitare questa funzione.

Se MySQL e il server Web sono in esecuzione sulla stessa macchina, potrebbe consentire a un utente malintenzionato di utilizzare l'istruzione LOAD DATA LOCAL per leggere file arbitrari a cui il processo del server Web ha accesso in lettura. Ciò presuppone che un utente malintenzionato abbia la capacità di eseguire istruzioni SQL arbitrarie contro MySQL. Tale può essere il caso di una vulnerabilità di SQL injection o attraverso l'installazione di un plug-in WordPress dannoso. Questo è un altro motivo per tenere separati il ​​server web e i server del database.

Per impostazione predefinita, local_infile è disabilitato in MySQL 8.0 (era abilitato per impostazione predefinita nelle versioni precedenti di MySQL). Per impedire al server MySQL di accettare istruzioni LOAD DATA LOCAL, assicurarsi che il demone mysqld sia avviato con local_infile disabilitato.

Disabilita la cronologia dei comandi MySQL

Su Linux, le istruzioni dei log del client MySQL eseguite in modo interattivo vengono salvate in un file di cronologia (in genere situato in $HOME/.mysql_history). La cronologia dei comandi MySQL dovrebbe idealmente essere disabilitata poiché ciò riduce la probabilità di esporre informazioni sensibili, come password, chiavi di crittografia o altri segreti.

Per verificare che i file .mysql_history non esistano nel sistema, eseguire i seguenti comandi:

find /home -name “.mysql_history”
find /root -name “.mysql_history”

Se i comandi precedenti restituiscono un output, rimuovi tutti i file .mysql_history. Inoltre, puoi impostare $HOME/.mysql_history come collegamento simbolico a /dev/null come segue:

ln -s /dev/null $HOME/.mysql_history

Assicurarsi che mysqld non sia avviato con l'argomento –skip-grant-tables

Se la password di root di MySQL viene smarrita, sebbene non sia il metodo preferito, alcuni amministratori di MySQL potrebbero ricorrere all'impostazione di MySQL in modo che inizi con l'argomento –skip-grant-tables. Quando si avvia MySQL con questo parametro, eviterà di controllare le sue tabelle di concessione quando un client si connette o esegue una query, consentendo effettivamente a chiunque, ovunque (a condizione che possa raggiungere il database attraverso la rete), di fare qualsiasi cosa sul server del database.

Per assicurarti che –skip-grant-tables non sia abilitato, apri il file di configurazione /etc/mysql/mysql.conf.d/mysqld.cnf del tuo server e cerca skip-grant-tables. Il valore non deve essere impostato o deve essere impostato su skip-grant-tables = FALSE.

Eseguire il backup del database

Il backup del database di WordPress è assolutamente fondamentale per poter recuperare tempestivamente da un disastro o da un attacco. Sebbene esistano una miriade di modi per eseguire il backup del database di WordPress, dai plug-in e servizi di backup di WordPress agli script interni che eseguono periodicamente un dump del database, i seguenti sono alcuni suggerimenti salienti da tenere a mente.

Eseguire backup frequenti

L'esecuzione di backup regolari è abbastanza ovvia e autoesplicativa: più frequentemente esegui i backup del database, più facile sarà il ripristino da un incidente di perdita di dati. Mentre la frequenza dei backup dipenderà dal tipo di sito WordPress che stai utilizzando, come regola generale, fare un backup ogni giorno serve bene alla maggior parte dei casi d'uso.

Verifica frequentemente l'integrità dei tuoi backup

I tuoi backup sono utili solo se funzionano. e probabilmente preferiresti non scoprirlo mentre sei nel mezzo di un incidente cercando di recuperare i dati. Il semplice rimedio a questo è verificare frequentemente che i backup funzionino effettivamente eseguendo ripristini di prova ogni tanto. Un buon modo per farlo è impostare un evento del calendario ogni pochi mesi per eseguire una procedura di ripristino per garantire che i backup funzionino ancora come previsto. Inoltre, anche la documentazione delle fasi di ripristino del database è una buona idea: meno congetture quando si risponde a un incidente, meglio è.

Archivia i tuoi backup in modo sicuro

Non conservare mai i backup del tuo sito WordPress sul tuo server web o database (specialmente sul tuo server web). I backup sono un ottimo posto in cui gli aggressori possono immergersi nei cassonetti. È altamente consigliabile archiviare i backup in una posizione fuori sede sicura. Se stai effettuando dump periodici del database, valuta la possibilità di archiviare i dump del database su un servizio di archiviazione oggetti. Questi possono includere Amazon S3, Cloudflare R2, DigitalOcean Spaces, Linode Object Storage, ecc. Prendere questa strada può essere un ottimo modo economico per archiviare i backup del database. Tuttavia, fai molta attenzione a non rendere accessibile pubblicamente il bucket di archiviazione che stai utilizzando.

Abilitare e applicare le connessioni TLS

A meno che tu non stia eseguendo MySQL sulla stessa macchina del tuo server web (che, come abbiamo già spiegato in precedenza, non è una pratica di sicurezza ideale), si consiglia vivamente di crittografare i dati tra WordPress e MySQL utilizzando Transport Layer Security (certificato TLS), precedentemente denominato Secure Socket Layer (certificato SSL).

Per impostazione predefinita, quando installi MySQL, genererà automaticamente un certificato autofirmato. Puoi verificarlo eseguendo quanto segue (in alternativa, puoi utilizzare lo script mysql_ssl_rsa_setup per generare nuovi certificati).

Dovrai copiare ca.pem dall'elenco precedente (ad esempio, tramite SCP) sul server che esegue il tuo sito Web WordPress. Dopo aver caricato il file ca.pem sul tuo server WordPress, dovrai spostare il certificato nell'archivio di attendibilità dei certificati del sistema operativo e aggiornare l'archivio di attendibilità dei certificati come segue.

Attenzione, il nome file del certificato CA deve terminare con un'estensione file .crt (ad esempio mysql-ca.crt è valido, ma mysql-ca.pem.crt o mysql-ca.pem non sono validi).

sudo mv ca.pem /usr/local/share/ca-certificates/mysql-ca.crt
sudo update-ca-certificati

Successivamente, è necessario configurare WordPress per utilizzare TLS durante la connessione a MySQL aggiungendo quanto segue al file wp-config.php dell'installazione di WordPress.

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Una volta aggiornato wp-config.php, WordPress avvierà le connessioni al tuo server MySQL utilizzando TLS.

Successivamente, si consiglia di applicare le connessioni TLS al server MySQL utilizzando la variabile di sistema require_secure_transport aggiungendo quanto segue al file /etc/mysql/mysql.conf.d/mysqld.cnf.

require_secure_transport = ON

Infine, riavvia MySQL per rendere effettive le modifiche.

systemctl riavvia mysql

Cambia il prefisso della tabella

Per impostazione predefinita, tutte le tabelle di WordPress vengono create con il prefisso 'wp_'. Ciò può rendere più facile per gli aggressori il successo di determinati attacchi, come l'iniezione SQL, poiché conoscerebbero i nomi delle tabelle del database. Anche se questo da solo non ti proteggerà, è un esercizio semplice, consigliato da molti come la migliore pratica di sicurezza di WordPress.

È possibile modificare il prefisso del database durante il processo di installazione o in qualsiasi momento successivo, sebbene quest'ultimo sia leggermente più complesso. In ogni caso, puoi trovare tutorial online su come modificare il prefisso del database di WordPress.

Come implementare le modifiche

Si spera che questo articolo ti abbia fornito una panoramica del rafforzamento della sicurezza di MySQL nel contesto della gestione di un sito Web WordPress. Sebbene non ci siano proiettili d'argento nella sicurezza del sito Web, con un certo sforzo, adottare un approccio alla sicurezza a più livelli e in profondità renderà l'attacco al tuo sito Web molto più difficile per gli aggressori.
Sebbene questa guida presenti una serie di tecniche di rafforzamento per MySQL, MySQL è solo un componente dell'ecosistema WordPress. Pertanto, dovresti considerare anche altri aspetti della sicurezza di WordPress trattati nella nostra guida al rafforzamento della sicurezza di WordPress. Questo, insieme a comprovate misure di sicurezza come l'autenticazione a due fattori di WordPress, ti aiuterà a garantire la massima sicurezza possibile.

Se ti sembra molto da assorbire, ricorda che puoi (e probabilmente dovresti) applicare gradualmente le varie tecniche di indurimento trattate in questa guida.

Mantenere il tuo WordPress sicuro

Tieni presente che gli aggressori sono spesso alla ricerca di bersagli flessibili poiché non devono impegnarsi molto per sfruttare i siti Web scarsamente protetti. Essere un passo avanti rispetto alla posizione di sicurezza del prossimo sito Web WordPress ti rende un obiettivo meno attraente.