Mysql
 sql >> Database >  >> RDS >> Mysql

Come proteggere MySQL:parte seconda

Nel post precedente sulla sicurezza di MySQL, abbiamo trattato una gamma di opzioni che possono essere utilizzate per rendere più sicure le tue istanze MySQL. Includevano:

  • Misure di sicurezza generali di MySQL;
  • Controllare l'accesso in MySQL;
  • Creazione, modifica ed eliminazione di utenti in MySQL;
  • Concessione e revoca di privilegi a e da utenti in MySQL;
  • Verifica quali privilegi sono assegnati agli utenti in MySQL.

In questo post analizzeremo le altre opzioni, tra cui:

  • Categorie di account in MySQL;
  • Ruoli in MySQL;
  • Account riservati in MySQL;
  • Gestione delle password in MySQL;
  • Blocco dell'account in MySQL;
  • Plugin di sicurezza offerti da MySQL;
  • Protezione dei backup MySQL.

Tieni presente che ancora una volta non tratteremo assolutamente tutto ciò che devi sapere, ma cercheremo di fornire buoni punti di partenza per fare le tue ricerche.

Categorie di account in MySQL

Le categorie di account sono state introdotte in MySQL 8, in particolare in MySQL 8.0.16. Ecco il nocciolo della questione:

  • Esistono due categorie di account separate:utenti regolari e utenti di sistema;
  • Un utente normale è un utente senza il privilegio SYSTEM_USER - un utente di sistema è un utente con il privilegio SYSTEM_USER;
  • Un utente normale può modificare gli account regolari - tale utente non può modificare gli account di sistema;
  • Un utente di sistema può modificare sia gli account di sistema che quelli normali;
  • Gli account regolari possono essere modificati sia dagli utenti regolari che dagli utenti del sistema;
  • Gli account di sistema possono essere modificati solo dagli utenti di sistema.

Per utilizzare le categorie di account in MySQL dal punto di vista della sicurezza, tieni presente che il privilegio SYSTEM_USER influisce su cose come la manipolazione dell'account e l'uccisione di sessioni e istruzioni al loro interno:questo concetto in MySQL consente di limitare alcune modifiche a alcuni account rendono MySQL più sicuro. Le categorie di account possono essere utilizzate anche per proteggere gli account di sistema dalla manipolazione da parte di account normali:per farlo, non concedere privilegi di modifica dello schema mysql agli account normali.

Per concedere a un account i privilegi SYSTEM_USER, utilizza la seguente query su un account creato:

GRANT SYSTEM_USER ON *.* TO system_user;

Ruoli in MySQL

In MySQL, i ruoli sono raccolte di privilegi. Quando si concede a un account utente un ruolo in MySQL, si concedono tutti i privilegi associati a quel ruolo. I ruoli possono essere creati utilizzando l'istruzione CREATE ROLE:

CREATE ROLE ‘role_1’, ‘role_2’;

I nomi dei ruoli sono costituiti da una parte utente e una parte host:la parte utente non può essere vuota e la parte host è impostata su "%" se non è specificata.

Quando vengono creati i ruoli, dovresti assegnare loro dei privilegi. I privilegi possono essere assegnati utilizzando l'istruzione GRANT:

  • CONCEDI TUTTO SU demo_database.* A 'demo_user'; concederebbe tutti i privilegi a un utente chiamato demo_user su un database chiamato demo_database;
  • GRANT INSERT, SELECT, UPDATE, DELETE ON database.* TO 'demo_user'; concederebbe i privilegi INSERT, SELECT, UPDATE e DELETE a un utente chiamato demo_user su un database chiamato demo_database;
  • CONCEDI LA SELEZIONE SU demo_database.* A 'demo_user'; concederebbe i privilegi SELECT a un utente chiamato demo_user su un database chiamato demo_database.

Per assegnare un ruolo a un singolo utente, utilizza questa sintassi:
 

GRANT ‘role_name’ TO ‘user_name’@’localhost’;

Per assegnare più ruoli a un singolo utente, usa questa sintassi:

GRANT ‘role_1’, ‘role_2’ TO ‘user_name’@’localhost’;

Per assegnare ruoli a più utenti contemporaneamente, usa questa sintassi:

GRANT ‘role_name’ TO ‘user1’@’localhost’, ‘user2’@’localhost’;

I ruoli possono essere utili per prevenire incidenti di sicurezza perché se un utente malintenzionato conosce erroneamente la password di un utente non molto privilegiato presumendo che l'utente sia molto "potente" dal punto di vista del ruolo, la tua applicazione (e il tuo database) potrebbero essere molto ben salvato.

Account riservati in MySQL

Quando si tratta di account riservati, tieni presente che MySQL crea account durante l'inizializzazione della directory dei dati. Ci sono alcuni account che dovrebbero essere considerati riservati in MySQL:

  • 'root'@'localhost':questo account è un account superutente e ha privilegi divini su tutti i database MySQL (può eseguire qualsiasi operazione su qualsiasi database MySQL). Vale la pena notare che l'utente root può anche essere rinominato per evitare di esporre un account con privilegi elevati. Per rinominare l'account, esegui la seguente query:
RENAME USER ‘root’@’localhost’ TO ‘username’@’localhost’;
  • Assicurati di emettere un FLUSH PRIVILEGES; estratto conto dopo aver rinominato l'account per rendere effettive le modifiche.
  • 'mysql.sys'@'localhost':questo account è un utente di sistema utilizzato come definitore per la visualizzazione, le procedure e le funzioni nello schema sys. Aggiunto in MySQL 5.7.9 per evitare problemi che potrebbero sorgere se l'account root viene rinominato.
  • 'mysql.session'@'localhost':questo account viene utilizzato internamente dai plugin per accedere al server.

In questo caso, non puoi fare molto dal punto di vista della sicurezza, ma tieni presente che l'account root ha privilegi divini, il che significa che può eseguire qualsiasi operazione su qualsiasi database MySQL e fai attenzione al momento di decidere a chi concedere i privilegi per accedere all'account. Inoltre, tieni a mente a cosa servono gli altri account MySQL.

Gestione password in MySQL

MySQL supporta anche le funzioni di gestione delle password. Alcuni di essi includono:

  • La possibilità di far scadere periodicamente le password;
  • La possibilità di evitare il riutilizzo della password;
  • La possibilità di generare password;
  • La possibilità di verificare se la password in uso è complessa;
  • La possibilità di bloccare temporaneamente gli utenti dopo troppi tentativi di accesso non riusciti.

Ora esamineremo ulteriormente queste opzioni.

Per far scadere una password manualmente, usa l'istruzione ALTER USER in questo modo:

ALTER USER ‘user’@’localhost’ PASSWORD EXPIRE;

Per impostare una politica globale, modificare il file my.cnf in modo che includa il parametro default_password_lifetime. Il parametro può essere definito nella sezione [mysqld] (l'esempio seguente imposta la durata della password a 3 mesi (90 giorni)):

default_password_lifetime=90

Se vuoi che le password non scadano mai, imposta il parametro default_password_litetime su 0.
Puoi anche impostare la scadenza della password per utenti specifici. Se desideri impostare l'intervallo di scadenza della password per un utente chiamato demo_user, puoi utilizzare il seguente esempio:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;

Per disabilitare la scadenza della password:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE NEVER;

Per reimpostare la politica di scadenza della password globale:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE DEFAULT;

Le restrizioni sul riutilizzo delle password non consentono il riutilizzo delle password:per utilizzare questa funzione, utilizzare le variabili password_history e password_reuse_interval. Puoi inserire queste variabili in my.cnf osservando l'esempio seguente o impostarle in fase di esecuzione aggiungendo SET PERSIST davanti alle istruzioni seguenti.

Per vietare il riutilizzo di una qualsiasi delle 5 password utilizzate in precedenza più recenti di 365 giorni, utilizzare:

password_history=5
password_reuse_interval=365

Per richiedere un minimo di 5 modifiche alla password prima di consentirne il riutilizzo:

ALTER USER ‘demo_user’@’localhost’ PASSWORD HISTORY 5;

Lo stesso può essere fatto durante la creazione di un utente:sostituisci ALTER USER con CREATE USER.

Per generare una password casuale durante la creazione di un utente, eseguire:

CREATE USER [email protected] IDENTIFIED BY RANDOM PASSWORD;

Per cambiare la password di un utente con una generata casualmente:

SET PASSWORD FOR [email protected] TO RANDOM;

La tua password casuale verrà visualizzata sotto.

Tieni presente che le password casuali predefinite hanno una lunghezza di 20 caratteri. La lunghezza può essere controllata dalla variabile generata_random_password_length che ha un intervallo da 5 a 255.

Per verificare se una password utilizzata è complessa, puoi utilizzare la variabile VALIDATE_PASSWORD_STRENGTH:la funzione visualizza un numero da 0 a 100 con 0 il più debole e 100 il più forte:
SELECT VALIDATE_PASSWORD_STRENGTH('password');

Blocco dell'account in MySQL

MySQL 8.0.19 ha anche introdotto la possibilità di bloccare temporaneamente gli account utente. Questo può essere ottenuto utilizzando le variabili FAILED_LOGIN_ATTEMPTS e PASSWORD_LOCK_TIME.

Per abilitare il blocco dell'account durante la creazione di un utente, eseguire:

CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘password’ FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 5;

Il valore dopo FAILED_LOGIN_ATTEMPTS specifica dopo quanti tentativi falliti l'account è bloccato, il valore dopo PASSWORD_LOCK_TIME specifica il tempo di blocco dell'account in giorni. È anche possibile specificare un valore che non termina fino allo sblocco dell'account specificando PASSWORD_LOCK_TIME come UNBOUNDED.

Plugin di sicurezza offerti da MySQL

MySQL offre anche un paio di plugin che possono migliorare ulteriormente le capacità di sicurezza. MySQL offre:

  • Plugin di autenticazione;
  • Plugin di controllo della connessione;
  • Plugin di convalida delle password;
  • Plugin di controllo;
  • Plugin del firewall;

Questi plugin possono essere usati per una serie di cose dal punto di vista della sicurezza:

Plugin di autenticazione

I plugin di autenticazione possono consentire agli utenti di scegliere tra più metodi di autenticazione collegabili disponibili in MySQL. Possono essere utilizzati insieme alle istruzioni CREATE USER o ALTER USER. Ecco un esempio: 

CREATE USER ‘user_1’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;

Questa query implementerebbe l'autenticazione utilizzando il metodo di hashing della password nativo.

Plugin per il controllo della connessione

I plug-in di controllo della connessione possono introdurre un ritardo crescente nelle risposte del server ai tentativi di connessione se i tentativi di connessione superano un certo numero:sono in grado di fermare potenziali attacchi di forza bruta. Questa libreria di plugin è stata introdotta in MySQL nella versione 5.7.17 e può essere aggiunta a MySQL tramite my.cnf o caricando i plugin nel server in fase di runtime.
Per aggiungere i plugin a my.cnf , aggiungi la seguente riga sotto [mysqld]:

plugin-load-add=connection_control.so

Dopo aver modificato il file, salva le modifiche e riavvia MySQL.
Per caricare i plugin nel server in fase di esecuzione, esegui:

INSTALL PLUGIN CONNECTION_CONTROL SONAME ‘connection_control.so’;
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME ‘connection_control.so’;

Regola il suffisso .so se necessario. Se hai eseguito tutto correttamente, la tabella CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS dovrebbe contenere tutti i tentativi di connessione falliti.

Plugin di convalida delle password

I plug-in di convalida delle password possono consentire agli utenti di utilizzare password più complesse se utilizzate correttamente. Il plug-in di convalida della password può essere installato tramite my.cnf o caricando il plug-in nel server in fase di runtime. Per installare il plugin tramite my.cnf, aggiungi la seguente riga sotto [mysqld], quindi riavvia il server:

plugin-load-add=validate_password.so

Per caricare il plug-in in fase di esecuzione, eseguire la seguente istruzione:

INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;

Per caricare il plug-in in fase di esecuzione e impedirne la rimozione, aggiungi validate-password=FORCE_PLUS_PERMANENT a my.cnf.

Per impedire l'esecuzione del server se il plug-in non è inizializzato, utilizzare l'opzione --validate-password con un valore di FORCE o FORCE_PLUS_PERMANENT.

La politica di sicurezza della password può anche essere modificata:per farlo, cambia il valore validate_password_policy su LOW, MEDIUM o STRONG. Il valore di LOW controlla solo la lunghezza della password, la policy MEDIUM aggiunge alcune condizioni e la policy STRONG aggiunge la condizione che le sottostringhe delle password composte da 4 o più caratteri non devono corrispondere a parole in un file dizionario che può essere specificato modificando la variabile validate_password_dictionary_file.

Plugin per portachiavi

I plug-in Keyring possono consentire ai componenti del server e ai plug-in di archiviare in modo sicuro informazioni sensibili per il recupero. Per caricare il plugin in MySQL, aggiungi quanto segue sotto [mysqld]:

early-plugin-load=keyring_file.so

Per specificare il file del vault del portachiavi, aggiungi quanto segue (la variabile keyring_vault_config dovrebbe puntare al file di configurazione):

loose-keyring_vault_config=”/var/lib/mysql_keyring/keyring_vault.conf”

Il file del portachiavi deve contenere la variabile vault_url che definisce l'indirizzo del server del vault, la variabile secret_mount_point che definisce il nome del punto di montaggio in cui il vault del portachiavi memorizza le chiavi e un token che dovrebbe essere definito dal server del vault. Facoltativamente, è anche possibile definire la variabile vault_ca (dovrebbe puntare al certificato CA utilizzato per firmare i certificati del vault).

Riavvia il server per rendere effettive le modifiche;

Plugin di controllo

I plug-in di controllo possono abilitare il monitoraggio, la registrazione e il blocco delle attività eseguite sui server MySQL. Per installare MySQL Enterprise Audit, esegui uno script che si trova nella directory di condivisione della tua istanza MySQL (evita di inserire la password della tua istanza MySQL nel terminale - usa my.cnf):

mysql < /path/to/audit_log_filter_linux_install.sql

Puoi anche impedire la rimozione del plug-in in fase di esecuzione - aggiungi quanto segue nella sezione [mysqld]:

audit_log=FORCE_PLUS_PERMANENT

Riavvia il server per applicare le modifiche. Tieni presente che la registrazione basata su regole non registra eventi verificabili per impostazione predefinita, quindi per fare in modo che registri tutto, crea un filtro:

SELECT audit_log_filter_set_filter(‘log_filter’, ‘{ “filter”: { “log”: true } }’);

Quindi assegnalo a un account:

SELECT audit_log_filter_set_user(‘%’, ‘log_filter’);

Nota che i plug-in di audit sono disponibili solo in MySQL Enterprise Edition;

Plugin del firewall

I plug-in del firewall possono consentire agli utenti di consentire o negare l'esecuzione di istruzioni SQL specifiche in base a modelli specifici. MySQL Enterprise Firewall è stato introdotto in MySQL 5.6.24 - è in grado di proteggere i dati monitorando, avvisando e bloccando le attività non autorizzate:è in grado di bloccare attacchi SQL injection, monitorare le minacce e bloccare il traffico sospetto, nonché rilevare intrusioni in la banca dati. Il firewall è anche in grado di registrare le dichiarazioni bloccate:possono essere ispezionate e si può anche osservare un conteggio in tempo reale delle dichiarazioni approvate e rifiutate.

Per installare MySQL Enterprise Firewall, abilitalo semplicemente durante l'installazione di MySQL Server su Windows, può anche essere installato, disabilitato o disinstallato con l'aiuto di MySQL Workbench 6.3.4. Il firewall può anche essere installato manualmente eseguendo uno script nella directory di condivisione dell'installazione di MySQL. Per abilitare il firewall, aggiungi la seguente riga sotto [mysqld] e riavvia il server:

mysql_firewall_mode=ON

Il firewall può essere abilitato anche in fase di esecuzione:

SET GLOBAL mysql_firewall_mode = ON;

In alternativa, per rendere persistente il firewall (il che significa che il firewall non dovrà essere riattivato ad ogni successivo riavvio del server):

SET PERSIST mysql_firewall_mode = ON;

Quindi, concedi un privilegio FIREWALL_ADMIN a qualsiasi account che amministra il firewall e il privilegio FIREWALL_USER a qualsiasi account che dovrebbe avere accesso solo alle proprie regole del firewall. Inoltre, concedi il privilegio EXECUTE per le procedure archiviate del firewall nel database mysql. Affinché il firewall funzioni, registrare i profili con esso, quindi addestrare il firewall a conoscere le istruzioni consentite che il database può eseguire e quindi indicare al firewall di confrontare le istruzioni in arrivo con la whitelist impostata. Ogni profilo ha una modalità operativa:OFF, REGISTRAZIONE, PROTEZIONE o RILEVAMENTO. OFF disabilita il profilo, RECORDING addestra il firewall, PROTECTING consente o nega l'esecuzione delle istruzioni e DETECTING rileva (ma non blocca) i tentativi di intrusione. Le regole per un profilo specificato possono essere ripristinate impostandone il valore su RESET. OFF disabiliterà il profilo. Per impostare la modalità, utilizza la query seguente dove name è il nome del profilo e OFF è la modalità operativa: 

CALL mysql.sp_set_firewall_mode(name, ‘OFF’);

Il plug-in del firewall è disponibile anche solo in MySQL Enterprise Edition.

Protezione dei backup MySQL

Per quanto riguarda i backup MySQL, hai un paio di opzioni.

  • Se stai usando mysqldump, puoi memorizzare il tuo nome utente e password in my.cnf e invocare mysqldump in questo modo (il seguente comando scaricherà tutti i database in un file /home/backup.sql):
$ mysqldump --defaults-extra-file=/var/lib/my.cnf --single-transaction --all-databases > /home/backup.sql
  • ​Memorizzando il tuo nome utente e password all'interno di my.cnf, non scrivi la tua password all'interno del terminale:un tale metodo per eseguire i backup è più sicuro perché mentre il dump è in esecuzione il comando può essere visto tramite ps ax comando.
  • Puoi anche considerare l'utilizzo di mysqldump-secure che è uno script wrapper conforme a POSIX in grado di comprimere e crittografare i backup tenendo presente una forte sicurezza .

  • I backup possono essere crittografati utilizzando OpenSSL:è sufficiente eseguire il backup, quindi crittografarlo con il seguente comando:

    $ openssl enc -aes-256-cbc -salt -in backup.tar.gz -out backup.tar.gz.enc -k password

    Il comando sopra creerà un nuovo file crittografato backup.tar.gz.enc nella directory corrente. Il file verrà crittografato con la password che hai scelto (sostituisci la password con la password desiderata). Il file può essere decrittografato in seguito eseguendo il comando seguente:

    $ openssl aes-256-cbc -d -in backup.tar.gz.enc -out backup.tar.gz -k password

    Sostituisci la password con la tua password.

  • mysqldump ha un'altra opzione per crittografare i tuoi backup (l'esempio seguente li comprime anche con gzip):

    $ mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k password > backup.xb.enc

    Sostituisci la password con la password desiderata.

  • Puoi anche crittografare i tuoi backup usando mariabackup o xtrabackup. Ecco un esempio dalla documentazione di MariaDB:

    $ mariabackup --user=root --backup --stream=xbstream  | openssl  enc -aes-256-cbc -k password > backup.xb.enc

    Sostituisci la password con la password desiderata.

  • I backup possono anche essere crittografati utilizzando ClusterControl:se l'opzione di crittografia è abilitata per un backup particolare, ClusterControl crittograferà il backup utilizzando AES-256 CBC (la crittografia avviene sul nodo di backup). Se il backup è archiviato su un nodo controller, i file di backup vengono trasmessi in streaming in un formato crittografato utilizzando socat o netcat. Se la compressione è abilitata, ClusterControl comprimerà prima il backup, quindi lo crittograferà. La chiave di crittografia verrà generata automaticamente se non esiste, quindi archiviata all'interno della configurazione CMON nell'opzione backup_encryption_key. Tieni presente che questa chiave è codificata e deve essere prima decodificata. Per farlo, esegui il seguente comando:

    $ cat /etc/cmon.d/cmon_ClusterID.cnf | grep ^backup_encryption_key | cut -d"'" -f2 | base64 -d > keyfile.key

    Il comando leggerà la backup_encryption_key e ne decodificherà il valore in un output binario. Il file di chiavi può essere utilizzato per decrittografare il backup in questo modo:

    $ cat backup.aes256 | openssl enc -d -aes-256-cbc -pass file:/path/to/keyfile.key > backup_file.xbstream.gz

    Per ulteriori esempi, controlla la documentazione di ClusterControl.

Conclusione

In questi post sulla sicurezza di MySQL abbiamo trattato alcune misure di sicurezza che possono essere utili se ritieni la necessità di rafforzare la sicurezza delle tue istanze MySQL. Anche se non abbiamo trattato assolutamente tutto, riteniamo che questi punti possano essere un buon punto di partenza per rafforzare la sicurezza dell'installazione di MySQL. Prendi da questi post quello che vuoi, fai le tue ricerche e applica le misure di sicurezza più applicabili nella tua situazione.