Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation des rôles Nouveau dans MySQL 8

Dans cet article, nous allons parler de la nouvelle fonctionnalité du système de privilèges lié à MySQL 8, à savoir les rôles. Parlons donc des rôles, cet article est entièrement consacré aux rôles.

D'autres utilisateurs peuvent avoir des privilèges complexes, un exemple courant est un utilisateur utilisé pour signaler, cet utilisateur n'a pas besoin d'écrire de données, mais il est également possible qu'il n'ait pas besoin de lire toutes les données. Il est très probable qu'il ne puisse être utilisé que pour quelques tables ou colonnes spécifiques, ou qu'il ne puisse avoir qu'un accès sélectionné à un ensemble de vues qui sera également spécifique.

Ces privilèges peuvent s'additionner rapidement et se retrouver dans de très longues définitions d'utilisateurs, nous n'utiliserons pas de définition, et plus de subventions font place à plus d'erreurs. Dans MySQL 8, ces ensembles de privilèges peuvent être définis comme des rôles et des rôles peuvent être accordés aux utilisateurs au lieu des privilèges MySQL de base. Les rôles sont un ensemble de privilèges que nous accordons aux utilisateurs.

Tout comme un nouvel utilisateur créé avec la commande create user que nous utilisons pour créer un rôle comme mentionné ci-dessous ;

CREATE ROLE 'reportrole';

Vous pouvez créer plusieurs rôles comme ci-dessous en une seule fois.

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

Le nouveau rôle créé avec la commande create role n'aura aucun privilège associé, des autorisations peuvent être accordées à ce rôle comme s'il s'agissait d'un utilisateur normal.

Dans l'exemple ci-dessous, nous accordons le privilège select sur toutes les tables de la base de données COMPANY au rôle de rapport que nous avons créé ci-dessus.

GRANT SELECT ON company.* to repotrole;

L'astérisque (*) représente toutes les tables de la base de données de l'entreprise.

Des rôles peuvent être accordés aux utilisateurs MySQL, dans l'exemple ci-dessous, nous créons le "company_ro" à l'utilisateur 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;

N'oubliez pas que l'utilisateur n'est pas simplement un nom d'utilisateur, mais plutôt son utilisateur sur l'hôte dans MySQL, puis le rôle de repottrole peut lui être accordé avec accorder le repotrole à l'utilisateur comme indiqué ci-dessous.

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

La fonction de rôle actuel de MySQL permet de déterminer le rôle de l'utilisateur actuel.

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

Les privilèges de rôle s'empilent, ce qui signifie que les utilisateurs auront les privilèges décrits par l'Union des privilèges de base et ses rôles. Il est très important que si l'utilisateur se voit attribuer le rôle, il ne soit pas activé par défaut. nous verrons ce dernier à la fin de cette section.

Définir les rôles obligatoires

Les rôles obligatoires sont des rôles qui seront associés par défaut à tous les utilisateurs et sont contrôlés par la variable obligatoire.

SET PERSIST obligatoire_roles ='rôle1, rôle2′ ;

mysql> SET PERSIST obligatoire_roles='dbt3_read23';

Les rôles obligatoires, comme les rôles explicitement accordés, ne prennent effet qu'une fois activés, vous verrez comment activer ce dernier rôle dans cet article.

Rôles de pratique

Faisons cela pratiquement, nous créons un rôle et l'attribuons à plusieurs utilisateurs, nous ajouterons des privilèges sur toutes les tables de la base de données de l'entreprise et nous ajouterons un autre privilège de sélection sur la table sys comme indiqué ci-dessous.

mysql> create role 'repotrole';

Accordez donc les privilèges à l'utilisateur qui signale.

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

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

Créons pour les utilisateurs, user1 sur localhost et user2 sur localhost avec des mots de passe différents

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

Ils sont créés, attribuez-leur le rôle de repottrole, puis vérifiez auprès de show grant s'ils ont le rôle de repottrole.

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

Ils le font au lieu d'avoir à épeler les deux privilèges pour les deux utilisateurs, nous venons de créer le rôle de repotrole et ce rôle a ajouté les deux privilèges aux deux nouveaux utilisateurs que nous avons créés.

Vérifiez également les utilisateurs avec pt-show-grants.

Utilisateur1

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

Utilisateur2

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

Ainsi, pt-show-grants affiche le rôle de repotrol pour les deux utilisateurs.

Si vous voulez apprendre à utiliser pt-show-grants, utilisez le lien ci-dessous

Installer et utiliser Percona Toolkit sur Centos 7

Redémarrons le client MySQL et accordons cette fois le rôle de repotrole à l'utilisateur comp1.

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

Quittons le client MySQL et l'utilisateur Logan comp1, spécifions simplement le nom d'utilisateur et le mot de passe sur la ligne de commande.

Spécifier le mot de passe sur la ligne de commande sur les systèmes de production n'est pas une bonne idée car il sera enregistré dans l'historique. Vérifions les autorisations avec les autorisations d'affichage.

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

L'utilisateur a donc le rôle de repotrol mais ses privilèges ne sont pas encore activés. Vous pouvez voir que le rôle "dbt3_read23" est déjà là car ce rôle a été défini comme PERSIST required_roles , lorsque vous créez un nouvel utilisateur, ce rôle sera attribué automatiquement.

Activation des rôles

Nous pouvons utiliser set role repotrole pour activer le rôle, puis nous vérifions les subventions d'affichage.

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

Vous pouvez voir que l'utilisateur comp1 avait déjà les privilèges sur toutes les tables de l'entreprise, c'est pourquoi nous avons accordé le rôle à cet utilisateur pour cet exercice mais le rôle repotrole ajoutera le nouveau privilège à la table de version du système.

Nous pouvons revenir au rôle par défaut et vérifier à nouveau les privilèges.

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.