W tym artykule omówimy nową funkcję systemu uprawnień związanego z MySQL 8, którą są Role. Porozmawiajmy więc o rolach, ten artykuł jest całkowicie poświęcony rolom.
Inni użytkownicy mogą mieć złożone uprawnienia, typowym przykładem jest użytkownik używany do raportowania, ten użytkownik nie musi zapisywać żadnych danych, ale istnieje również możliwość, że nie musi czytać wszystkich danych. Jest bardzo prawdopodobne, że może być używany tylko dla kilku określonych tabel lub kolumn lub może mieć wybrany dostęp tylko do zestawu widoków, który będzie również określony.
Te uprawnienia mogą się szybko sumować i kończą się bardzo długimi definicjami użytkowników, nie będziemy używać definicji, a więcej dotacji to miejsce na więcej błędów. W MySQL 8 te zestawy uprawnień można zdefiniować jako role, a role można nadawać użytkownikom zamiast podstawowych uprawnień MySQL. Role to zbiór uprawnień, które przyznajemy użytkownikom.
Podobnie jak nowy użytkownik utworzony za pomocą polecenia Utwórz użytkownika, którego używamy do utworzenia roli, jak wspomniano poniżej;
CREATE ROLE 'reportrole';
Możesz utworzyć wiele ról, tak jak poniżej, za jednym razem.
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
Nowa rola utworzona za pomocą polecenia create role nie będzie miała żadnych powiązanych uprawnień, uprawnienia można nadać tej roli, tak jak był to zwykły użytkownik.
W poniższym przykładzie przyznajemy uprawnienie select we wszystkich tabelach w bazie danych COMPANY do utworzonej przez nas powyżej roli raportującej.
GRANT SELECT ON company.* to repotrole;
Gwiazdka (*) reprezentuje wszystkie tabele w bazie danych firmy.
Role mogą być przydzielane użytkownikom MySQL, w poniższym przykładzie tworzymy „company_ro” dla użytkownika 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;
Pamiętaj, że użytkownik nie jest tylko nazwą użytkownika, ale raczej jego użytkownikiem na hoście w MySQL, a następnie można mu nadać rolę repotrole za pomocą polecenia grant repotrole użytkownikowi, jak pokazano poniżej.
GRANT 'repotrole' to 'company_ro'@'localhost';
Obecna funkcja roli MySQL pomaga określić, jaką rolę ma bieżący użytkownik.
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
Uprawnienia ról kumulują się, co oznacza, że użytkownicy będą mieli opisane przez Unię uprawnienia podstawowe i ich role. Bardzo ważne, że jeśli użytkownikowi zostanie przyznana rola, nie jest ona domyślnie aktywowana. zobaczymy to drugie na końcu tej sekcji.
Definiowanie obowiązkowych ról
Role obowiązkowe to role, które domyślnie będą kojarzone przez wszystkich użytkowników, jest kontrolowane przez obowiązkową zmienną.
SET PERSIST obowiązkowe_role =‘role1,role2′;
mysql> USTAW UTRZYMANIE obowiązkowe_roles=’dbt3_read23’;
Role obowiązkowe, takie jak role wyraźnie przyznane, nie zaczną obowiązywać, dopóki nie zostaną aktywowane. W tym poście dowiesz się, jak aktywować rolę później.
Praktykuj role
Zróbmy to praktycznie, tworzymy rolę i przypisujemy ją wielu użytkownikom, dodamy uprawnienia do wszystkich tabel w bazie danych firmy i dodamy kolejne uprawnienie wyboru do tabeli sys, jak pokazano poniżej.
mysql> create role 'repotrole';
Nadaj więc uprawnienia użytkownikowi zgłaszającemu.
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
Twórzmy dla użytkowników, użytkownik1 na hoście lokalnym i użytkownik2 na hoście lokalnym z różnymi hasłami
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';
Są tworzone, przypisują im rolę repotrol, a następnie sprawdzają za pomocą programu show grants, czy mają rolę repotrol.
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` | +----------------------------------------------+
Robią to zamiast wymieniać oba przywileje dla obu użytkowników, właśnie utworzyliśmy rolę repotrola i ta rola dodała oba przywileje obu nowym użytkownikom, których utworzyliśmy.
Sprawdź również użytkowników za pomocą pt-show-grants.
Użytkownik1
[[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`;
Użytkownik2
[[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`;
Tak więc pt-show-grants pokazuje rolę repotrolu dla obu użytkowników.
Jeśli chcesz dowiedzieć się, jak korzystać z pt-show-grants, użyj poniższego linku
Zainstaluj i używaj Percona Toolkit na Centos 7
Uruchommy ponownie klienta MySQL i tym razem przyznajmy rolę repotrolu użytkownikowi comp1.
mysql> grant 'repotrole' to 'comp1'@'localhost';
Wyjdźmy z klienta MySQL i użytkownika Logan comp1, po prostu podaj nazwę użytkownika i hasło w wierszu poleceń.
Podanie hasła w wierszu poleceń na systemach produkcyjnych nie jest dobrym pomysłem, ponieważ zostanie ono zapisane w historii. Sprawdźmy uprawnienia z dotacją pokazową.
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
Tak więc użytkownik ma rolę repotrol, ale jego uprawnienia nie są jeszcze aktywowane. Możesz zobaczyć, że rola „dbt3_read23” już istnieje, ponieważ została ustawiona jako PERSIST obowiązkowe_role , po utworzeniu nowego użytkownika ta rola zostanie przypisana automatycznie.
Aktywacja ról
Możemy użyć set ról repotrole, aby aktywować rolę, a następnie sprawdzić dotacje pokazu.
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` | +----------------------------------------------------------------+
Widać, że użytkownik comp1 miał już uprawnienia do wszystkich tabel firmowych, dlatego przyznaliśmy tę rolę temu użytkownikowi w tym ćwiczeniu, ale rola repotrol doda nowe uprawnienia do tabeli wersji systemu.
Możemy przywrócić domyślną rolę i ponownie sprawdzić uprawnienia.
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.