MySql : ¿Conceder opciones de sólo lectura?

Tengo un usuario, al que quiero conceder todos los permisos de LECTURA sobre un esquema db.

Una forma es esta:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

¿Hay alguna forma de agrupar todas las operaciones de lectura en una subvención?

Solución

Si hay un único privilegio que representa TODAS las operaciones de LECTURA en la base de datos.

Depende de cómo se define "todo read."

"Leer" de tablas y vistas es el privilegio SELECT. Si eso es lo que quieres decir con "all read" entonces sí:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

Sin embargo, suena como usted quiere decir una capacidad de "ver" todo, a "mirar pero no tocar." Por lo tanto, aquí están los otros tipos de lectura que vienen a la mente:

"Lectura" la definición de vistas es el privilegio SHOW VIEW.

Leer la lista de consultas ejecutadas por otros usuarios es el privilegio "PROCESAR".

Leer el estado actual de replicación es el privilegio "CLIENTE DE REPLICACIÓN".

Ten en cuenta que cualquiera de estos privilegios o todos ellos pueden exponer más información de la que pretendes exponer, dependiendo de la naturaleza del usuario en cuestión.

Si esa es la lectura que quieres hacer, puedes combinar cualquiera de ellos (o cualquier otro de los privilegios disponibles) en una única sentencia GRANT.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

Sin embargo, no existe un único privilegio que conceda algún subconjunto de otros privilegios, que es lo que parece que estás preguntando.

Si estás haciendo las cosas manualmente y buscando una manera más fácil de hacer esto sin necesidad de recordar la concesión exacta que normalmente haces para una cierta clase de usuario, puedes buscar la sentencia para regenerar las concesiones de un usuario comparable, y cambiarla para crear un nuevo usuario con privilegios similares:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Si cambias 'not_leet' y 'localhost' para que coincidan con el nuevo usuario que quieres añadir, junto con la contraseña, obtendrás una sentencia GRANT reutilizable para crear un nuevo usuario.

Por otro lado, si quieres una única operación para configurar y conceder el conjunto limitado de privilegios a los usuarios, y tal vez eliminar cualquier privilegio no merecido, eso se puede hacer mediante la creación de un procedimiento almacenado que encapsula todo lo que quieres hacer. Dentro del cuerpo del procedimiento, usted construiría la sentencia GRANT con SQL dinámico y/o manipularía directamente las propias tablas de concesión.

En esta pregunta reciente sobre Administradores de Bases de Datos, el autor quería que un usuario sin privilegios pudiera modificar a otros usuarios, lo que por supuesto no es algo que se pueda hacer normalmente -- un usuario que puede modificar a otros usuarios es, más o menos por definición, no es un usuario sin privilegios -- sin embargo -- los procedimientos almacenados proporcionan una buena solución en ese caso, porque se ejecutan con el contexto de seguridad de su usuario DEFINER, permitiendo a cualquiera con privilegio EXECUTE en el procedimiento asumir temporalmente privilegios escalados para permitirle hacer las cosas específicas que el procedimiento realiza.

Comentarios (3)
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Esto creará un usuario con privilegios SELECT para toda la base de datos incluyendo Views.

Comentarios (0)

Si desea que la vista sólo se pueda leer después de conceder el permiso de lectura, puede utilizar ALGORITHM = TEMPTABLE en la definición DDL de la vista.

Comentarios (0)