PRIVILEGIOS DINÁMICOS EN MYSQL

Después de explicar los privilegios en MySQL hay que explicar los privilegios dinámicos en MySQL. Son permisos introducidos a partir de MySQL 8 que no están asociados a objetos específicos de la base de datos (como tablas o bases de datos), sino a funcionalidades o componentes del servidor. A diferencia de los privilegios (como SELECT, INSERT, etc.), los privilegios dinámicos se relacionan con operaciones administrativas o características específicas del sistema.
Los privilegios dinámicos en MySQL son permisos que se crean dinámicamente por el servidor o por componentes o plugins instalados. No están predefinidos en el núcleo de MySQL, sino que se registran cuando se instala o activa un componente (por ejemplo, un plugin de auditoría o un motor de almacenamiento). Se almacenan en la tabla mysql.global_grants en lugar de las tablas tradicionales de privilegios (mysql.user, mysql.db, etc.).

Ejemplos de Privilegios Dinámicos

Algunos ejemplos comunes de privilegios dinámicos en MySQL 8.0+ incluyen:
  • AUDIT_ADMIN: Permite configurar y administrar auditorías.
  • BACKUP_ADMIN: Permite realizar operaciones de respaldo (como usar mysqldump con ciertas configuraciones).
  • BINLOG_ADMIN: Controla la gestión del registro binario (binary log).
  • CONNECTION_ADMIN: Permite administrar conexiones de usuarios (por ejemplo, matar conexiones).
  • ENCRYPTION_KEY_ADMIN: Gestiona claves de cifrado para funciones de seguridad.
  • FIREWALL_ADMIN: Permite configurar reglas de firewall de MySQL.
  • REPLICATION_SLAVE_ADMIN: Gestiona la configuración de réplicas esclavas.
  • SESSION_VARIABLES_ADMIN: Permite modificar variables de sesión específicas.
  • SYSTEM_VARIABLES_ADMIN: Permite modificar variables globales del sistema.
La lista completa de privilegios dinámicos disponibles depende de la versión de MySQL y los componentes instalados. Se puedes consultar los privilegios dinámicos registrados con la query:

SELECT * FROM mysql.global_grants;
Los privilegios dinámicos suelen estar asociados a plugins o componentes. Por ejemplo el plugin de auditoría (audit_log) puede introducir privilegios como AUDIT_ADMIN y el componente de firewall de MySQL introduce FIREWALL_ADMIN y FIREWALL_USER. Si un componente se desinstala, los privilegios dinámicos asociados dejan de estar disponibles, pero las asignaciones permanecen en mysql.global_grants hasta que se revocan explícitamente.

Gestión de Privilegios Dinámicos

os privilegios dinámicos se gestionan con los mismos comandos que los privilegios (GRANT, REVOKE, etc.), pero se aplican a nivel global (ON *.*).
  • Otorgar Privilegios Dinámicos:

    //Otorgar al usuario el privilegio dinámico BACKUP_ADMIN para realizar operaciones de respaldo.
    GRANT BACKUP_ADMIN ON *.* TO 'usuario'@'localhost';
    
  • Revocar Privilegios Dinámicos:

    REVOKE BACKUP_ADMIN ON *.* FROM 'usuario'@'localhost';
    
  • Ver Privilegios Dinámicos, para ver los privilegios dinámicos asignados a un usuario:

    SHOW GRANTS FOR 'usuario'@'localhost';
    
  • Privilegios Dinámicos y Roles, los privilegios dinámicos también pueden asignarse a roles (disponibles en MySQL 8.0+):

    CREATE ROLE 'rol_admin_backups';
    GRANT BACKUP_ADMIN ON *.* TO 'rol_admin_backups';
    GRANT 'rol_admin_backups' TO 'usuario'@'localhost';
    SET DEFAULT ROLE 'rol_admin_backups' FOR 'usuario'@'localhost';
    
Ejemplo de como otorgar a un usuario la capacidad de administrar copias de seguridad:

-- Crear usuario
CREATE USER 'admin_backups'@'localhost' IDENTIFIED BY 'contraseña';
-- Otorgar privilegio dinámico
GRANT BACKUP_ADMIN ON *.* TO 'admin_backups'@'localhost';
-- Verificar
SHOW GRANTS FOR 'admin_backups'@'localhost';
-- Revocar si es necesario
REVOKE BACKUP_ADMIN ON *.* FROM 'admin_backups'@'localhost';
Para ver qué privilegios dinámicos están registrados en el servidor hay que ejecutar la siguiente query:

SELECT * FROM mysql.global_grants;
Y para comprobar componentes instalados hay que ejecutar la siguiente query:

SELECT * FROM mysql.component;