Migliori Pratiche per l'Indurimento delle Configurazioni di Sicurezza del Server MySQL

Proteggi le tue implementazioni MySQL critiche con questa guida completa alle pratiche essenziali per l'indurimento della sicurezza. Impara come implementare una gestione robusta degli utenti e degli accessi, proteggere le connessioni di rete con firewall e SSL/TLS, ottimizzare `my.cnf` per una sicurezza ottimale e applicare protezioni a livello di sistema operativo. Scopri suggerimenti pratici di configurazione e passi attuabili per mitigare le vulnerabilità comuni, prevenire l'accesso non autorizzato e garantire l'integrità e la riservatezza del tuo database. Una lettura obbligata per chiunque sia responsabile della sicurezza MySQL.

30 visualizzazioni

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