REVOKE
Si GRANT es la herramienta para conceder permisos, REVOKE es su contraparte para retirarlos. En la administración de bases de datos es habitual que los requisitos de acceso cambien con el tiempo: un empleado cambia de departamento, una aplicación deja de necesitar acceso de escritura o se detecta que una cuenta tiene más privilegios de los necesarios. La sentencia REVOKE permite ajustar estos permisos de forma precisa sin necesidad de eliminar y recrear la cuenta del usuario.
Dominar REVOKE es tan importante como dominar GRANT, ya que mantener privilegios innecesarios activos representa un riesgo de seguridad que puede prevenirse fácilmente.
Sintaxis
La sintaxis básica de REVOKE sigue una estructura similar a GRANT:
REVOKE privilegio1, privilegio2, ...
ON nivel_de_privilegio
FROM 'usuario'@'host';Para revocar todos los privilegios de un usuario:
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM 'usuario'@'host';Es importante observar que REVOKE usa FROM en lugar del TO que emplea GRANT. Este detalle sintáctico diferencia claramente la operación de otorgar de la de retirar.
Comportamiento básico
Cuando ejecutas REVOKE, MySQL elimina el privilegio especificado de las tablas del sistema correspondientes. Si el usuario tenía el privilegio a nivel de base de datos, se elimina de mysql.db; si era a nivel de tabla, de mysql.tables_priv, y así sucesivamente.
REVOKE INSERT ON tienda.productos FROM 'vendedor'@'localhost';Después de ejecutar esta sentencia, el usuario vendedor ya no podrá insertar registros en la tabla productos, pero conservará cualquier otro privilegio que tuviera asignado.
Un aspecto crucial es que REVOKE debe coincidir con el nivel al que se otorgó el privilegio. Si otorgaste SELECT a nivel de base de datos con GRANT SELECT ON tienda.*, no puedes revocarlo a nivel de tabla con REVOKE SELECT ON tienda.productos. Debes revocar al mismo nivel:
-- Esto funciona correctamente
GRANT SELECT ON tienda.* TO 'lector'@'localhost';
REVOKE SELECT ON tienda.* FROM 'lector'@'localhost';
-- Esto NO revoca el SELECT otorgado a nivel de base de datos
REVOKE SELECT ON tienda.productos FROM 'lector'@'localhost';Caso práctico: revocar privilegios específicos
Imagina que el usuario desarrollador fue creado con privilegios amplios durante la fase de desarrollo de un proyecto y ahora necesitas restringir su acceso para producción.
Primero verificas sus privilegios actuales:
SHOW GRANTS FOR 'desarrollador'@'192.168.1.%';| Grants for desarrollador@192.168.1.% |
|---|
GRANT USAGE ON . TO desarrollador@192.168.1.% |
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON proyecto.* TO desarrollador@192.168.1.% |
Para producción, el desarrollador solo necesita lectura y escritura de datos, sin capacidad de modificar la estructura de las tablas:
REVOKE CREATE, DROP, ALTER
ON proyecto.*
FROM 'desarrollador'@'192.168.1.%';Verificamos que los cambios se aplicaron correctamente:
SHOW GRANTS FOR 'desarrollador'@'192.168.1.%';| Grants for desarrollador@192.168.1.% |
|---|
GRANT USAGE ON . TO desarrollador@192.168.1.% |
GRANT SELECT, INSERT, UPDATE, DELETE ON proyecto.* TO desarrollador@192.168.1.% |
Los privilegios estructurales (CREATE, DROP, ALTER) han sido eliminados y el usuario conserva únicamente las operaciones de datos.
Caso práctico: revocar todos los privilegios
Cuando un empleado deja la empresa o una cuenta de servicio queda obsoleta, puedes revocar todos sus privilegios de una sola vez antes de eliminar la cuenta:
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM 'exempleado'@'%';Esta sentencia elimina absolutamente todos los privilegios del usuario en todos los niveles: global, base de datos, tabla y columna. También elimina el GRANT OPTION si lo tenía, lo que impide que delegue permisos.
Después de revocar todo, el usuario sigue existiendo pero solo tiene el privilegio USAGE, que simplemente permite conectarse:
SHOW GRANTS FOR 'exempleado'@'%';| Grants for exempleado@% |
|---|
GRANT USAGE ON . TO exempleado@% |
Si además quieres impedir que se conecte, deberás bloquear la cuenta o eliminarla con DROP USER.
Caso práctico: auditoría y revisión periódica de privilegios
Una buena práctica de seguridad consiste en revisar periódicamente los privilegios asignados. Puedes consultar las tablas del sistema para identificar cuentas con acceso excesivo:
SELECT user, host, Select_priv, Insert_priv, Update_priv,
Delete_priv, Create_priv, Drop_priv, Super_priv
FROM mysql.user
WHERE user NOT IN ('root', 'mysql.sys', 'mysql.session', 'mysql.infoschema')
ORDER BY user;| user | host | Select_priv | Insert_priv | Drop_priv | Super_priv |
|---|---|---|---|---|---|
| app_web | 10.0.1.% | N | N | N | N |
| dba_junior | localhost | Y | Y | Y | N |
| exempleado | % | N | N | N | N |
Los privilegios marcados con Y en esta tabla son privilegios globales. Recuerda que un usuario puede tener privilegios adicionales a nivel de base de datos o tabla que no aparecen aquí. Para una auditoría completa, debes consultar también mysql.db y mysql.tables_priv:
SELECT user, host, db, Select_priv, Insert_priv, Update_priv, Delete_priv
FROM mysql.db
WHERE user NOT IN ('root', 'mysql.sys')
ORDER BY user, db;Si durante la auditoría encuentras privilegios que ya no son necesarios, revócalos inmediatamente:
REVOKE DROP ON proyecto.* FROM 'dba_junior'@'localhost';Advertencia: Ten cuidado al revocar privilegios de cuentas de aplicación en producción. Revocar un privilegio necesario puede provocar errores inmediatos en la aplicación. Siempre verifica qué operaciones realiza la aplicación antes de modificar sus permisos.
Consejo: Antes de ejecutar
REVOKE, es buena práctica documentar los privilegios actuales del usuario conSHOW GRANTS. De esta forma, si la revocación causa problemas, podrás restaurar los privilegios rápidamente con las sentenciasGRANTcorrespondientes.
En el siguiente artículo aprenderás a usar roles en MySQL para gestionar privilegios de forma agrupada y simplificar la administración de permisos.
Escrito por Eduardo Lázaro
