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

Cómo administrar privilegios con roles en MySQL


Introducción

El control de acceso y la gestión de usuarios son dos áreas que pueden volverse complejas rápidamente a medida que aumenta la cantidad de usuarios y las diferentes entidades de la base de datos dentro de su sistema. Administrar muchos privilegios diferentes en varios objetos de la base de datos, garantizar que los usuarios que tienen las mismas responsabilidades tengan el mismo nivel de acceso, y auditar y restringir el acceso se vuelven más difíciles con el tiempo.

Para ayudar a abordar esto, MySQL tiene un concepto llamado "roles" que le permite agrupar paquetes de privilegios bajo un nombre dado, lo que le permite asignar y modificar configuraciones en masa. En esta guía, veremos cómo funcionan los roles dentro de MySQL y cómo usarlos para facilitar la administración del acceso a los datos para sus usuarios.


Comandos

Estos son los comandos SQL principales que analizaremos en relación con la administración de funciones de MySQL.

  • CREATE ROLE :El CREATE ROLE El comando define un nuevo rol dentro del sistema de base de datos.
  • DROP ROLE :El DROP ROLE comando hace lo contrario, eliminando un rol existente.
  • GRANT :El GRANT El comando tiene dos propósitos distintos relacionados con los roles:agregar privilegios a los roles y agregar cuentas de usuario como miembros de los roles.
  • REVOKE :En el contexto de roles, REVOKE El comando elimina los privilegios de un rol y también elimina la membresía del rol de las cuentas de usuario.
  • SHOW GRANTS :El SHOW GRANTS El comando muestra los privilegios de la cuenta o rol de usuario dado.
  • SET ROLE :El SET ROLE El comando cambia los roles que una cuenta de usuario está usando activamente. Esto le permite dictar qué conjuntos de permisos se aplican a la cuenta para la sesión.
  • SET DEFAULT ROLE :El SET DEFAULT ROLE El comando define los roles que se aplican automáticamente cuando un cliente inicia sesión como una cuenta de usuario específica.


Privilegios requeridos

Para seguir esta guía, necesitará los siguientes privilegios:

  • CREATE ROLE
  • GRANT OPTION
  • CREATE USER (para establecer los roles predeterminados para otro usuario)
  • ROLE_ADMIN (para establecer variables del sistema que modifican el comportamiento del rol)
  • SYSTEM_VARIABLES_ADMIN (para establecer variables del sistema que modifican el comportamiento del rol)

El CREATE ROLE El privilegio es una versión menor de CREATE USER privilegio, lo que le permite crear y administrar roles. Cuentas que ya tienen el CREATE USER privilegio tiene automáticamente toda la funcionalidad requerida para administrar roles.

La GRANT OPTION Se requiere privilegio para asignar privilegios a un rol. Debe tener GRANT OPTION habilitado para cualquier privilegio que desee asignar a una función.




¿Qué son los roles?

En MySQL, un rol es una entidad que funciona como contenedor o colección de privilegios. Los administradores pueden asignar privilegios a roles de la misma manera que asignan privilegios a cuentas de usuario. Luego puede agregar cuentas de usuario como miembros de la función, permitiendo que esas cuentas accedan a los privilegios asociados con la función.

Básicamente, los roles funcionan como una forma de agrupar diferentes privilegios relacionados para facilitar la administración de privilegios. En lugar de asegurarse de que cada usuario tenga el nivel exacto de acceso que necesita mediante la asignación de privilegios individuales, el uso de grupos de privilegios con nombre le permite administrar menos asignaciones y más fáciles de entender.

Esto tiene una clara ventaja a la hora de asignar niveles de acceso, ya que es más fácil asignar un developer , sysadmin , o financeteam rol a un usuario que administrar individualmente docenas de privilegios. También permite ajustar rápidamente el acceso a varias cuentas a la vez. Si crea una nueva base de datos para el equipo de ventas, puede proporcionarle al salesteam acceso de rol en lugar de rastrear cada cuenta que debería tener acceso.



Creando roles

Si tienes una cuenta con el CREATE ROLE privilegio, puede administrar roles usando el CREATE ROLE comando.


¿Cuál es la sintaxis de MySQL para roles?

Los nombres de roles deben seguir un formato específico para que MySQL los considere válidos. En muchos sentidos, reflejan el formato utilizado para definir las cuentas de usuario de MySQL, pero con algunas diferencias importantes.

Los roles siguen el siguiente formato:

'<role>'@'<host>'

Al igual que los usuarios, los roles tienen dos componentes:el nombre del rol y el host desde el que se conecta el cliente. Sin embargo, la forma en que MySQL interpreta estos componentes difiere.

Con roles, el '<role>' parte del nombre nunca puede estar en blanco. No existe el concepto de que un rol sea "anónimo" como ocurre con los usuarios. Por otro lado, omitiendo el '<host>' porción es aún está permitido, y MySQL usará % como anfitrión. Sin embargo, el % en este contexto se interpreta como un carácter literal, no como un comodín.

Efectivamente, esto significa que aunque los nombres de los roles comparten superficialmente el formato de los nombres de las cuentas de usuario, no se someten a ningún tipo de evaluación como las cuentas de usuario y son solo una etiqueta con dos componentes. La razón por la que hacen tiene dos partes en su nombre es que puede crear cuentas de usuario que pueden funcionar como usuarios y roles. Cuando se usa como usuario, los componentes están sujetos a las reglas de evaluación especiales descritas en el artículo de administración de usuarios y cuando se usa como rol, el nombre se compara directamente usando los nombres literales de los componentes.

Debido a estas reglas, en muchos casos, los administradores eligen definir roles usando solo el '<role>' componente. Esto hace que MySQL sustituya un literal % carácter para el '<host>' componente, haciendo que esa parte del nombre sea invisible e intrascendente. Si no desea que un nombre se use como cuenta de usuario y rol, puede hacer lo mismo.



¿Cómo se crean roles?

Para crear nuevos roles, use CREATE ROLE comando.

La sintaxis básica se ve así:

CREATE ROLE '<role>'@'<host>';

También puede crear varios roles al mismo tiempo separando cada nombre de rol con una coma:

CREATE ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';

Si alguno de los roles que especifica ya existe en el sistema, el comando fallará con un error.

Para evitar esto y hacer que MySQL solo emita una advertencia, puede incluir IF NOT EXISTS cláusula después de CREATE ROLE comando antes de los nombres de roles:

CREATE ROLE IF NOT EXISTS '<role>'@'<host>';

Como se mencionó anteriormente, muchas veces los administradores omiten el '<host>' parte del nombre del rol para simplificar, implícito establecerlo en el literal % personaje. Entonces, en la práctica, muchos de sus comandos de creación de roles podrían parecerse más a esto:

CREATE ROLE '<role>';



¿Cómo otorga privilegios a un rol?

Después de crear nuevos roles, su próxima prioridad suele ser hacerlos significativos otorgándoles privilegios.

Otorga privilegios a los roles de la misma manera que otorga privilegios a las cuentas de usuario. Usted proporciona los privilegios exactos que desea otorgar, especifica un alcance al proporcionar la base de datos y el objeto de la base de datos donde el privilegio es válido, y la entidad a la que se le deben otorgar los privilegios, en este caso, un rol:

GRANT <privileges> ON <database>.<object> TO '<role>'@'<host>';

Por ejemplo, para otorgar el SELECT privilegio a un rol llamado readapp en el appdb base de datos y todos los objetos que contiene, puede escribir:

GRANT SELECT ON appdb.* TO 'readapp';

De manera similar, puede otorgar privilegios de escritura a la misma base de datos a un rol llamado writeapp escribiendo:

GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'writeapp';

Puede otorgar privilegios y revocarlos de los roles exactamente como lo haría directamente con las cuentas de usuario. Por lo tanto, siempre puede modificar los privilegios asociados con un rol si necesita ajustar el nivel de acceso que desea proporcionar.



¿Cómo se concede a los usuarios la pertenencia a un rol?

Una vez que haya agregado privilegios a sus funciones, puede comenzar a agregar miembros a la función para otorgarles los privilegios asociados.

Para hacer esto, MySQL usa una forma diferente del mismo GRANT usamos para otorgar privilegios a usuarios y roles. Este nuevo formulario, sin embargo, agrega funciones a un usuario, lo que permite que la cuenta de usuario acceda a todos los privilegios otorgados a la función.

La sintaxis básica se ve así:

GRANT '<role>'@'<host>' TO '<user>'@'<host>';

Por ejemplo, si 'reports'@'localhost' el usuario debe poder leer datos de appdb base de datos para generar informes, podemos agregar la readapp rol a la cuenta de usuario, otorgándole privilegios selectos:

GRANT 'readapp' TO 'reports'@'localhost';

De manera similar, para dar el 'appuser'@'localhost' la capacidad de administrar los datos dentro de la misma base de datos, podemos hacer que ese usuario sea miembro de writeapp rol:

GRANT 'writeapp' TO 'appuser'@'localhost';

El 'appuser'@'localhost' La cuenta ahora tendrá la capacidad de insertar, actualizar y eliminar datos de la base de datos. Si se agregan nuevos privilegios a la writeapp rol, el 'appuser'@'localhost' cuenta obtendrá inmediatamente esos privilegios.


¿Cómo otorga automáticamente ciertas funciones a cada usuario?

A veces puede haber roles a los que desee que todos los usuarios de su sistema tengan acceso. Puede definir qué roles se otorgan automáticamente a cada cuenta configurando mandatory_roles variables.

Para modificar los mandatory_roles variable, su usuario debe tener el ROLE_ADMIN y SYSTEM_VARIABLES_ADMIN privilegios Puede establecer los roles que desea otorgar a cada usuario escribiendo:

SET PERSIST mandatory_roles = '`<role_1>`@`<host>`, `<role_2>`@`<host>`, `<role_3>`@`<host>`';

Aquí, le damos a cada usuario en el sistema tres roles automáticamente. Al configurar la variable del sistema, el valor de mandatory_roles debe ser una cadena, por lo que encapsulamos toda la lista de roles entre comillas simples y usamos acentos graves para citar componentes de roles individuales.

No puede agregar un rol a mandatory_roles lista que tiene el SYSTEM_USER privilegio. Esta es una medida de seguridad para garantizar que no todas las sesiones en el sistema sean sesiones del sistema automáticamente.




¿Cómo se usan los privilegios de los roles?

Una vez que haya otorgado la membresía de las cuentas de usuario a los roles, ¿cómo los usa? Para acceder a los privilegios otorgados a una cuenta por un rol, debe estar activado.


Ver los roles activos actuales

Antes de activar nuevos roles, puede verificar qué roles están actualmente activos para su sesión de usuario.

Para ver los roles activos de su sesión, escriba:

SELECT CURRENT_ROLE()

La salida mostrará cero o más roles que están activos en su sesión actual. Los privilegios asociados con esos roles se agregarán a las acciones que puede realizar.



Cómo activar roles para la sesión

Para cambiar qué funciones están activas durante su sesión, use SET ROLE dominio. Puede usar este comando de varias maneras diferentes.

La sintaxis básica se ve así:

SET ROLE '<rolename>'@'<host>';

Esto activará el rol en cuestión. Es importante tener en cuenta que cualquier rol previamente activo no mencionado en SET ROLE ahora se desactivará el comando.

Para activar más de un rol a la vez, separe cada rol con una coma:

SET ROLE '<role_1>'@'<host>', '<role_2>'@'<host>', '<role_3>'@'<host>';

Para activar todos los roles que se han otorgado a su cuenta, puede especificar ALL en lugar de un rol específico:

SET ROLE ALL;

También puede decirle a MySQL que active todos sus roles con una excepción específica usando ALL EXCEPT :

SET ROLL ALL EXCEPT '<role_1>'@'<host>';

Otra opción es deshabilitar todos los roles en su cuenta especificando NONE :

SET ROLE NONE

Esto desactivará todas las funciones de sus usuarios para la sesión, otorgándole solo los privilegios asignados específicamente a su cuenta de usuario.

Para volver a la lista predeterminada de roles definidos para su cuenta, use el DEFAULT palabra clave:

SET ROLE DEFAULT


Cómo definir roles predeterminados para una cuenta de usuario

Los roles que se activan automáticamente cuando inicias sesión como usuario y los que se reactivan cuando usas SET ROLE DEFAULT son configurables.

Para definir los roles que se activarán por defecto, utilice el SET DEFAULT ROLE comando similar a cómo usa el SET ROLE comando:

SET DEFAULT ROLE '<role_1>'@'<host>';

Esto establecerá los roles predeterminados que se activarán para su propia cuenta al iniciar sesión o al usar SET ROLE DEFAULT .

Si tu usuario tiene el CREATE USER privilegio, puede configurar los roles predeterminados para otras cuentas:

SET DEFAULT ROLE ALL TO '<user>'@'<host>';

Aquí especificamos que el '<user>'@'<host>' la cuenta debería activar automáticamente todas sus funciones al autenticarse.

Esta sintaxis también se puede usar para definir los roles predeterminados para más de una cuenta separando cada usuario con una coma:

SET DEFAULT ROLE ALL TO '<user_1>'@'<host>', '<user_2>'@'<host>';


Activar todas las funciones para todos los usuarios de forma predeterminada

Si desea que todas las cuentas de su servidor MySQL activen todas sus funciones de forma predeterminada, puede cambiar una configuración del sistema para hacerlo.

Cuando el activate_all_roles_on_login se establece en verdadero, MySQL activará automáticamente todos los roles asociados con una cuenta al iniciar sesión. Esto reemplaza la configuración especificada por SET DEFAULT ROLE .

Para habilitar esta característica, debe tener el SYSTEM_VARIABLES_ADMIN y ROLE_ADMIN privilegios Habilite la función escribiendo:

SET PERSIST activate_all_roles_on_login = ON;

Esto hará que las cuentas de usuario activen automáticamente todos los roles al iniciar sesión. Sin embargo, SET ROLE DEFAULT aún le permitirá activar solo los roles predeterminados asociados con una cuenta.




Mostrar privilegios existentes obtenidos de roles

Para comprender qué privilegios están disponibles en su cuenta, puede usar SHOW GRANTS comando.

Para verificar las concesiones habilitadas para un usuario, escriba:

SHOW GRANTS FOR '<user>'@'<host>';

El resultado le mostrará todos los privilegios asignados directamente a la cuenta de usuario, así como todos los roles de los que el usuario es miembro.

Después de conocer los roles de los que es miembro una cuenta, puede comprobar qué privilegios proporciona ese rol al usuario escribiendo:

SHOW GRANTS FOR '<user>'@'<host>' USING '<role>'@'<host>';

Por ejemplo, para verificar los privilegios del 'reports'@'localhost' usuario, incluidas las otorgadas por su pertenencia a la readapp rol, puede usar:

SHOW GRANTS FOR 'reports'@'localhost' USING 'readapp';

Esto le mostrará todos los privilegios otorgados explícitamente al 'reports'@'localhost' cuenta de usuario, así como los agregados por readapp rol.



Revocar un rol de un usuario

Entonces, ¿qué sucede cuando desea eliminar un rol de un usuario? Similar a cómo GRANT El comando puede agregar nuevos privilegios a un usuario o rol o agregar roles a un usuario, el REVOKE El comando puede eliminar los privilegios de un usuario o una función y también puede eliminar la pertenencia a una función de un usuario.

La sintaxis básica utilizada para eliminar un rol de una cuenta de usuario es así:

REVOKE '<role>' FROM '<user>'@'<host>';

Después de ejecutar una declaración como esta, el usuario ya no tendrá acceso a los privilegios que se otorgaron a través del rol.

Como ejemplo, podemos revocar la writeapp función del 'appuser'@'localhost' cuenta de usuario escribiendo:

REVOKE 'writeapp' FROM 'appuser'@'localhost';

Sin embargo, si al usuario se le ha otorgado un privilegio a través de otros medios (ya sea directamente o mediante una membresía con un rol diferente), aún tendrá acceso a ese privilegio. Entonces, si 'appuser'@'localhost' el usuario también era miembro de readapp rol que otorgamos anteriormente, aún tendrían SELECT privilegios en appdb base de datos.



Conclusión

El uso de roles para distribuir privilegios en sus bases de datos MySQL puede ayudar a simplificar la sobrecarga de administración y la complejidad de su sistema de control de acceso. Es mucho más fácil asegurarse de que los usuarios con las mismas responsabilidades tengan los mismos privilegios usando roles que otorgar muchos privilegios diferentes directamente.

De manera similar, los roles le permiten ser explícito sobre la intención detrás de la concesión de privilegios. En lugar de otorgar una gran cantidad de privilegios a las cuentas sin ningún comentario, los nombres de roles elegidos cuidadosamente pueden ayudar a distinguir entre diferentes motivos de acceso. Al tomarse el tiempo para crear y organizar roles con anticipación, su capacidad para administrar el acceso de los usuarios a diferentes partes de sus datos será más sencilla a largo plazo.