Tanti di voi si saranno ritrovati nella situazione di dover creare utenti o database, di dover permettere l'accesso di alcuni utenti a dei specifici database, senza poter agire sugli altri, o ancora di dover dare l'accesso ad uno script o ad un client per l'amministrazione dall'esterno al server MySQL.
Questo Rdbms ha una gestione estremamente flessibile e nello stesso tempo semplice per quanto riguarda l'amministrazione di database e utenti e dei relativi permessi. MySQL permette la gestione dei permessi nel dettaglio, è infatti possibile specificare, colonna per colonna, cosa l'utente può fare o non può fare.
L'articolo non vuole essere una spiegazione dettagliata di come gestire database, utenti e permessi di questi, ma soltanto un'introduzione per chi si trova a dover lavorare con questo software per la prima volta.
Requisiti
È necessario avere installato un server Myql, ed un client di accesso, come phpMyAdmin, MySQL-Front o altri, per poter eseguire delle query sul server.
È comunque possibile utilizzare il client da linea di comando di MySQL, che si chiama mysql, che trovate su windows nella cartella bin della cartella d'installazione di MySQL, su Linux, invece, dovrebbe essere possibile richiamarlo direttamente da console se lo avete installato tramite un pacchetto RPM, DEB, TGZ, o altri in base alla distribuzione, altrimenti, come per Windows, l'eseguibile è disponibile all'interno della cartella bin presente nella cartella di installazione di MySQL.
Gestione di Database
Creare un database su MySQL è molto semplice semplice e basta una sola riga di comando:
CREATE DATABASE [IF NOT EXISTS] db_name
Com'è possibile intuire, il comando non fa altro che dire a MySQL di creare il database di nome db_name. Ovviamente al posto di db_name va inserito il nome del database da creare, altrimenti verrà creato il database db_name. Nel comando è possibile specificare la clausola IF NOT EXISTS, la quale indica al server di creare il database soltanto se questo non esiste già.
Eliminare database è altrettanto semplice:
DROP DATABASE [IF EXISTS] db_name
Anche qui db_name corrisponde al nome del database da eliminare. Come per l'istruzione CREATE DATABASE, è presente una clausola che indica a MySQL di eliminare il database solamente se esiste, ovvero IF EXISTS.
Le clausole IF NOT EXISTS, di CREATE DATABASE, e IF EXISTS, di DROP DATABASE, sono molto utili quando si preparano blocchi di query da eseguire, infatti, se il database dovesse esistere già, o non dovesse esistere, nel caso di DROP TABLE, si riceverebbe un errore e quindi l'esecuzione delle query verrebbe immediatamente interrotta mentre, utilizzando queste clausole, non verrà restituito nessun errore e queste istruzioni verranno processate senza alcun problema.
Gestione Utenti
Creare utenti in MySQL è molto semplice, e, molto spesso, il client di amministrazione supporta queste funzionalità, ma è bene sapere com'è possibile gestirli da MySQL.
Per aggiungere, modificare o rimuovere un utente ci sono due sistemi:
- Il primo consente di creare, disabilitare e modificare gli utenti, le password e i permessi con una sola query, tramite l'utilizzo dei comandi GRANT e REVOKE. Questo sistema, però, non permette di rimuoverli, ma solo di disabilitarli.
- Il secondo, sicuramente più lungo e complesso, permette di capire, bene, come MySQL gestisce le informazioni all'interno
Di seguito tratteremo soltanto il primo sistema per gestire gli utenti.
La sintassi di GRANT è la seguente:
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON {* | *.* | db_name.* | db_name.tbl_name}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
Per utilizzare l'istruzione GRANT è quindi necessario elencare i permessi da dare all'utente, e questi possono essere:
- a livello GLOBALI, quando nella clausola ON viene specificato *.*
- a livello di DATABASE, quando nella clausola ON viene impostato nome_database.*
- a livello di TABELLA; quando viene utilizzato nella clausola ON nome_database.nome_tabella
La gestione dei permessi sarà trattata nel paragrafo successivo, al momento utilizzeremo soltanto il privilegio ALL, che comprende tutti i privilegi che possono essere acquisiti da un utente.
La clausola TO permette di impostare quale deve essere l'utente che deve ricevere i permessi e supporta. Inoltre è anche possibile cambiare la password di accesso direttamente utilizzando IDENTIFIED BY 'nuova_password'.
Ovviamente si possono specificare più permessi ed è anche possibile specificare più utenti, ed a ogni utente è possibile impostare una password diversa. Nel caso vengano inseriti più utenti, questi riceveranno tutti gli stessi permessi. È anche possibile indicare da quale host l'utente si può connettere, inserendo @nome_host subito dopo il nome utente. Se non verrà impostato l'host l'utente potrà connettersi da qualsiasi host.
Se, ad esempio, vogliamo creare l'utente myuser, impostando la password a mytest, e a questo vogliamo dare accesso solo al database test, basterà digitare:
GRANT ALL ON test.* TO myuser@localhost IDENTIFIED BY 'mytest';
Come detto in precedenza è possibile eliminare gli utenti o revocare i permessi tramite il comando REVOKE:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON {* | *.* | db_name.* | db_name.tbl_name}
FROM user [, user] ...
Come per il comando GRANT, tratteremo la gestione dei permessi nel paragrafo successivo.
Per eliminare un utente è sufficiente revocargli tutti i permessi da tutti i database a cui ha accesso. Per questo comando vale quanto detto per il comando GRANT, con l'unica differenza sulla clausola FROM, nella quale è presente l'elenco di utenti ai quali revocare i permessi. Anche qui, se nel nome utente è presente @nome_host, verranno revocati i permessi ad uno specifico utente che può accedere dall'host passato.
Se volessimo disabilitare l'utente myuser possiamo revocare i permessi tramite
REVOKE ALL ON test.* FROM myuser@localhost;
In questo modo l'utente user, sebbene fisicamente ancora esistente, è praticamente disabilitato, poiché non può accedere a nessun database, in nessun modo.
Gestione Permessi
Come detto in precedenza, MySQL offre una gestione dei permessi molto flessibile ed efficiente. Le nuove versioni permettono anche di limitare le risorse utilizzabili da un utente o di attivare solo l'accesso protetto, tramite SSL, al database. Quest'ultima caratteristica è importante utilizzarla quando si da accesso esterno a dei client che trattano dati riservati presenti nei database a cui si ha accesso.
Per la gestione dei permessi è possibile:
- utilizzare i comandi GRANT e REVOKE, per dare o revocare permessi ad un utente
- inserire, modificare o eliminare i record dalle tabelle apposite presenti nel database mysql
Come per la gestione utenti, tratteremo soltanto il primo metodo.
L'elenco di permessi disponibile varia da versione a versione, i vari esempi sono stati testati su MySQL 4.0 e superiori, quindi, se non dovessero funzionare accertatevi che state utilizzando una versione pari o superiore ad una 4.0 di MySQL.
I privilegi fondamentali, ovvero quelli più usati, sono:
- SELECT, per dare la possibilità ad un utente di leggere dei dati
- INSERT, per permettere l'inserimento di record
- UPDATE, che abilita l'utente a modificare i dati presenti nei record delle tabelle
- DELETE; che permette di eliminare i record
I permessi, combinati tra loro, possono dare la possibilità di eseguire altri comandi, che non hanno un permesso diretto, ma derivato, ovvero che le operazioni che andrà a svolgere il comando saranno attivabili solo quando l'utente che lo esegue ha una serie ben precisa di permessi.
Altri permessi molto utili sono:
- CREATE, che permette di creare entità come DATABASE o TABELLE. Se viene abilitato il permesso a livello GLOBALE, il CREATE, permetterà la creazione di DATABASE e TABELLE, mentre se viene abilitato a livello DATABASE, verrà soltanto abilitata la creazione di TABELLE in quello specifico database.
- DROP, da la possibilità di eliminare DATABASE o TABELLE. Vale quanto detto per il privilegio CREATE.
Se al nostro utente myuser volessimo adesso dare accesso in lettura, scrittura e modifica ai dati del database test dovremmo eseguire:
GRANT SELECT, INSERT, UPDATE ON test.* TO myuser@localhost
Per disabilitare, invece, la possibilità dell'utente di modificare ed inserire records, basterebbe digitare:
REVOKE INSERT, UPDATE ON test.* FROM myuser@localhost
Attenzione, è importante utilizzare sempre la stessa accoppiata nome utente e host, altrimenti verrà creato un nuovo utente o ne verrà modificato un altro rispetto a quello sul quale si ci vuole agire.
Links utili
Esistono tantissimi guide che trattano questi argomenti, ma vi consiglio di leggere ciò che dice il manuale di MySQL in proposito: