Introduzione
Il controllo degli accessi e la gestione degli utenti sono due aree che possono diventare rapidamente complesse con l'aumento del numero di utenti e di diverse entità di database all'interno del sistema. Gestire molti privilegi diversi su vari oggetti di database, garantire che gli utenti che hanno le stesse responsabilità abbiano lo stesso livello di accesso e controllare e restringere l'accesso diventano tutti più difficili con il tempo.
Per aiutare a risolvere questo problema, MySQL ha un concetto chiamato "ruoli" che ti consente di raggruppare pacchetti di privilegi sotto un determinato nome, consentendoti di assegnare e modificare le impostazioni in blocco. In questa guida, esamineremo il funzionamento dei ruoli all'interno di MySQL e come utilizzarli per semplificare la gestione dell'accesso ai dati per i tuoi utenti.
Comandi
Ecco i comandi SQL primari di cui parleremo in relazione alla gestione dei ruoli MySQL.
CREATE ROLE
:IlCREATE ROLE
comando definisce un nuovo ruolo all'interno del sistema di database.DROP ROLE
:IlDROP ROLE
comando fa l'opposto, eliminando un ruolo esistente.GRANT
:LaGRANT
comando ha due scopi distinti relativi ai ruoli:aggiungere privilegi ai ruoli e aggiungere account utente come membri dei ruoli.REVOKE
:Nel contesto dei ruoli, ilREVOKE
il comando rimuove i privilegi da un ruolo e rimuove anche l'appartenenza al ruolo dagli account utente.SHOW GRANTS
:IlSHOW GRANTS
comando mostra i privilegi dell'account utente o del ruolo specificato.SET ROLE
:IlSET ROLE
comando cambia i ruoli che un account utente sta utilizzando attivamente. Ciò ti consente di stabilire quali insiemi di autorizzazioni si applicano all'account per la sessione.SET DEFAULT ROLE
:IlSET DEFAULT ROLE
Il comando definisce i ruoli che vengono applicati automaticamente quando un client accede come account utente specifico.
Privilegi richiesti
Per seguire questa guida, avrai bisogno dei seguenti privilegi:
CREATE ROLE
GRANT OPTION
CREATE USER
(per impostare i ruoli predefiniti per un altro utente)ROLE_ADMIN
(per impostare variabili di sistema che modificano il comportamento dei ruoli)SYSTEM_VARIABLES_ADMIN
(per impostare variabili di sistema che modificano il comportamento dei ruoli)
Il CREATE ROLE
privilegio è una versione minore di CREATE USER
privilegio, che consente di creare e gestire ruoli. Account che hanno già il CREATE USER
privilegio disporrà automaticamente di tutte le funzionalità richieste per gestire i ruoli.
L'GRANT OPTION
privilegio è necessario per assegnare privilegi a un ruolo. Devi avere GRANT OPTION
abilitato per tutti i privilegi che desideri assegnare a un ruolo.
Cosa sono i ruoli?
In MySQL, un ruolo è un'entità che funge da contenitore o raccolta di privilegi. Gli amministratori possono assegnare privilegi ai ruoli nello stesso modo in cui assegnano privilegi agli account utente. È quindi possibile aggiungere account utente come membri del ruolo, consentendo a tali account di accedere ai privilegi associati al ruolo.
Fondamentalmente, i ruoli funzionano come un modo per raggruppare diversi privilegi correlati per semplificare la gestione dei privilegi. Invece di assicurarsi che ogni utente disponga dell'esatto livello di accesso richiesto assegnando privilegi individuali, l'utilizzo di raggruppamenti di privilegi denominati consente di gestire meno assegnazioni e di più facile comprensione.
Questo ha un chiaro vantaggio quando si assegnano i livelli di accesso, poiché è più facile assegnare uno developer
, sysadmin
o financeteam
ruolo a un utente piuttosto che gestire individualmente dozzine di privilegi. Inoltre, consente di modificare rapidamente l'accesso a più account contemporaneamente. Se crei un nuovo database per il team di vendita, puoi fornire il salesteam
l'accesso di ruolo ad esso invece di rintracciare ogni account che dovrebbe avere accesso.
Creazione di ruoli
Se hai un account con il CREATE ROLE
privilegio, puoi gestire i ruoli utilizzando il CREATE ROLE
comando.
Qual è la sintassi di MySQL per i ruoli?
I nomi dei ruoli devono seguire un formato specifico affinché MySQL li consideri validi. In molti modi, rispecchiano il formato utilizzato per definire gli account utente MySQL, ma con alcune differenze importanti.
I ruoli seguono il seguente formato:
'<role>'@'<host>'
Come gli utenti, i ruoli hanno due componenti:il nome del ruolo e l'host da cui si connette il client. Tuttavia, il modo in cui MySQL interpreta questi componenti è diverso.
Con i ruoli, il '<role>'
parte del nome non può mai essere vuota. Non esiste il concetto che un ruolo sia "anonimo" come accade con gli utenti. D'altra parte, omettendo il '<host>'
parte è ancora consentito e MySQL utilizzerà %
come ospite. Tuttavia, il %
in questo contesto viene interpretato come un carattere letterale, non un carattere jolly.
In effetti, ciò significa che, sebbene i nomi dei ruoli condividano superficialmente il formato dei nomi degli account utente, non subiscono alcun tipo di valutazione come fanno gli account utente e sono solo un'etichetta con due componenti. Il motivo per cui lo fanno hanno due parti al loro nome è che puoi creare account utente che possono funzionare sia come utenti che come ruoli. Quando vengono utilizzati come utente, i componenti sono soggetti alle regole di valutazione speciali descritte nell'articolo sulla gestione degli utenti e quando vengono utilizzati come ruolo, il nome viene semplicemente abbinato direttamente utilizzando i nomi dei componenti letterali.
A causa di queste regole, in molti casi, gli amministratori scelgono di definire i ruoli utilizzando solo il '<role>'
componente. Questo fa sì che MySQL sostituisca un letterale %
carattere per il '<host>'
componente, rendendo effettivamente quella parte del nome invisibile e irrilevante. Se non intendi utilizzare un nome sia come account utente che come ruolo, puoi fare lo stesso.
Come crei i ruoli?
Per creare nuovi ruoli, utilizza CREATE ROLE
comando.
La sintassi di base è simile alla seguente:
CREATE ROLE '<role>'@'<host>';
Puoi anche creare più ruoli contemporaneamente separando ogni nome di ruolo con una virgola:
CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Se uno dei ruoli specificati esiste già nel sistema, il comando non riuscirà con un errore.
Per evitare ciò e fare in modo che MySQL emetta solo un avviso, puoi includere IF NOT EXISTS
clausola dopo il CREATE ROLE
comando prima dei nomi dei ruoli:
CREATE ROLE IF NOT EXISTS '<role>'@'<host>';
Come accennato in precedenza, molte volte gli amministratori omettono il '<host>'
parte del nome del ruolo per semplicità, impostandolo implicitamente sul valore letterale %
carattere. Quindi, in pratica, molti dei tuoi comandi di creazione del ruolo potrebbero assomigliare di più a questo:
CREATE ROLE '<role>';
Come si concedono i privilegi a un ruolo?
Dopo aver creato nuovi ruoli, la tua prossima priorità è in genere renderli significativi concedendo loro dei privilegi.
Concedi i privilegi ai ruoli nello stesso modo in cui concedi i privilegi agli account utente. Fornisci i privilegi esatti che desideri concedere, specifichi un ambito fornendo il database e l'oggetto database in cui il privilegio è valido e l'entità a cui dovrebbero essere concessi i privilegi, in questo caso un ruolo:
GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';
Ad esempio, per concedere il SELECT
privilegio a un ruolo chiamato readapp
su appdb
database e tutti gli oggetti che contiene, puoi digitare:
GRANT SELECT ON appdb.* TO 'readapp';
Allo stesso modo, puoi concedere privilegi di scrittura allo stesso database a un ruolo chiamato writeapp
digitando:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';
Puoi concedere privilegi e revocarli dai ruoli esattamente come faresti direttamente con gli account utente. Quindi puoi sempre modificare i privilegi associati a un ruolo se devi modificare il livello di accesso che desideri fornire.
Come si concede agli utenti l'appartenenza a un ruolo?
Dopo aver aggiunto i privilegi ai tuoi ruoli, puoi iniziare ad aggiungere membri al ruolo per concedere loro i privilegi associati.
Per fare ciò, MySQL utilizza una forma diversa dello stesso GRANT
usiamo per concedere privilegi a utenti e ruoli. Questo nuovo modulo, tuttavia, aggiunge ruoli a un utente, consentendo all'account utente di accedere a tutti i privilegi concessi al ruolo.
La sintassi di base è simile alla seguente:
GRANT '<role>'@'<host>' TO '<user>'@'<host>';
Ad esempio, se il 'reports'@'localhost'
l'utente deve essere in grado di leggere i dati da appdb
database per generare report, possiamo aggiungere il readapp
ruolo all'account utente, assegnandogli i privilegi di selezione:
GRANT 'readapp' TO 'reports'@'localhost';
Allo stesso modo, per dare il 'appuser'@'localhost'
la possibilità di gestire i dati all'interno dello stesso database, possiamo rendere quell'utente un membro della writeapp
ruolo:
GRANT 'writeapp' TO 'appuser'@'localhost';
Il 'appuser'@'localhost'
l'account ora avrà la possibilità di inserire, aggiornare e rimuovere i dati dal database. Se vengono aggiunti nuovi privilegi a writeapp
ruolo, il 'appuser'@'localhost'
account otterrà immediatamente quei privilegi.
Come si concedono automaticamente determinati ruoli a ogni utente?
A volte possono esserci ruoli a cui si desidera che tutti gli utenti del sistema abbiano accesso. Puoi definire quali ruoli viene assegnato automaticamente a ciascun account impostando i mandatory_roles
variabile.
Per modificare i mandatory_roles
variabile, il tuo utente deve avere il ROLE_ADMIN
e SYSTEM_VARIABLES_ADMIN
privilegi. Puoi impostare i ruoli che desideri assegnare a ogni utente digitando:
SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';
In questo caso, diamo automaticamente a ciascun utente sul sistema tre ruoli. Quando si imposta la variabile di sistema, il valore di mandatory_roles
deve essere una stringa, quindi incapsula l'intero elenco di ruoli tra virgolette singole e utilizziamo i backtick per citare i singoli componenti del ruolo.
Non puoi aggiungere un ruolo a mandatory_roles
elenco che ha il SYSTEM_USER
privilegio. Questa è una misura di sicurezza per garantire che non tutte le sessioni sul sistema siano sessioni di sistema automaticamente.
Come usi i privilegi dei ruoli?
Dopo aver concesso l'appartenenza agli account utente ai ruoli, come li usi? Per accedere ai privilegi concessi a un account da un ruolo, è necessario attivarlo.
Visualizzazione degli attuali ruoli attivi
Prima di attivare nuovi ruoli, puoi verificare quali ruoli sono attualmente attivi per la tua sessione utente.
Per visualizzare i ruoli attivi per la tua sessione, digita:
SELECT CURRENT_ROLE()
L'output visualizzerà zero o più ruoli attivi nella sessione corrente. I privilegi associati a tali ruoli si aggiungeranno alle azioni che puoi eseguire.
Come attivare i ruoli per la sessione
Per modificare i ruoli attivi durante la sessione, utilizza il SET ROLE
comando. Puoi usare questo comando in diversi modi.
La sintassi di base è simile alla seguente:
SET ROLE '<rolename>'@'<host>';
Questo attiverà il ruolo in questione. È importante notare che eventuali ruoli precedentemente attivi non menzionati in SET ROLE
il comando sarà ora disattivato.
Per attivare più di un ruolo alla volta, separa ogni ruolo con una virgola:
SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';
Per attivare tutti i ruoli che sono stati assegnati al tuo account, puoi specificare ALL
invece di un ruolo specifico:
SET ROLE ALL;
Puoi anche dire a MySQL di attivare tutti i tuoi ruoli con un'eccezione specifica usando ALL EXCEPT
:
SET ROLL ALL EXCEPT '<role_1>'@'<host>';
Un'altra opzione è disabilitare tutti i ruoli sul tuo account specificando NONE
:
SET ROLE NONE
Questo disattiverà tutti i tuoi ruoli utente per la sessione, dandoti solo i privilegi assegnati specificamente al tuo account utente.
Per tornare all'elenco predefinito dei ruoli definiti per il tuo account, utilizza il DEFAULT
parola chiave:
SET ROLE DEFAULT
Come definire i ruoli predefiniti per un account utente
I ruoli che si attivano automaticamente quando accedi come utente e quelli che si riattivano quando usi SET ROLE DEFAULT
sono configurabili.
Per definire i ruoli che verranno attivati di default, utilizzare il SET DEFAULT ROLE
comando simile a come usi il SET ROLE
comando:
SET DEFAULT ROLE '<role_1>'@'<host>';
Questo imposterà i ruoli predefiniti che verranno attivati per il tuo account al momento dell'accesso o utilizzando SET ROLE DEFAULT
.
Se il tuo utente ha il CREATE USER
privilegio, puoi impostare i ruoli predefiniti per altri account:
SET DEFAULT ROLE ALL TO '<user>'@'<host>';
Qui specifichiamo che il '<user>'@'<host>'
l'account dovrebbe attivare automaticamente tutti i suoi ruoli al momento dell'autenticazione.
Questa sintassi può essere utilizzata anche per definire i ruoli predefiniti per più account separando ogni utente con una virgola:
SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';
Attivazione di tutti i ruoli per tutti gli utenti per impostazione predefinita
Se desideri che ogni account sul tuo server MySQL attivi tutti i suoi ruoli per impostazione predefinita, puoi modificare un'impostazione di sistema per farlo.
Quando il activate_all_roles_on_login
è impostata su true, MySQL attiverà automaticamente tutti i ruoli associati a un account al momento dell'accesso. Ciò sostituisce le impostazioni specificate da SET DEFAULT ROLE
.
Per abilitare questa funzione, devi avere il SYSTEM_VARIABLES_ADMIN
e ROLE_ADMIN
privilegi. Abilita la funzione digitando:
SET PERSIST activate_all_roles_on_login = ON;
Ciò farà sì che gli account utente attivino automaticamente tutti i ruoli all'accesso. Tuttavia, SET DEFAULT ROLE
ti consentirà comunque di attivare solo i ruoli predefiniti associati a un account.
Mostra i privilegi esistenti ottenuti dai ruoli
Per capire quali privilegi sono disponibili sul tuo account, puoi utilizzare SHOW GRANTS
comando.
Per verificare le sovvenzioni abilitate per un utente, digita:
SHOW GRANTS FOR '<user>'@'<host>';
L'output ti mostrerà tutti i privilegi assegnati direttamente all'account utente, nonché tutti i ruoli di cui l'utente è membro.
Dopo aver appreso a quali ruoli è membro un account, puoi verificare quali privilegi i ruoli forniscono all'utente digitando:
SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';
Ad esempio, per verificare i privilegi di 'reports'@'localhost'
utente, compresi quelli concessi dalla sua appartenenza alla readapp
ruolo, puoi usare:
SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';
Questo ti mostrerà tutti i privilegi esplicitamente concessi a 'reports'@'localhost'
account utente così come quelli aggiunti da readapp
ruolo.
Revocare un ruolo a un utente
Quindi cosa succede quando si desidera rimuovere un ruolo da un utente? Simile a come il GRANT
il comando può aggiungere nuovi privilegi a un utente o un ruolo o aggiungere ruoli a un utente, il REVOKE
comando può rimuovere i privilegi da un utente o un ruolo e può anche rimuovere l'appartenenza al ruolo da un utente.
La sintassi di base utilizzata per rimuovere un ruolo da un account utente è simile alla seguente:
REVOKE '<role>' FROM '<user>'@'<host>';
Dopo aver eseguito un'istruzione come questa, l'utente non avrà più accesso ai privilegi concessi tramite il ruolo.
Ad esempio, possiamo revocare la writeapp
ruolo dal 'appuser'@'localhost'
account utente digitando:
REVOKE 'writeapp' FROM 'appuser'@'localhost';
Tuttavia, se all'utente è stato concesso un privilegio con altri mezzi (concesso direttamente o concesso tramite l'appartenenza con un ruolo diverso), avrà comunque accesso a quel privilegio. Quindi, se il 'appuser'@'localhost'
l'utente era anche un membro di readapp
ruolo che abbiamo concesso in precedenza, avrebbero ancora SELECT
privilegi su appdb
banca dati.
Conclusione
L'utilizzo dei ruoli per distribuire i privilegi nei database MySQL può aiutare a semplificare il sovraccarico di gestione e la complessità del sistema di controllo degli accessi. È molto più semplice garantire che gli utenti con le stesse responsabilità dispongano degli stessi privilegi utilizzando i ruoli piuttosto che concedere direttamente molti privilegi diversi.
Allo stesso modo, i ruoli ti consentono di essere esplicito sull'intento alla base della concessione dei privilegi. Invece di concedere un numero elevato di privilegi agli account senza alcun commento, i nomi dei ruoli scelti con cura possono aiutare a distinguere tra diversi motivi per l'accesso. Prendendoti del tempo per creare e organizzare i ruoli in anticipo, la tua capacità di gestire l'accesso degli utenti a diverse parti dei tuoi dati sarà più semplice a lungo termine.