Le 7 migliori pratiche di sicurezza MySQL per proteggere il tuo database
Sette controlli pratici di sicurezza MySQL per il controllo degli accessi, l'esposizione di rete, TLS, la gestione delle patch, la registrazione e la crittografia.
Le 7 migliori pratiche di sicurezza MySQL per proteggere il tuo database
La sicurezza di MySQL inizia con la riduzione di chi può connettersi, cosa può fare e cosa viene esposto se un host viene compromesso. I sette controlli seguenti forniscono una base pratica per i database di produzione, senza fingere che una singola impostazione possa rendere MySQL "sicuro".
1. Gestione sicura dell'accesso degli utenti
Controllare chi può accedere al tuo database e cosa può fare è la prima linea di difesa. Ciò comporta la creazione di account utente specifici con il principio del minimo privilegio, il che significa che gli utenti dovrebbero avere solo le autorizzazioni necessarie per svolgere le loro attività.
Crea account sicuri
Evita utenti applicativi condivisi e password deboli. Usa mysql_secure_installation sui server autogestiti per rimuovere utenti anonimi, rimuovere il database di test dove applicabile e rafforzare la configurazione iniziale dell'account root.
Concedi privilegi minimi
Usa le istruzioni GRANT per il database, la tabella e le azioni specifiche di cui la tua applicazione ha bisogno. Evita ALL PRIVILEGES per gli account applicativi.
Esempio:
CREATE USER 'webapp_user'@'10.0.10.%' IDENTIFIED BY 'usa-un-segreto-reale-qui';
GRANT SELECT, INSERT, UPDATE ON mydatabase.* TO 'webapp_user'@'10.0.10.%';
Non hai bisogno di FLUSH PRIVILEGES dopo le normali istruzioni CREATE USER o GRANT. MySQL aggiorna automaticamente le tabelle dei privilegi per queste istruzioni.
Controlla regolarmente gli account:
SELECT user, host, account_locked FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'webapp_user'@'10.0.10.%';
2. Limita l'accesso alla rete
Limita i percorsi di rete verso MySQL. L'impostazione predefinita effettiva dipende dalla versione e dal pacchetto di MySQL, quindi ispeziona il tuo server in esecuzione invece di presumere che ascolti solo in locale.
Controlla gli ascoltatori:
ss -ltnp | grep 3306
Associa MySQL a localhost quando solo i client locali hanno bisogno di accedere:
[mysqld]
bind-address = 127.0.0.1
Se i server applicativi si connettono da remoto, associa all'interfaccia privata e usa gruppi di sicurezza, firewall o ACL di rete per consentire solo a quelle sorgenti di accedere alla porta 3306.
3. Usa TLS per le connessioni
Crittografare i dati in transito impedisce intercettazioni e attacchi man-in-the-middle. MySQL supporta la crittografia SSL/TLS per le connessioni client-server.
La configurazione del server è comunemente simile a questa:
[mysqld]
ssl-ca=/percorso/del/ca.pem
ssl-cert=/percorso/del/server-cert.pem
ssl-key=/percorso/del/server-key.pem
Esempio client:
mysql -h tuo_host -u tuo_utente -p --ssl-mode=REQUIRED
Per una verifica più rigorosa, usa --ssl-mode=VERIFY_IDENTITY con un nome host che corrisponda al certificato. REQUIRED crittografa la connessione ma non verifica l'identità del server in modo altrettanto forte.
4. Mantieni MySQL aggiornato
Le vulnerabilità software vengono scoperte e corrette frequentemente. Eseguire una versione obsoleta di MySQL può esporre il tuo database a exploit noti.
Tieni traccia del flusso di rilascio che esegui, applica gli aggiornamenti di sicurezza e testa gli aggiornamenti in staging prima della produzione. Se usi un servizio di database gestito, rivedi la politica di manutenzione del provider e imposta una finestra di manutenzione che il tuo team controlli effettivamente.
5. Rafforza la configurazione del server MySQL
Oltre al binding di rete, diverse altre opzioni di configurazione possono migliorare la sicurezza.
Disabilita local_infile a meno che le tue applicazioni non abbiano bisogno di LOAD DATA LOCAL INFILE:
[mysqld]
local_infile = 0
Mantieni i file di configurazione, le chiavi TLS e le credenziali di backup leggibili solo dagli utenti di sistema appropriati. Rivedi anche i plugin installati e rimuovi quelli che non usi.
6. Controlla e monitora i log
La registrazione è fondamentale per rilevare attività sospette e per l'analisi forense dopo un incidente di sicurezza.
MySQL Enterprise include un plugin di audit log. Le distribuzioni community usano spesso log di sistema, log degli errori, log proxy, funzionalità di audit del database cloud o plugin di audit di terze parti a seconda dell'ambiente.
Come minimo, monitora:
- Accessi falliti ed errori di autenticazione.
- Nuovi utenti, privilegi modificati e istruzioni privilegiate.
- Connessioni da host imprevisti.
- Fallimenti dei lavori di backup e fallimenti dei test di ripristino.
Non lasciare abilitato il log delle query generali su un server di produzione occupato a meno che tu non abbia una specifica esigenza di risoluzione dei problemi a breve termine. Può creare un carico I/O pesante e potrebbe catturare valori sensibili delle query.
7. Proteggi i dati a riposo
Mentre SSL/TLS protegge i dati in transito, la crittografia dei dati a riposo li protegge se l'archiviazione sottostante viene compromessa.
Usa la crittografia dello storage o del volume per la base di riferimento generale. Per campi sensibili, considera la crittografia a livello di applicazione in modo che il database non contenga tutto il necessario per decrittografare i dati.
MySQL ha anche funzioni di crittografia come AES_ENCRYPT() e AES_DECRYPT(), ma non codificare le chiavi in SQL o conservarle accanto ai dati.
Esempio semplificato:
UPDATE users
SET sensitive_data = AES_ENCRYPT('informazioni_private_utente', @chiave_crittografia)
WHERE user_id = 1;
SELECT AES_DECRYPT(sensitive_data, @chiave_crittografia)
FROM users
WHERE user_id = 1;
Usa un processo di gestione delle chiavi appropriato per i sistemi reali. La crittografia senza rotazione delle chiavi, controllo degli accessi e backup del materiale delle chiavi può trasformare un incidente recuperabile in una perdita permanente di dati.
Conclusione
Inizia con i controlli che rimuovono il maggior rischio: utenti con privilegi minimi, accesso alla rete privata, TLS, patch e backup testati. Quindi aggiungi il logging di audit e i controlli di crittografia che corrispondono al tuo modello di conformità e minaccia. Rivedi la configurazione dopo ogni modifica importante dello schema, dell'infrastruttura o dell'accesso.