MySql: ¿Otorgar opciones de solo lectura?

97

Tengo un usuario al que quiero otorgarle todos los permisos READ en un esquema de base de datos.

Una forma es esta:

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

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

Ajeet Ganga
fuente
El privilegio SHOW VIEWno es SHOW_VIEW, pero no es necesario que se lo otorgue a un usuario a menos que desee que pueda hacerlo SHOW CREATE VIEWen las vistas ... pueden seleccionar de las vistas con el único SELECTprivilegio. ¿Qué quiere decir con "agrupar todas las operaciones de lectura en concesión"?
Michael - sqlbot
Si hay un único privilegio que represente TODAS las operaciones READ en la base de datos. Entiendo que están proporcionando un acceso detallado, pero una conveniente abstracción de alto nivel nos habría ayudado.
Ajeet Ganga

Respuestas:

161

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

Depende de cómo defina "todo leído".

"Leer" de tablas y vistas es un SELECTprivilegio. Si eso es lo que quiere decir con "todos leídos", entonces sí:

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

Sin embargo, parece que te refieres a la capacidad de "ver" todo, de "mirar pero no tocar". Entonces, aquí están los otros tipos de lectura que me vienen a la mente:

"Leer" la definición de vistas es un SHOW VIEWprivilegio.

"Leer" la lista de consultas en ejecución por otros usuarios es el PROCESSprivilegio.

"Leer" el estado de replicación actual es el REPLICATION CLIENTprivilegio.

Tenga en cuenta que cualquiera o todos estos podrían exponer más información de la que pretende exponer, según la naturaleza del usuario en cuestión.

Si esa es la lectura que desea hacer, puede combinar cualquiera de esos (o cualquier otro de los privilegios disponibles ) en una sola GRANTdeclaración.

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

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

Si está haciendo las cosas manualmente y busca una manera más fácil de hacerlo sin necesidad de recordar la concesión exacta que normalmente otorga a una determinada clase de usuario, puede buscar la declaración 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)

Cambiar 'not_leet' y 'localhost' para que coincidan con el nuevo usuario que desea agregar, junto con la contraseña, dará como resultado una GRANTdeclaración reutilizable para crear un nuevo usuario.

O, si desea que una sola operación configure y otorgue el conjunto limitado de privilegios a los usuarios, y tal vez elimine cualquier privilegio no merecido, puede hacerlo creando un procedimiento almacenado que encapsule todo lo que desea hacer. Dentro del cuerpo del procedimiento, construiría la GRANTdeclaración 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 la capacidad de un usuario sin privilegios de modificar a otros usuarios, lo cual, por supuesto, no es algo que se pueda hacer normalmente; un usuario que puede modificar a otros usuarios, prácticamente por definición, no es un usuario sin privilegios, sin embargo, los procedimientos almacenados proporcionaron una buena solución en ese caso, porque se ejecutan con el contexto de seguridad de su DEFINERusuario, lo que permite a cualquier persona con EXECUTEprivilegios en el procedimiento asumir temporalmente privilegios escalados para permitirles hacer las cosas específicas que procedimiento logra.

Michael - sqlbot
fuente
1
Gracias. Aparte de una gran respuesta, también me gustó tu contraseña. :)
Ajeet Ganga
2
Cabe destacar: PROCESS y REPLICATION CLIENT son tipos de privilegios "globales", por lo que la sintaxis fallará cuando se defina con una exclusión "por base de datos". GRANT PROCESS ON mydb. * No sería válido, pero GRANT PROCESS ON *. * Sería correcto.
Bee Kay
GRANT SELECT ON db_name. * PARA 'demo' @ '%' CON OPCIÓN DE GRANT;
Musa
16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Esto creará un usuario con SELECTprivilegios para todas las bases de datos, incluidas las Vistas.

Mahesh Patil
fuente
9

Varios permisos que puede otorgar a un usuario son

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Para otorgar un permiso a un usuario específico, puede usar este marco:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Encontré este artículo muy útil

ath j
fuente
3

Una guía paso a paso que encontré aquí .

Para crear una cuenta de usuario de base de datos de solo lectura para MySQL

En un indicador de UNIX, ejecute el programa de línea de comandos MySQL e inicie sesión como administrador escribiendo el siguiente comando:

mysql -u root -p

Escriba la contraseña de la cuenta raíz. En el indicador de mysql, realice uno de los siguientes pasos:

Para dar acceso al usuario a la base de datos desde cualquier host, escriba el siguiente comando:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Si el recopilador se instalará en el mismo host que la base de datos, escriba el siguiente comando:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

Este comando le da al usuario acceso de solo lectura a la base de datos solo desde el host local. Si conoce el nombre de host o la dirección IP del host en el que se instalará el recopilador, escriba el siguiente comando:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

El nombre de host debe poder resolverse mediante DNS o mediante el archivo de hosts local. En el indicador de mysql, escriba el siguiente comando:

flush privileges;

Escriba quit.

La siguiente es una lista de comandos de ejemplo y mensajes de confirmación:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
biniam
fuente
3

Incluso el usuario tiene una respuesta y @Michael - sqlbot ha cubierto la mayoría de los puntos muy bien en su publicación, pero falta un punto, así que solo trato de cubrirlo.

Si desea otorgar permiso de lectura a un usuario simple (no un tipo de administrador):

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Nota: Aquí se requiere EJECUTAR, para que el usuario pueda leer datos si hay un procedimiento almacenado que produce un informe (tiene pocas sentencias de selección).

Reemplace localhost con una IP específica desde la cual el usuario se conectará a la base de datos.

Los permisos de lectura adicionales son-

  • MOSTRAR VISTA: Si desea mostrar el esquema de vista.
  • CLIENTE DE REPLICACIÓN: Si el usuario necesita verificar el estado de replicación / esclavo. Pero es necesario dar permiso en todos los DB.
  • PROCESO: Si el usuario necesita verificar el proceso en ejecución. Funcionará solo con todos los DB.
Zafar Malik
fuente
0

Si desea que la vista sea de solo lectura después de otorgar el permiso de lectura, puede usar ALGORITHM = TEMPTABLE en la definición de DDL de su vista.

Daniel Fisher
fuente
0

Nota para MySQL 8 es diferente

Debe hacerlo en dos pasos:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Daniel Patrick
fuente