sql >> Database >  >> RDS >> Mysql

Rollen gebruiken die nieuw zijn in MySQL 8

In dit artikel gaan we het hebben over de nieuwe functie in het MySQL 8-gerelateerde privilegesysteem, namelijk Rollen. Laten we het dus hebben over rollen, dit artikel is volledig gewijd aan rollen.

Andere gebruikers kunnen complexe privileges hebben, een veelvoorkomend voorbeeld hiervan is een gebruiker die wordt gebruikt om te rapporteren, deze gebruiker hoeft geen gegevens te schrijven, maar het is ook mogelijk dat hij niet alle gegevens hoeft te lezen. Het is zeer waarschijnlijk dat het alleen voor een paar specifieke tabellen of kolommen kan worden gebruikt, of het kan alleen geselecteerde toegang hebben tot een reeks weergaven die ook een specifieke zal zijn.

Deze privileges kunnen snel oplopen en eindigen in zeer lange gebruikersdefinities, we zullen geen definitie gebruiken en meer beurzen maken ruimte voor meer fouten. In MySQL 8 kunnen deze privilegesets worden gedefinieerd als rollen en kunnen rollen worden toegekend aan gebruikers in plaats van basis MySQL-privileges. Rollen zijn een verzameling privileges die we aan gebruikers verlenen.

Net zoals een nieuwe gebruiker aangemaakt met het create user commando gebruiken we om een ​​rol aan te maken zoals hieronder vermeld;

CREATE ROLE 'reportrole';

U kunt in één keer meerdere rollen maken, net als bij onderstaande zoekopdracht.

CREATE ROLE 'app_ro', 'app_w', 'app_dev';

Een nieuwe rol die is gemaakt met het commando 'rol maken' heeft geen privileges. Er kunnen machtigingen worden verleend aan deze rol zoals het een normale gebruiker was.

In het onderstaande voorbeeld verlenen we selectiebevoegdheid voor alle tabellen in de COMPANY-database aan de rapportrolrol die we hierboven hebben gemaakt.

GRANT SELECT ON company.* to repotrole;

De asterisk (*) staat voor alle tabellen in de bedrijfsdatabase.

Rollen kunnen worden toegekend aan MySQL-gebruikers, in het onderstaande voorbeeld maken we de 'company_ro' aan bij localhost-gebruiker.

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;

Onthoud dat de gebruiker niet alleen een gebruikersnaam is, maar eerder zijn gebruiker bij de host in MySQL en dat de repotrole-rol hem kan worden verleend met de gebruiker repotrole verlenen, zoals hieronder wordt getoond.

GRANT 'repotrole' to 'company_ro'@'localhost';

De huidige rolfunctie van MySQL helpt om te bepalen welke rol de huidige gebruiker heeft.

mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| NONE           |
+----------------+

De privileges van rollen stapelen zich op, wat betekent dat de gebruikers de privileges hebben die worden beschreven door de Unie van de basisprivileges en zijn rollen. Het is erg belangrijk dat als de gebruiker de rol krijgt, deze niet standaard wordt geactiveerd. we zullen dit laatste aan het einde van dit gedeelte zien.

Verplichte rollen definiëren

Verplichte rollen zijn rollen die standaard door alle gebruikers worden gekoppeld en worden beheerd door de verplichte variabele.

STEL BLIJVEND verplicht_roles ='role1,role2′;

mysql> STEL BLIJVEND IN verplichte_roles=’dbt3_read23’;

Verplichte rollen, zoals expliciet toegekende rollen, worden pas van kracht nadat ze zijn geactiveerd, je zult in dit bericht zien hoe je de rol kunt activeren.

Oefenrollen

Laten we dit praktisch doen, we creëren een rol en wijzen deze toe aan meerdere gebruikers, we zullen privileges toevoegen aan alle tabellen in de bedrijfsdatabase en we zullen nog een select privilege toevoegen aan de sys-tabel, zoals hieronder weergegeven.

mysql> create role 'repotrole';

Verleen de rechten dus aan de rapporterende gebruiker.

mysql> grant select on company.* to 'repotrole';

mysql> grant select on sys.version to 'repotrole';

Laten we maken voor gebruikers, gebruiker1 op localhost en gebruiker2 op localhost met verschillende wachtwoorden

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';

Ze worden gemaakt, wijs de repotrole-rol aan hen toe en controleer vervolgens bij Show Grants of ze de repotrole-rol hebben.

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` |
+----------------------------------------------+

Ze doen dit in plaats van beide privileges voor beide gebruikers te moeten spellen. We hebben zojuist de repotrole-rol gemaakt en die rol heeft beide privileges toegevoegd aan beide nieuwe gebruikers die we hebben gemaakt.

Controleer ook de gebruikers met pt-show-grants.

Gebruiker1

[[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`;

Gebruiker2

[[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`;

Dus pt-show-grants tonen de repotrole-rol voor beide gebruikers.

Als je wilt leren hoe je pt-show-grants gebruikt, gebruik dan de onderstaande link

Installeer en gebruik Percona Toolkit op Centos 7

Laten we de MySQL-client opnieuw starten en deze keer de repotrole-rol toekennen aan comp1-gebruiker.

mysql> grant 'repotrole' to 'comp1'@'localhost';

Laten we de MySQL-client en Logan comp1-gebruiker verlaten, geef gewoon de gebruikersnaam en het wachtwoord op op de opdrachtregel.

Het opgeven van het wachtwoord op de opdrachtregel op productiesystemen is geen goed idee, omdat dit in de geschiedenis wordt vastgelegd. Laten we eens kijken of er rechten zijn met showsubsidies.

mysql> show grants;
+----------------------------------------------------------------+
| Grants for [email protected]                                     |
+----------------------------------------------------------------+
| GRANT USAGE ON *.* TO `comp1`@`localhost`                      |
| GRANT `dbt3_read23`@`%`,`repotrole`@`%` TO `comp1`@`localhost` |

De gebruiker heeft dus de repotrole-rol, maar zijn rechten zijn nog niet geactiveerd. U kunt zien dat de rol 'dbt3_read23' er al is, omdat deze rol is ingesteld als PERSIST verplichte_roles , wanneer u een nieuwe gebruiker aanmaakt, wordt deze rol automatisch toegewezen.

Rollen activeren

We kunnen set role repotrole gebruiken om de rol te activeren en dan controleren we de 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` |
+----------------------------------------------------------------+

U kunt zien dat de comp1-gebruiker al de privileges had voor alle bedrijfstabellen, daarom hebben we de rol aan deze gebruiker toegekend voor deze oefening, maar de repotrole-rol zal het nieuwe privilege toevoegen aan de systeemversietabel.

We kunnen teruggaan naar de standaardrol en de privileges opnieuw controleren.

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.

  1. SQL JOIN versus IN-prestaties?

  2. De datum ophalen uit een Datetime-kolom in MySQL

  3. Docker wacht tot postgresql actief is

  4. SQL Server blokkeerde de toegang tot procedure 'sys.sp_OACreate' van onderdeel 'Ole Automation Procedures'