sql >> Base de Datos >  >> RDS >> Mysql

Uso de roles Nuevo en MySQL 8

En este artículo, vamos a hablar sobre la nueva función en el sistema de privilegios relacionado con MySQL 8, que son los Roles. Entonces, hablemos de roles, este artículo está completamente dedicado a los roles.

Otros usuarios pueden tener privilegios complejos, un ejemplo común de esto es un usuario que se usa para informar, este usuario no necesita escribir ningún dato, pero también existe la posibilidad de que no necesite leer todos los datos. Es muy probable que pueda usarse solo para unas pocas tablas o columnas específicas, o solo puede tener acceso seleccionado a un conjunto de vistas que también será una específica.

Estos privilegios pueden acumularse rápidamente y terminar en definiciones de usuario muy largas, no usaremos una definición y más concesiones están dando lugar a más errores. En MySQL 8, estos conjuntos de privilegios se pueden definir como roles y los roles se pueden otorgar a los usuarios en lugar de los privilegios básicos de MySQL. Los roles son una colección de privilegios que otorgamos a los usuarios.

Al igual que un nuevo usuario creado con el comando de creación de usuario que usamos para crear un rol como se menciona a continuación;

CREATE ROLE 'reportrole';

Puede crear varios roles como se muestra a continuación de una sola vez.

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

El nuevo rol creado con el comando crear rol no tendrá privilegios asociados, se pueden otorgar permisos a este rol como si fuera un usuario normal.

En el ejemplo a continuación, otorgamos privilegios de selección en todas las tablas de la base de datos de EMPRESA para reportar el rol que creamos anteriormente.

GRANT SELECT ON company.* to repotrole;

El asterisco (*) representa todas las tablas dentro de la base de datos de la empresa.

Los roles se pueden otorgar a los usuarios de MySQL, en el siguiente ejemplo, estamos creando el 'company_ro' en el usuario 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;

Recuerde que el usuario no es solo un nombre de usuario sino su usuario en el host en MySQL y luego se le puede otorgar el rol de repotrole con otorgar repotrole al usuario como se muestra a continuación.

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

La función de rol actual de MySQL ayuda a determinar qué rol tiene el usuario actual.

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

Los privilegios de rol se acumulan, lo que significa que los usuarios tendrán los privilegios descritos por la unión de los privilegios básicos y sus roles. Muy importante que si al usuario se le otorga el rol no lo active por defecto. esto último lo veremos al final de esta sección.

Definición de roles obligatorios

Los roles obligatorios son roles que serán asociados por todos los usuarios y por defecto están controlados por la variable obligatoria.

SET PERSIST mandato_roles ='role1,role2';

mysql> SET PERSIST mandato_roles='dbt3_read23';

Los roles obligatorios, como los roles otorgados explícitamente, no surten efecto hasta que se activan, verá cómo activar el rol más adelante en esta publicación.

Roles de práctica

Hagamos esto de manera práctica, creamos un rol y lo asignamos a varios usuarios, agregaremos privilegios en todas las tablas en la base de datos de la empresa y agregaremos otro privilegio de selección en la tabla sys como se muestra a continuación.

mysql> create role 'repotrole';

Así que conceda los privilegios al usuario que informa.

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

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

Vamos a crear usuarios, usuario1 en localhost y usuario2 en localhost con diferentes contraseñas

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

Se crean, asígneles el rol de repotrole y luego verifique con show grants si tienen el rol de repotrole.

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

Lo hacen en lugar de tener que especificar ambos privilegios para ambos usuarios, acabamos de crear el rol de repotrole y ese rol agregó ambos privilegios a los dos nuevos usuarios que creamos.

Compruebe también a los usuarios con pt-show-grants.

Usuario1

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

Usuario2

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

Entonces, pt-show-grants muestra el rol de repotrole para ambos usuarios.

Si desea aprender a usar pt-show-grants, use el enlace a continuación

Instale y use el kit de herramientas de Percona en Centos 7

Iniciemos el cliente MySQL nuevamente y esta vez otorguemos el rol de repotrole al usuario comp1.

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

Salgamos del cliente MySQL y del usuario Logan comp1, solo especifique el nombre de usuario y la contraseña en la línea de comando.

Especificar la contraseña en la línea de comando en los sistemas de producción no es una buena idea porque se registrará en el historial. Verifiquemos los permisos con show grants.

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

Entonces, el usuario tiene el rol de repotrole pero sus privilegios aún no están activados. Puede ver que el rol 'dbt3_read23' ya está allí porque este rol se ha establecido como PERSIST mandato_roles , cuando cree un nuevo usuario, este rol se asignará automáticamente.

Activación de roles

Podemos usar set role repotrole para activar el rol y luego verificamos 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` |
+----------------------------------------------------------------+

Puede ver que el usuario comp1 ya tenía los privilegios de todas las tablas de la empresa, es por eso que le otorgamos el rol a este usuario para este ejercicio, pero el rol de repotrole agregará el nuevo privilegio a la tabla de versiones del sistema.

Podemos volver al rol predeterminado y verificar los privilegios nuevamente.

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.