MySQL: ¿Conceder opciones de solo lectura?


Tengo un usuario al que quiero conceder todos los permisos de LECTURA en un esquema de bd.

Una forma es esta :

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

¿Hay alguna forma de agrupar todas las operaciones leídas en grant ?

 69
Author: Ajeet Ganga, 2013-11-18

6 answers

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

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

"Leer" desde tablas y vistas es el privilegio SELECT. Si eso es lo que quieres decir con "todo leído" entonces sí:

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

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

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

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

"Leyendo" el estado de replicación actual es el privilegio REPLICATION CLIENT.

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

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

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

Sin embargo, no hay un solo privilegio que otorgue algún subconjunto de otros privilegios, que es lo que parece que está pidiendo.

Si está haciendo las cosas manualmente y buscando una manera más fácil de hacerlo sin necesidad de recordar la concesión exacta que normalmente hace para una determinada clase de usuario, puede buscar la instrucción para regenerar las concesiones de un usuario comparable, y cambiarla para crear un nuevo usuario con privilegios:

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 coincida con el nuevo usuario que desea agregar, junto con la contraseña, resultará en una declaración GRANT reutilizable para crear un nuevo usuario.

De, si desea una sola operación para configurar y conceder el conjunto limitado de privilegios a los usuarios, y tal vez eliminar cualquier privilegio inmerecido, que se puede hacer mediante la creación de un procedimiento almacenado que encapsula todo lo que desea hacer. Dentro del cuerpo del procedimiento, construirías la GRANT sentencia con SQL dinámico y / o manipular directamente las tablas de grant.

En esta pregunta reciente sobre los Administradores de bases de datos, el poster quería la capacidad de un usuario sin privilegios para modificar a otros usuarios, que por supuesto no es algo que normalmente se puede hacer a un usuario que puede modificar a otros usuarios es, prácticamente por definición, no un usuario sin privilegios however sin embargo procedures los procedimientos almacenados proporcionaron una buena solución en ese caso, porque se ejecutan con contexto de seguridad de su usuario DEFINER, permitiendo a cualquier persona con privilegios EXECUTE en el procedimiento asumir temporalmente privilegios escalados para permitirles hacer las cosas específicas que el procedimiento logra.

 118
Author: Michael - sqlbot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:42:36
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Esto creará un usuario con privilegios SELECT para todas las bases de datos, incluidas las vistas.

 12
Author: Mahesh Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-26 17:24:20

Varios permisos que puede conceder 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 proporcionar un permiso a un usuario específico, puede usar este marco:

CONCEDER [tipo de permiso] SOBRE [nombre de la base de datos].[nombre de la tabla] A '[nombre de usuario]'@'localhost'; Encontré este artículo muy útil

 4
Author: ath j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-12 10:50:50

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 símbolo del sistema 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 para la cuenta root. En el prompt de mysql, realice uno de los siguientes pasos:

Para dar al usuario acceso 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 colector será instalado 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 sabe 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 ser resuelto por DNS o por el archivo de hosts local. En el símbolo del sistema mysql, escriba el siguiente comando:

flush privileges;

Escriba quit.

Lo 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
 2
Author: biniam_Ethiopia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-26 15:28:14

Incluso el usuario tiene 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 intento cubrirlo.

Si desea proporcionar permiso de lectura a un usuario simple (No tipo de administrador de)-

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

Nota: Se requiere EJECUTAR aquí, para que el usuario pueda leer datos si hay un procedimiento almacenado que produzca un informe (tenga pocas instrucciones select).

Reemplace localhost con IP específica desde la que el usuario se conectará DB.

Los permisos de lectura adicionales son -

  • MOSTRAR VISTA : Si desea mostrar el esquema de vista.
  • CLIENTE DE REPLICACIÓN : Si el usuario necesita comprobar el estado de replicación/esclavo. Pero es necesario dar permiso a todos los DB.
  • PROCESO : Si el usuario necesita comprobar el proceso en ejecución. Trabajará con todos Sólo DB.
 2
Author: Zafar Malik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-26 23:07:50

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

 0
Author: Daniel Fisher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-22 13:34:06