Ogni volta che viene menzionata la sicurezza delle applicazioni, la gente pensa di proteggere le applicazioni da alcuni degli attacchi più frequenti come injection, autenticazione non riuscita, esposizione di dati sensibili e simili. Tuttavia, sebbene questi attacchi siano prevalenti, sapere come proteggere la tua applicazione da soli non sarà sufficiente, specialmente quando esegui MySQL. Oggi esamineremo un altro lato della sicurezza:esamineremo come proteggere correttamente MySQL.
Dato che la sicurezza di MySQL è piuttosto importante, considera questo post come l'inizio di una serie di post sulle misure di sicurezza di MySQL. Non tratteremo tutto, ma questo post dovrebbe fornire le basi di alcune delle misure di sicurezza di MySQL.
Perché è necessario proteggere MySQL?
Prima di tutto, dobbiamo rispondere alla domanda sul perché vorremmo proteggere MySQL. Dopotutto, se proteggiamo la nostra applicazione contro le minacce più diffuse, dovremmo essere al sicuro, giusto? Bene, sì e no.
Vedi, quando proteggi la tua applicazione da determinati attacchi, ti assicuri che gli aggressori abbiano più difficoltà a penetrare le difese della tua applicazione - per proteggere il tuo database, tuttavia, la protezione contro tali attacchi sarà non essere sufficiente. La protezione del database potrebbe essere l'ultima goccia che potrebbe salvare la tua applicazione (e il tuo database!) dalla distruzione.
Come posso proteggere MySQL?
Ora, sulla domanda scottante. Come si protegge effettivamente MySQL?
Quando pensi alla sicurezza delle tue istanze MySQL, dovresti considerare un'ampia gamma di opzioni possibili. Fortunatamente, alcune di queste opzioni non sono nemmeno limitate a MySQL, il che significa che saranno applicabili anche in altri scenari! Inizieremo con le cose generali.
Sicurezza MySQL - Generale
Quando proteggi MySQL, tieni presente che utilizza le liste di controllo degli accessi (ACL) basate sulla sicurezza per le operazioni eseguite dagli utenti (le liste di controllo degli accessi sono un elenco di autorizzazioni associate a un oggetto). Ecco come risolvere un paio dei problemi di sicurezza più basilari:
- Proteggi l'account MySQL iniziale:è molto ovvio, ma dovresti assicurarti che l'account root abbia una password. L'account di root può avere o meno una password quando MySQL viene installato per la prima volta:puoi capire qual è la password controllando il registro degli errori, quindi cambiarla con una più forte se lo desideri. Anche tutti gli altri account dovrebbero avere password.
- Non archiviare mai le password all'interno di database MySQL in testo normale:utilizza una funzione di hashing unidirezionale come BCrypt.
- Non concedere a nessun utente l'accesso alla tabella degli utenti nel database mysql (l'utente root è un'eccezione).
Inoltre, familiarizza con il controllo degli accessi e la gestione degli account in MySQL. Questo argomento merita un intero libro in sé e per sé, ma le cose di base che dovresti sapere includono:
- Controllare l'accesso in MySQL;
- Creazione, modifica e rimozione di utenti;
- Concessione e revoca di privilegi a e da utenti;
- Sapere come controllare quali privilegi vengono assegnati;
- Cosa sono le categorie di account;
- Cosa sono gli account riservati;
- Cosa sono i ruoli;
- Come funziona la gestione delle password;
- Come funziona il blocco dell'account;
- Dare uno sguardo ai plugin di sicurezza offerti da MySQL;
- Sapere come proteggere i backup MySQL.
Per quanto riguarda la sicurezza di MySQL, dovrebbero essere coperti anche i backup.
Ora esamineremo ulteriormente ciascuna di queste opzioni.
Controllo dell'accesso in MySQL
- Come già notato sopra, non concedere mai ad alcun account, eccetto l'account root, l'accesso alla tabella utente nel database mysql;
- Assicurati che tutti gli account MySQL esistenti utilizzino solo i privilegi di cui hanno assolutamente bisogno per eseguire le loro azioni.
Creazione, modifica e rimozione di utenti in MySQL
In MySQL, gli utenti possono essere creati eseguendo la query CREATE USER:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Gli utenti possono essere modificati eseguendo la query ALTER USER:la query ti consente di eseguire molte cose diverse, tra cui il blocco e lo sblocco di account, la richiesta all'account di connettersi tramite SSL, stabilire la quantità massima di connessioni all'ora, eliminare le vecchie password, ecc. Ecco una query di esempio che può modificare la tua password:
ALTER USER USER() IDENTIFIED BY ‘password’;
Gli utenti possono essere rimossi eseguendo la query DROP USER:
DROP USER ‘demouser’@’localhost’;
Concessione e revoca di privilegi a e da utenti in MySQL
L'istruzione GRANT deve concedere privilegi o ruoli. L'istruzione ON è in grado di dirti se verranno concessi privilegi o ruoli. La seguente query concede privilegi:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
La query seguente assegna i ruoli:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT dovrebbe rispondere con Query OK, 0 righe interessate.
Per revocare determinati privilegi agli utenti, utilizzare l'istruzione REVOKE (la parte del nome host del nome dell'account è impostata su "%"):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Per revocare tutti i privilegi, è possibile utilizzare REVOKE ALL:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Potresti voler emettere un FLUSH PRIVILEGES; dichiarazione dopo aver eseguito i passaggi precedenti.
Verifica quali privilegi vengono assegnati in MySQL
- Per verificare quali privilegi vengono assegnati, emetti gli SHOW GRANTS; dichiarazione.
- Per ogni richiesta che viene emessa, il server determina l'operazione che vuoi eseguire, quindi controlla se i tuoi privilegi sono sufficienti per eseguire l'operazione in questione.
- Il server utilizza le tabelle user e db nel database mysql per garantire il controllo dell'accesso.
- Le tabelle user e global_grants concedono privilegi globali.
Il resto delle opzioni sarà trattato nei prossimi post.
Riepilogo
Per quanto riguarda la sicurezza di MySQL, hai una gamma molto ampia di opzioni tra cui scegliere. Le opzioni includono misure di sicurezza di base che possono essere applicabili praticamente a tutte le applicazioni, ma alcune opzioni sono piuttosto specifiche per MySQL. Tieni presente che non tutte le opzioni disponibili sono state ancora trattate:se ne parlerà anche nelle prossime edizioni della serie di sicurezza MySQL.