back to top

Gestire utenti e permessi in MySQL con GRANT e REVOKE

Abbiamo visto che, non appena installato MySQL, questo è gevernato da un unico utente con privilegi illimitati: l’utente root, infatti, è l’amministratore del nostro server MySQL e come tale può fare qualsiasi cosa al suo interno.

Normalmente, tuttavia, quando si amministra un server MySQL è buona norma NON utilizzare sempre l’utente root: se si crea un’applicazione che utilizza uno specifico database, ad esempio, è corretto creare ed utilizzare per questa un utente specifico con privilegi limitati al singolo database utilizzato e circoscritti alle specifiche esigenze di produzione.

Una simile prassi garantisce la sicurezza e la stabilità del sistema nonché l’integrità e la riservatezza dei dati in esso archiviati: eventuali "falle" nella sicurezza di una specifica applicazione, infatti, non comprometteranno l’intero sistema ma solo uno specifico database (o addirittura singole tabelle).

In questa lezione vedremo, quindi, come creare nuovi utenti e come gestire permessi e privilegi su specifici database o tabelle. MySQL è molto flessibile a riguardo e ci viene incontro tramite gli statement GRANT e REVOKE.

Creare utenti e assegnare permessi in MySQL: il comando GRANT

Il comando GRANT permette allo stesso tempo di creare un utente e di assegnargli dei permessi specifici. Vediamone la sintassi:

GRANT <istruzioni_consentite>
ON <database>.<tabella>
TO <utente>@<host>
IDENTIFIED BY <password>;

Se l’utente non esiste, GRANT consente di crearlo. In caso contrario il comando si limiterà ad assegnargli nuovi permessi e/o privilegi.

Come potete vedere la sintassi qui proposta è molto semplice, ma spiegamone comunque i singoli campi:

  • istruzioni_consentite: E’ una lista di istruzioni di SQL che si vogliono permettere all’utente (CREATE, SELECT, UPDATE, DELETE, ALTER, DROP, ecc..). Se si vuole dare all’utente permessi completi si può utilizzare la parola chiave "ALL".
  • database: E’ il nome del database sul quale l’utente potrà eseguire le istruzioni consentite. Se si vuole fare riferimento a tutti i database del sistema si può utilizzare il carattere asterisco (*).
  • tabella: Specificando il nome di una tabella, si fa riferimento solo ad essa: i permessi dell’utente, quindi, riguarderanno solo questa tabella e non le altre presenti nel database. Se si vuole fare riferimento a tutte le tabella si può utilizzare il carattere asterisco (*).
  • utente: Specifica il nome dell’utente che vogliamo creare o al quale vogliamo assegnare nuovi permessi.
  • host: Specifica il/gli host da cui è ammessa la connessione.
  • password: Specifica la password associata all’utente che stiamo creando. La password va scritta "in chiaro". Se si desidera inserire la password in forma criptata tramite la funzione PASSWORD() di MySQL, si deve far precedere la stringa criptata dalla parola PASSWORD.

Per non rimanere troppo in ambito teorico, vediamo ora un esempio pratico. Immaginiamo di stare gestendo un database per una sala cinematografica. Immaginiamo, con grandissima fantasia, che questo database si chiami "cinema" e che il gestore del sistema voglia suddividere gli accessi in tre livelli di utenti secondo questa logica:

  • amministratori: gli amministratori possono leggere e modificare i dati delle tabelle; inserire nuovi record; creare e cancellare tabelle e alterarne la struttura di quelle già esistenti.
  • editori: questi utenti possono inserire, leggere, modificare e cancellare i dati (record) delle tabelle. Non possono però creare nuove tabelle, cancellare le tabelle esistenti o alterarne la struttura.
  • visitatori: questo tipo di utenti ha accesso in lettura a tutto il database ma non ha in nessun caso i permessi di scrittura. Questi utenti possono solo leggere i record delle varie tabelle, senza alterarli in nessun modo..

Vediamo ora come tutto ciò si traduce in codice SQL.

Partiamo dall’utente con più restrizioni, cioè il visitatore:

GRANT SELECT
ON cinema.*
TO 'visitatore'@'%'
IDENTIFIED BY 'password_visitatore';

Agli utenti di livello più basso (visitatori) abbiamo assegnato il privilegio di lettura (comando SELECT) su tutte le tabelle del database "cinema" (cinema.*). Abbiamo altresì previsto che questo utente possa accedere senza alcuna restrizione di host (@’%’) stante la limitatezza dei suoi privilegi.

Vediamo ora come creare gli utenti di livello intermedio, cioè gli editori:

GRANT SELECT, INSERT, UPDATE, DELETE
ON cinema.*
TO 'editore'@'localhost'
IDENTIFIED BY 'password_editore';

In questo caso i permessi assegnati mediante GRANT sono più di uno (li abbiamo elencati separandoli con la virgola) ed anche in questo caso abbiamo previsto che questa tipologia di utenti possa operare su tutte le tabelle del database. Per maggiore sicurezza abbiamo ristretto l’accesso di questi utenti unicamente al localhost: eventuali tentativi di accesso al database effettuati da remoto verranno respinti.

Vediamo infine come creare l’utente amministratore:

GRANT ALL
ON cinema.*
TO 'admin'@'123.123.123.123'
IDENTIFIED BY 'password_admin';

In questo caso al comando GRANT segue la keywork "ALL" che sta a significare che questo utente può fare qualsiasi cosa ("ALL" comprende tutti i permessi ad esclusione di GRANT e REVOKE che devono essere assegnati esplicitamente mediante la keyword "GRANT OPTION"), ma il suo perimetro d’azione è circoscritto al database "cinema", ovviamente. Per una maggior sicurezza abbiamo previsto che l’utente amministratore possa accedere con successo solamente se la connessione avviene da uno specifico IP (ad esempio quello "fisso" della nostra postazione).

Alcune considerazioni in merito a permessi e privilegi

Abbiamo già detto che, per questioni di sicurezza, è buona norma limitare il più possibile il campo d’azione degli utenti. In tal senso è preferibile evitare il ricorso alla keyword "ALL" quando non è strettamente indispensabile. Nella stragrande maggioranza dei casi, infatti, i permessi SELECT, INSERT, UPDATE, DELETE sono più che sufficienti.

Da assegnare con cautela i permessi che consentono di operare sulla struttura del database (come ALTER e DROP) nonché, ovviamente, il permesso che consente di creare nuovi utenti ed assegnare (o rimuovere) permessi o privilegi (GRANT OPTION).

Rimuovere i permessi ad un utente MySQL

Vediamo ora l’istruzione REVOKE che svolge la funzione opposta a GRANT, e cioè rimuovere permessi. Ne vediamo solo la sintassi in quanto molto simile all’istruzione GRANT:

REVOKE <istruzioni_revocate>
ON <database>.<tabella>
FROM <utente>@<host>

per la quale valgono le stesse regole sopra viste per GRANT.

Per un’azione globale è possibile utilizzare:

REVOKE ALL PRIVILEGES, GRANT OPTION
FROM <utente>@<host>

Quest’ultima sintassi elimina ogni permesso dell’utente su qualunque database del sistema.

Una raccomandazione importante nell’utilizzo di REVOKE: assicuratevi di utilizzare sempre la stessa accoppiata nome utente e host, in caso contrario verrà creato un nuovo utente e non verrà modificato quello sul quale si desidera agire.

Verificare i permessi di un utente

Se vogliamo verificare quali sono i privilegi di uno specifico utente, potremo utilizzare questa sintassi:

SHOW GRANTS FOR 'editore'@'localhost';

Se vogliamo conoscere i privilegi dell’utente col quale siamo attualmente loggati al MySQL sarà sufficiente utilizzare:

SHOW GRANTS FOR CURRENT_USER;

Cancellare un utente da MySQL

Attraverso il comando DROP USER è possibile rimuovere un utente da MySQL: è bene precisare, tuttavia, che questo comando rimuove l’utente ma non i suoi permessi. Un modo corretto di operare, quindi, consiste nel rimuovere pirma tutti i permessi dell’utente e cancellarlo solo dopo aver fatto ciò.

Quindi, per prima cosa utiliziamo:

REVOKE ALL PRIVILEGES, GRANT OPTION
FROM 'editore'@'localhost'

dopodiché passiamo alla rimozione dell’utente dalla tabella user di MySQL:

DROP USER 'editore'@'localhost'
Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

In questa guida...