Migliori Pratiche per la Sicurezza delle Configurazioni del Server MySQL
MySQL è una colonna portante per innumerevoli applicazioni, che alimenta tutto, dai piccoli blog ai massicci sistemi aziendali. La sua popolarità, pur essendo una testimonianza della sua robustezza e flessibilità, lo rende anche un bersaglio frequente per attori malevoli. Un server MySQL mal configurato o non protetto può rappresentare una vulnerabilità significativa, esponendo dati sensibili e fornendo un gateway per l'accesso non autorizzato all'intera infrastruttura. Proteggere la tua implementazione MySQL non è un compito una tantum, ma un impegno continuo che richiede vigilanza e aderenza alle migliori pratiche di sicurezza.
Questo articolo fornisce una guida completa a suggerimenti di configurazione essenziali e misure di rafforzamento della sicurezza. Approfondiremo vari livelli di sicurezza, dalla gestione degli utenti e la protezione della rete alle modifiche dei file di configurazione e alle considerazioni sul sistema operativo. Implementando queste raccomandazioni, puoi ridurre significativamente la superficie di attacco del tuo server MySQL e costruire un ambiente di database più resiliente contro vulnerabilità comuni e tentativi di accesso non autorizzato.
1. Gestione Utenti e Accessi: Il Principio del Privilegio Minimo
Una gestione efficace degli utenti è fondamentale per la sicurezza di MySQL. Concedere agli utenti solo i permessi strettamente necessari è di primaria importanza.
Creare Utenti Specifici per Applicazioni Specifiche
Evitare di utilizzare l'utente root per le connessioni delle applicazioni. Invece, crea utenti dedicati con permessi granulari.
CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `your_database`.* TO 'my_app_user'@'localhost';
FLUSH PRIVILEGES;
Imporre Password Robuste
Password robuste e univoche sono la tua prima linea di difesa. Utilizza il plugin di validazione password integrato di MySQL, se disponibile.
- Complessità: Combina maiuscole, minuscole, numeri e simboli.
- Lunghezza: Punta ad almeno 12-16 caratteri.
- Unicità: Non riutilizzare mai le password.
- Rotazione: Implementa una policy per cambi regolari delle password.
Puoi abilitare il componente validate_password (MySQL 8.0+) o il plugin (MySQL 5.7+):
INSTALL COMPONENT 'file://component_validate_password';
-- OPPURE per versioni più vecchie
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- Configura la politica di robustezza (es. MEDIUM per 8+ caratteri, misti maiuscole/minuscole, numeri, speciali)
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
Rimuovere Utenti Predefiniti e Inutilizzati
MySQL viene fornito con utenti predefiniti (es. root@localhost). Sebbene root@localhost sia necessario, assicurati che abbia una password robusta. Criticamente, rimuovi o proteggi altri utenti predefiniti come mysql.session, mysql.sys e l'utente anonimo se non sono esplicitamente necessari e configurati correttamente.
-- Per identificare gli utenti anonimi:
SELECT user, host FROM mysql.user WHERE user = '';
-- Per eliminare un utente anonimo (se trovato):
DROP USER ''@'localhost';
-- Per rimuovere i database di test (se esistono):
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;
Limitare l'Accesso Host
Limita gli account utente a connettersi solo da specifici indirizzi IP o nomi host. Evita di usare % come wildcard per l'host a meno che non sia assolutamente necessario e abbinato ad altri forti controlli di sicurezza.
-- L'utente può connettersi solo da localhost
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AnotherStrongPass!';
-- L'utente può connettersi solo da un indirizzo IP specifico
CREATE USER 'backup_user'@'192.168.1.100' IDENTIFIED BY 'BackupPass!';
Prestare Attenzione a GRANT OPTION
La clausola WITH GRANT OPTION consente a un utente di concedere i propri privilegi ad altri utenti. Questo può essere un rischio significativo per la sicurezza se concesso a utenti non fidati. Usala con parsimonia e solo per account amministrativi che richiedono veramente questa capacità.
-- Un utente con la capacità di concedere privilegi (usare con estrema cautela)
GRANT ALL PRIVILEGES ON *.* TO 'superadmin'@'localhost' IDENTIFIED BY 'SuperAdminPass!' WITH GRANT OPTION;
2. Sicurezza di Rete: Isolare il Tuo Database
I controlli a livello di rete sono fondamentali per impedire l'accesso esterno non autorizzato al tuo server MySQL.
Configurare i Firewall
Consenti le connessioni alla porta predefinita di MySQL (3306) solo da indirizzi IP o reti fidate. Blocca tutte le altre connessioni in entrata a questa porta.
Esempio (UFW su Linux):
sudo ufw enable
sudo ufw allow from 192.168.1.0/24 to any port 3306
sudo ufw deny 3306
sudo ufw status
Esempio (CentOS/RHEL con firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --permanent --remove-port=3306/tcp --zone=public # Assicurati che non sia aperto globalmente
sudo firewall-cmd --reload
Proteggere le Connessioni con SSL/TLS
Crittografa tutto il traffico tra client e server MySQL utilizzando SSL/TLS per prevenire attacchi di intercettazione e Man-in-the-Middle (MitM). Questo è particolarmente cruciale per le connessioni su reti non fidate.
Per abilitare SSL/TLS, di solito è necessario generare certificati e chiavi SSL, quindi configurare il tuo my.cnf:
```ini
my.cnf
[mysqld