I den här artikeln kommer vi att prata om den nya funktionen i MySQL 8-relaterade privilegiesystem, som är roller. Så låt oss prata om roller, den här artikeln är helt tillägnad roller.
Andra användare kan ha komplexa privilegier, ett vanligt exempel på detta är en användare som används för att rapportera, denna användare behöver inte skriva någon data, men det finns också möjligheten att den inte behöver läsa all data. Det är mycket troligt att det bara kan användas för ett fåtal specifika tabeller eller kolumner, eller så kan det bara ha vald åtkomst till en uppsättning vyer som också kommer att vara en specifik.
Dessa privilegier kan snabbt läggas ihop och hamna i väldigt långa användardefinitioner, vi kommer inte att använda en definition och fler anslag ger plats för fler misstag. I MySQL 8 kan dessa privilegieuppsättningar definieras som roller och roller kan tilldelas användare istället för grundläggande MySQL-privilegier. Roller är en samling privilegier som vi ger användare.
Precis som en ny användare skapad med kommandot skapa användare använder vi för att skapa en roll som nämns nedan;
CREATE ROLE 'reportrole';
Du kan skapa flera roller precis som nedanstående fråga på en gång.
CREATE ROLE 'app_ro', 'app_w', 'app_dev';
Ny roll som skapats med kommandot create role kommer inte att ha några privilegier kopplade till den, behörigheter kan ges till denna roll eftersom den var en normal användare.
I exemplet nedan beviljar vi väljarbehörighet för alla tabeller i COMPANY-databasen till reportrollrollen som vi skapade ovan.
GRANT SELECT ON company.* to repotrole;
Asterisken (*) representerar alla tabeller i företagsdatabasen.
Roller kan tilldelas MySQL-användare, i exemplet nedan skapar vi "company_ro" hos localhost-användare.
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;
Kom ihåg att användaren inte bara är ett användarnamn utan snarare dess användare på värden i MySQL och sedan kan repotrole-rollen tilldelas den med grant repotrole till användaren som visas nedan.
GRANT 'repotrole' to 'company_ro'@'localhost';
Den nuvarande rollfunktionen i MySQL hjälper till att avgöra vilken roll den aktuella användaren har.
mysql> select current_role(); +----------------+ | current_role() | +----------------+ | NONE | +----------------+
Behörigheterna för roll stack up betyder att användarna kommer att ha de privilegier som beskrivs av Unionen av de basprivilegier och dess roller har. Mycket viktigt att om användaren beviljas rollen är den inte aktiverad som standard. vi kommer att se det senare i slutet av det här avsnittet.
Definiera obligatoriska roller
Obligatoriska roller är roller som kommer att associeras av alla användare som standard kontrolleras av den obligatoriska variabeln.
SET PERSIST mandatory_roles =‘roll1,roll2′;
mysql> SET PERSIST mandatory_roles=’dbt3_read23’;
Obligatoriska roller, som uttryckligen beviljade roller, träder inte i kraft förrän de aktiveras, du kommer att se hur du aktiverar rollen senare i det här inlägget.
Öva roller
Låt oss göra detta praktiskt, vi skapar en roll och tilldelar den till flera användare, vi kommer att lägga till privilegier på alla tabeller i företagets databas och vi kommer att lägga till ytterligare en vald behörighet i sys-tabellen som visas nedan.
mysql> create role 'repotrole';
Så ge privilegierna till den rapporterande användaren.
mysql> grant select on company.* to 'repotrole'; mysql> grant select on sys.version to 'repotrole';
Låt oss skapa för användare, användare1 på localhost och user2 på localhost med olika lösenord
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';
De skapas, tilldelar dem rollen som ompottroll och kontrollera sedan med utställningsbidrag om de har rollen som omvandlare.
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` | +----------------------------------------------+
De gör det istället för att behöva skriva ut båda privilegierna för båda användarna, vi skapade precis repotrole-rollen och den rollen lade till båda privilegierna till båda nya användare som vi skapade.
Kontrollera användarna med pt-show-grants också.
Användare1
[[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`;
Användare 2
[[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`;
Så pt-show-grants visar repotrole-rollen för båda användarna.
Om du vill lära dig hur du använder pt-show-grants använd länken nedan
Installera och använd Percona Toolkit på Centos 7
Låt oss starta MySQL-klienten igen och den här gången ge repotrole-rollen till comp1-användare.
mysql> grant 'repotrole' to 'comp1'@'localhost';
Låt oss lämna MySQL-klienten och Logan comp1-användaren, ange bara användarnamnet och lösenordet på kommandoraden.
Att ange lösenordet på kommandoraden på produktionssystem är inte en bra idé eftersom det kommer att registreras i historien. Låt oss leta efter behörigheter med show grants.
mysql> show grants; +----------------------------------------------------------------+ | Grants for [email protected] | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO `comp1`@`localhost` | | GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |
Så användaren har repotrole-rollen men dess privilegier är inte aktiverade än. Du kan se att rollen "dbt3_read23" redan finns där eftersom den här rollen har ställts in som PERSIST obligatoriska_roller , när du skapar en ny användare kommer denna roll att tilldelas automatiskt.
Aktivera roller
Vi kan använda set role repotrole för att aktivera rollen och sedan kontrollerar vi 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` | +----------------------------------------------------------------+
Du kan se att comp1-användaren redan hade privilegierna till alla företagstabeller, det är därför vi beviljade rollen till den här användaren för denna övning, men repotrole-rollen kommer att lägga till den nya behörigheten till systemversionstabellen.
Vi kan återgå till standardrollen och kontrollera privilegierna igen.
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.