In diesem Artikel werden wir über die neue Funktion im Berechtigungssystem von MySQL 8 sprechen, nämlich Rollen. Lassen Sie uns also über Rollen sprechen, dieser Artikel ist vollständig Rollen gewidmet.
Andere Benutzer können komplexe Berechtigungen haben, ein gängiges Beispiel dafür ist ein Benutzer, der zum Melden verwendet wird, dieser Benutzer muss keine Daten schreiben, aber es besteht auch die Möglichkeit, dass er nicht alle Daten lesen muss. Es ist sehr wahrscheinlich, dass es nur für einige wenige spezifische Tabellen oder Spalten verwendet werden kann oder dass es nur ausgewählten Zugriff auf eine Reihe von Ansichten haben kann, die auch eine spezifische sein werden.
Diese Privilegien können sich schnell summieren und in sehr langen Benutzerdefinitionen enden, wir werden keine Definition verwenden, und mehr Erteilungen machen Platz für mehr Fehler. In MySQL 8 können diese Berechtigungen als Rollen definiert werden, und Rollen können Benutzern anstelle von grundlegenden MySQL-Berechtigungen gewährt werden. Rollen sind eine Sammlung von Berechtigungen, die wir Benutzern gewähren.
Genau wie ein neuer Benutzer, der mit dem Befehl create user erstellt wurde, verwenden wir ihn, um eine Rolle zu erstellen, wie unten erwähnt;
CREATE ROLE 'reportrole';
Sie können mehrere Rollen auf einmal erstellen, genau wie in der folgenden Abfrage.
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
Einer neuen Rolle, die mit dem Befehl zum Erstellen einer Rolle erstellt wurde, sind keine Berechtigungen zugeordnet. Dieser Rolle können Berechtigungen erteilt werden, als wäre sie ein normaler Benutzer.
Im folgenden Beispiel erteilen wir der oben erstellten Rolle reportrole die Auswahlberechtigung für alle Tabellen in der Datenbank COMPANY.
GRANT SELECT ON company.* to repotrole;
Das Sternchen (*) steht für alle Tabellen innerhalb der Firmendatenbank.
Rollen können MySQL-Benutzern zugewiesen werden, im Beispiel unten erstellen wir „company_ro“ unter localhost user.
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;
Denken Sie daran, dass der Benutzer nicht nur ein Benutzername ist, sondern sein Benutzer auf dem Host in MySQL, und ihm dann die Repotrole-Rolle mit Grant Repotrole to the user wie unten gezeigt zugewiesen werden kann.
GRANT 'repotrole' to 'company_ro'@'localhost';
Die aktuelle Rollenfunktion von MySQL hilft festzustellen, welche Rolle der aktuelle Benutzer hat.
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
Die Privilegien der Rollen stapeln sich, was bedeutet, dass die Benutzer die Privilegien haben, die durch die Vereinigung der Basisprivilegien und ihrer Rollen beschrieben werden. Es ist sehr wichtig, dass, wenn dem Benutzer die Rolle gewährt wird, sie nicht standardmäßig aktiviert wird. Letzteres sehen wir am Ende dieses Abschnitts.
Pflichtrollen definieren
Obligatorische Rollen sind Rollen, die standardmäßig von allen Benutzern zugeordnet werden und von der obligatorischen Variable gesteuert werden.
SET PERSIST obligatorische_Rollen =‘Rolle1,Rolle2′;
mysql> SET PERSIST required_roles=’dbt3_read23’;
Obligatorische Rollen, wie explizit gewährte Rollen, treten erst in Kraft, wenn sie aktiviert sind. In diesem Beitrag erfahren Sie, wie Sie letztere aktivieren.
Übungsrollen
Lassen Sie uns dies praktisch tun, wir erstellen eine Rolle und weisen sie mehreren Benutzern zu, wir fügen Privilegien für alle Tabellen in der Unternehmensdatenbank hinzu und wir fügen ein weiteres Auswahlprivileg für die sys-Tabelle hinzu, wie unten gezeigt.
mysql> create role 'repotrole';
Gewähren Sie also dem meldenden Benutzer die Privilegien.
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
Erstellen wir zwei Benutzer, Benutzer1 auf localhost und Benutzer2 auf localhost mit unterschiedlichen Passwörtern
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';
Sie werden erstellt, weisen ihnen die Repotrole-Rolle zu und überprüfen dann mit Show Grants, ob sie die Repotrole-Rolle haben.
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` | +----------------------------------------------+
Sie tun dies, anstatt beide Privilegien für beide Benutzer buchstabieren zu müssen. Wir haben gerade die Repotrole-Rolle erstellt und diese Rolle hat beiden neuen Benutzern, die wir erstellt haben, beide Privilegien hinzugefügt.
Überprüfen Sie auch die Benutzer mit pt-show-grants.
Benutzer1
[[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`;
Benutzer2
[[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`;
Also zeigt pt-show-grants die Repotrole-Rolle für beide Benutzer an.
Wenn Sie erfahren möchten, wie Sie pt-show-grants verwenden, verwenden Sie den folgenden Link
Percona Toolkit auf Centos 7 installieren und verwenden
Lassen Sie uns den MySQL-Client erneut starten und diesmal dem Benutzer comp1 die Repotrole-Rolle zuweisen.
mysql> grant 'repotrole' to 'comp1'@'localhost';
Verlassen wir den MySQL-Client und den Benutzer Logan comp1, geben Sie einfach den Benutzernamen und das Passwort in der Befehlszeile ein.
Das Angeben des Kennworts in der Befehlszeile auf Produktionssystemen ist keine gute Idee, da es im Verlauf aufgezeichnet wird. Lassen Sie uns mit Show Grants nach Berechtigungen suchen.
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
Der Benutzer hat also die Repotrole-Rolle, aber seine Privilegien sind noch nicht aktiviert. Sie können sehen, dass die Rolle „dbt3_read23“ bereits vorhanden ist, da diese Rolle als PERSIST obligatorische_Rollen festgelegt wurde , wenn Sie einen neuen Benutzer erstellen, wird diese Rolle automatisch zugewiesen.
Rollen aktivieren
Wir können set role repotrole verwenden, um die Rolle zu aktivieren, und dann überprüfen wir show grants.
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` | +----------------------------------------------------------------+
Sie können sehen, dass der Benutzer comp1 bereits die Berechtigungen für alle Unternehmenstabellen hatte. Aus diesem Grund haben wir diesem Benutzer die Rolle für diese Übung zugewiesen, aber die Rolle repotrole fügt der Systemversionstabelle die neue Berechtigung hinzu.
Wir können auf die Standardrolle zurücksetzen und die Berechtigungen erneut überprüfen.
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.