Roles
A medida que el número de usuarios en un servidor MySQL crece, gestionar privilegios individualmente se vuelve tedioso y propenso a errores. Si tienes veinte analistas que necesitan los mismos permisos, otorgar y revocar privilegios uno por uno para cada cuenta es ineficiente. Los roles resuelven este problema al permitirte definir un conjunto de privilegios bajo un nombre lógico y asignar ese rol a múltiples usuarios.
Los roles fueron introducidos en MySQL 8.0 y funcionan de manera similar a los grupos de permisos que encontrarías en cualquier sistema operativo. En lugar de pensar en privilegios individuales por usuario, piensas en funciones laborales como "analista", "desarrollador" o "administrador" y asignas los permisos correspondientes al rol.
Sintaxis
Para crear un rol se utiliza CREATE ROLE:
CREATE ROLE 'nombre_rol';Luego se asignan privilegios al rol con GRANT:
GRANT privilegios ON nivel TO 'nombre_rol';Y finalmente se asigna el rol a uno o más usuarios:
GRANT 'nombre_rol' TO 'usuario'@'host';Para que el rol esté activo en la sesión del usuario, este debe activarlo o se debe configurar como predeterminado:
SET DEFAULT ROLE 'nombre_rol' TO 'usuario'@'host';Comportamiento básico
Un rol en MySQL es técnicamente una cuenta de usuario especial que no está diseñada para conexiones directas, sino para agrupar privilegios. Cuando creas un rol, aparece en la tabla mysql.user igual que cualquier usuario, pero su propósito es exclusivamente servir como contenedor de permisos.
CREATE ROLE 'rol_lectura';
GRANT SELECT ON tienda.* TO 'rol_lectura';Hasta aquí has definido un rol llamado rol_lectura que tiene permiso de lectura sobre toda la base de datos tienda. Ahora puedes asignarlo a cualquier usuario:
GRANT 'rol_lectura' TO 'ana'@'localhost';
GRANT 'rol_lectura' TO 'pedro'@'localhost';
GRANT 'rol_lectura' TO 'lucia'@'192.168.1.%';Los tres usuarios heredan automáticamente el privilegio SELECT sobre tienda.*. Si en el futuro necesitas agregar SHOW VIEW a todos los analistas, solo modificas el rol:
GRANT SHOW VIEW ON tienda.* TO 'rol_lectura';Y los tres usuarios obtienen el nuevo privilegio sin necesidad de ejecutar tres sentencias GRANT individuales.
Caso práctico: diseño de roles para una empresa
Considera una empresa con tres perfiles de acceso a su base de datos de recursos humanos: analistas que solo consultan datos, gestores que modifican registros y administradores que pueden alterar la estructura.
-- Crear los roles
CREATE ROLE 'rrhh_analista', 'rrhh_gestor', 'rrhh_admin';
-- Asignar privilegios a cada rol
GRANT SELECT ON recursos_humanos.* TO 'rrhh_analista';
GRANT SELECT, INSERT, UPDATE, DELETE
ON recursos_humanos.*
TO 'rrhh_gestor';
GRANT ALL PRIVILEGES ON recursos_humanos.* TO 'rrhh_admin';Ahora asignas los roles según la función de cada empleado:
-- Analistas
GRANT 'rrhh_analista' TO 'maria'@'localhost';
GRANT 'rrhh_analista' TO 'jorge'@'localhost';
-- Gestores
GRANT 'rrhh_gestor' TO 'carmen'@'localhost';
-- Administradores
GRANT 'rrhh_admin' TO 'director_rrhh'@'localhost';Para que los roles funcionen automáticamente al conectarse, debes establecerlos como roles por defecto:
SET DEFAULT ROLE 'rrhh_analista' TO 'maria'@'localhost';
SET DEFAULT ROLE 'rrhh_analista' TO 'jorge'@'localhost';
SET DEFAULT ROLE 'rrhh_gestor' TO 'carmen'@'localhost';
SET DEFAULT ROLE 'rrhh_admin' TO 'director_rrhh'@'localhost';Si no estableces un rol por defecto, el usuario deberá activarlo manualmente en cada sesión con SET ROLE 'nombre_rol'.
Puedes verificar los roles asignados a un usuario:
SHOW GRANTS FOR 'maria'@'localhost';| Grants for maria@localhost |
|---|
GRANT USAGE ON . TO maria@localhost |
GRANT rrhh_analista@% TO maria@localhost |
Y los privilegios que contiene el rol:
SHOW GRANTS FOR 'rrhh_analista';| Grants for rrhh_analista@% |
|---|
GRANT USAGE ON . TO rrhh_analista@% |
GRANT SELECT ON recursos_humanos.* TO rrhh_analista@% |
Caso práctico: roles obligatorios con mandatory_roles
MySQL permite configurar roles que se asignan automáticamente a todos los usuarios mediante la variable de sistema mandatory_roles. Esto es útil cuando quieres que todos los usuarios tengan un conjunto base de permisos.
-- Crear un rol base con permisos mínimos
CREATE ROLE 'base_empleado';
GRANT SELECT ON empresa.directorio_interno TO 'base_empleado';
GRANT SELECT ON empresa.calendario_festivos TO 'base_empleado';
-- Configurar como rol obligatorio
SET GLOBAL mandatory_roles = 'base_empleado';A partir de este momento, cualquier usuario que se conecte tendrá automáticamente acceso de lectura al directorio interno y al calendario de festivos, sin necesidad de asignar el rol manualmente.
Para configurar múltiples roles obligatorios:
SET GLOBAL mandatory_roles = 'base_empleado,politicas_lectura';Para que esta configuración persista tras un reinicio del servidor, debes añadirla al archivo de configuración my.cnf:
[mysqld]
mandatory_roles = 'base_empleado'
Caso práctico: activación dinámica de roles
Un usuario puede tener múltiples roles asignados y activar diferentes combinaciones según la tarea que esté realizando. Esto proporciona flexibilidad sin comprometer la seguridad.
-- Un DBA tiene roles para distintas bases de datos
GRANT 'rrhh_admin' TO 'dba'@'localhost';
GRANT 'finanzas_admin' TO 'dba'@'localhost';
-- Establecer todos los roles como predeterminados
SET DEFAULT ROLE ALL TO 'dba'@'localhost';El DBA también puede activar y desactivar roles durante su sesión:
-- Activar solo el rol de RRHH
SET ROLE 'rrhh_admin';
-- Activar todos los roles asignados
SET ROLE ALL;
-- Desactivar todos los roles
SET ROLE NONE;Para consultar qué roles están activos en la sesión actual:
SELECT CURRENT_ROLE();| CURRENT_ROLE() |
|---|
rrhh_admin@%,finanzas_admin@% |
Advertencia: Los roles no se activan automáticamente a menos que configures un
DEFAULT ROLEo usesmandatory_roles. Si un usuario reporta que no tiene permisos a pesar de tener un rol asignado, lo primero que debes verificar es si el rol está activado en su sesión.
Consejo: Revocar un privilegio de un rol afecta inmediatamente a todos los usuarios que lo tienen asignado. Esto hace que la gestión centralizada sea poderosa pero también delicada: verifica siempre el impacto antes de modificar un rol utilizado por muchos usuarios.
En el siguiente artículo aprenderás a eliminar usuarios con DROP USER.
Escrito por Eduardo Lázaro
