In questo articolo, parleremo della nuova funzionalità nel sistema di privilegi relativi a MySQL 8, che è Ruoli. Quindi, parliamo di ruoli, questo articolo è completamente dedicato ai ruoli.
Altri utenti potrebbero avere privilegi complessi, un esempio comune è un utente utilizzato per segnalare, questo utente non ha bisogno di scrivere alcun dato, ma c'è anche la possibilità che non abbia bisogno di leggere tutti i dati. È molto probabile che possa essere utilizzato solo per alcune tabelle o colonne specifiche, oppure può avere solo l'accesso selezionato a una serie di viste che saranno anche una specifica.
Questi privilegi possono sommarsi rapidamente e finire in definizioni utente molto lunghe, non useremo una definizione e più sovvenzioni stanno facendo spazio a più errori. In MySQL 8 questi set di privilegi possono essere definiti come ruoli e ruoli possono essere concessi agli utenti invece dei privilegi MySQL di base. I ruoli sono una raccolta di privilegi che concediamo agli utenti.
Proprio come un nuovo utente creato con il comando create user che utilizziamo per creare un ruolo come indicato di seguito;
CREATE ROLE 'reportrole';
Puoi creare più ruoli proprio come sotto la query in una volta sola.
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
Il nuovo ruolo creato con il comando create role non avrà privilegi ad esso associati, le autorizzazioni possono essere concesse a questo ruolo come se fosse un utente normale.
Nell'esempio seguente, concediamo il privilegio di selezione su tutte le tabelle nel database AZIENDA per segnalare il ruolo che abbiamo creato in precedenza.
GRANT SELECT ON company.* to repotrole;
L'asterisco (*) rappresenta tutte le tabelle all'interno del database aziendale.
I ruoli possono essere concessi agli utenti MySQL, nell'esempio seguente stiamo creando "company_ro" nell'utente localhost.
CREATE USER IF NOT EXISTS 'company_ro'@'localhost' IDENTIFIED WITH mysql_native_password BY 'company_pass' WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
Ricorda che l'utente non è solo un nome utente, ma piuttosto il suo utente nell'host in MySQL e quindi il ruolo di repotrole può essere assegnato ad esso con concessione di repotrole all'utente come mostrato di seguito.
GRANT 'repotrole' to 'company_ro'@'localhost';
La funzione del ruolo corrente di MySQL aiuta a determinare quale ruolo ha l'utente corrente.
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
I privilegi del ruolo si accumulano, il che significa che gli utenti avranno i privilegi descritti dall'Unione dei privilegi di base e dei suoi ruoli. Molto importante che se all'utente viene concesso il ruolo, questo non viene attivato per impostazione predefinita. vedremo quest'ultimo alla fine di questa sezione.
Definizione dei ruoli obbligatori
I ruoli obbligatori sono ruoli che verranno associati da tutti gli utenti per impostazione predefinita è controllato dalla variabile obbligatoria.
SET PERSIST obbligatori_roles ='role1,role2';
mysql> SET PERSIST obbligatori_roles='dbt3_read23';
I ruoli obbligatori, come i ruoli concessi in modo esplicito, non hanno effetto finché non vengono attivati, vedrai come attivare il ruolo quest'ultimo in questo post.
Ruoli di pratica
Facciamolo in pratica, creiamo un ruolo e lo assegniamo a più utenti, aggiungeremo i privilegi su tutte le tabelle del database aziendale e aggiungeremo un altro privilegio select sulla tabella sys come mostrato di seguito.
mysql> create role 'repotrole';
Quindi concedi i privilegi all'utente segnalante.
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
Creiamo per gli utenti, utente1 su localhost e utente2 su localhost con password diverse
mysql> create user 'user1'@'localhost' identified by 'foo'; mysql> create user 'user2'@'localhost' identified by 'bar'; mysql> grant 'repotrole' to 'user1'@'localhost'; mysql> grant 'repotrole' to 'user2'@'localhost';
Vengono creati, assegna loro il ruolo di repotrole e quindi controlla con le sovvenzioni show se hanno il ruolo di repotrole.
mysql> show grants for 'user1'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user1`@`localhost` | | GRANT `repotrole`@`%` TO `user1`@`localhost` | +----------------------------------------------+ mysql> show grants for 'user2'@'localhost'; +----------------------------------------------+ | Grants for [email protected] | +----------------------------------------------+ | GRANT USAGE ON *.* TO `user2`@`localhost` | | GRANT `repotrole`@`%` TO `user2`@`localhost` | +----------------------------------------------+
Lo fanno invece di dover specificare entrambi i privilegi per entrambi gli utenti, abbiamo appena creato il ruolo di repotrole e quel ruolo ha aggiunto entrambi i privilegi a entrambi i nuovi utenti che abbiamo creato.
Controlla anche gli utenti con pt-show-grants.
Utente1
[[email protected] ~]# pt-show-grants | grep user1 -- Grants for 'dbt3_user1'@'%' CREATE USER IF NOT EXISTS 'dbt3_user1'@'%'; ALTER USER 'dbt3_user1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user1`@`%`; GRANT `dbt3_reader`@`%` TO `dbt3_user1`@`%`; -- Grants for 'user1'@'localhost' CREATE USER IF NOT EXISTS 'user1'@'localhost'; ALTER USER 'user1'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*F3A2A51A9B0F2BE2468926B4132313728C250DBF' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user1`@`localhost`; GRANT `repotrole`@`%` TO `user1`@`localhost`;
Utente2
[[email protected] ~]# pt-show-grants | grep user2 -- Grants for 'dbt3_user2'@'%' CREATE USER IF NOT EXISTS 'dbt3_user2'@'%'; ALTER USER 'dbt3_user2'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' DEFAULT ROLE `dbt3_read23`@`%` REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `dbt3_user2`@`%`; -- Grants for 'user2'@'localhost' CREATE USER IF NOT EXISTS 'user2'@'localhost'; ALTER USER 'user2'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT; GRANT USAGE ON *.* TO `user2`@`localhost`; GRANT `repotrole`@`%` TO `user2`@`localhost`;
Quindi pt-show-grants mostra il ruolo di repotrole per entrambi gli utenti.
Se vuoi imparare a usare pt-show-grants usa il link qui sotto
Installa e usa Percona Toolkit su Centos 7
Riavviamo il client MySQL e questa volta concediamo il ruolo di repotrole all'utente comp1.
mysql> grant 'repotrole' to 'comp1'@'localhost';
Usciamo dal client MySQL e dall'utente Logan comp1, basta specificare il nome utente e la password sulla riga di comando.
Specificare la password sulla riga di comando sui sistemi di produzione non è una buona idea perché verrà registrata nella cronologia. Controlliamo le autorizzazioni con le sovvenzioni per lo spettacolo.
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
Quindi l'utente ha il ruolo di repotrole ma i suoi privilegi non sono ancora attivati. Puoi vedere che il ruolo "dbt3_read23" è già presente perché questo ruolo è stato impostato come PERSIST obbligatori_roles , quando crei un nuovo utente questo ruolo verrà assegnato automaticamente.
Attivazione dei ruoli
Possiamo utilizzare il repotrole del ruolo impostato per attivare il ruolo e quindi controllare le sovvenzioni dello spettacolo.
mysql> set role 'repotrole'; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT SELECT ON `company`.* TO `comp1`@`localhost` | | GRANT SELECT ON `sys`.`version` TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+
Puoi vedere che l'utente comp1 aveva già i privilegi per tutte le tabelle dell'azienda, questo è il motivo per cui abbiamo concesso il ruolo a questo utente per questo esercizio ma il ruolo di repotrole aggiungerà il nuovo privilegio alla tabella delle versioni di sistema.
Possiamo ripristinare il ruolo predefinito e controllare di nuovo i privilegi.
mysql> set role none; Query OK, 0 rows affected (0.00 sec) mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` | +----------------------------------------------------------------+ This time the user kept the dbt3_read23 role because it had it as base privileges but it won't have the privilege to sys.version table that version anymore because that came from the role.