MySql: Accorder des options en lecture seule?

98

J'ai un utilisateur auquel je souhaite accorder toutes les autorisations READ sur un schéma de base de données.

Une façon est la suivante:

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

Existe-t-il un moyen de regrouper toutes les opérations de lecture dans grant?

Ajeet Ganga
la source
Le privilège est SHOW VIEWnon SHOW_VIEW, mais vous n'avez pas besoin de l'accorder à un utilisateur à moins que vous ne vouliez qu'il puisse le faire SHOW CREATE VIEWsur les vues ... ils peuvent sélectionner parmi les vues avec le seul SELECTprivilège. Qu'entendez-vous par «regrouper toutes les opérations de lecture dans la concession»?
Michael - sqlbot
S'il existe un seul privilège qui correspond à TOUTES les opérations de lecture sur la base de données. Je comprends qu'ils fournissent un accès précis, mais une abstraction pratique de haut niveau nous aurait aidés.
Ajeet Ganga

Réponses:

161

S'il existe un seul privilège qui correspond à TOUTES les opérations de lecture sur la base de données.

Cela dépend de la façon dont vous définissez «tout lu».

"Lire" à partir de tables et de vues est le SELECTprivilège. Si c'est ce que vous entendez par «tous lus», alors oui:

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

Cependant, on dirait que vous voulez dire une capacité à «voir» tout, à «regarder mais pas toucher». Alors, voici les autres types de lecture qui me viennent à l'esprit:

"Lire" la définition des vues est le SHOW VIEWprivilège.

"Lire" la liste des requêtes en cours d'exécution par d'autres utilisateurs est le PROCESSprivilège.

"Lire" l'état de réplication actuel est le REPLICATION CLIENTprivilège.

Notez que tout ou partie de ces éléments peut exposer plus d'informations que vous ne comptez exposer, selon la nature de l'utilisateur en question.

Si c'est la lecture que vous voulez faire, vous pouvez combiner n'importe lequel de ceux-ci (ou tout autre des privilèges disponibles ) dans une seule GRANTinstruction.

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

Cependant, il n'y a pas de privilège unique qui accorde un sous-ensemble d'autres privilèges, ce que vous semblez demander.

Si vous faites les choses manuellement et que vous recherchez un moyen plus simple de procéder sans avoir à vous souvenir de la subvention exacte que vous accordez généralement à une certaine classe d'utilisateurs, vous pouvez rechercher l'instruction pour régénérer les subventions d'un utilisateur comparable et la modifier. pour créer un nouvel utilisateur avec des privilèges similaires:

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)

Changer «not_leet» et «localhost» pour correspondre au nouvel utilisateur que vous souhaitez ajouter, avec le mot de passe, entraînera une GRANTinstruction réutilisable pour créer un nouvel utilisateur.

De, si vous souhaitez qu'une seule opération configure et accorde le jeu limité de privilèges aux utilisateurs, et peut-être supprimer tous les privilèges non mérités, cela peut être fait en créant une procédure stockée qui encapsule tout ce que vous voulez faire. Dans le corps de la procédure, vous construisez l' GRANTinstruction avec du SQL dynamique et / ou manipulez directement les tables d'octroi elles-mêmes.

Dans cette question récente sur les administrateurs de base de données , l'affiche voulait la possibilité pour un utilisateur non privilégié de modifier d'autres utilisateurs, ce qui, bien sûr, n'est pas quelque chose qui peut normalement être fait - un utilisateur qui peut modifier d'autres utilisateurs est, à peu près par définition, non un utilisateur non privilégié - cependant - les procédures stockées ont fourni une bonne solution dans ce cas, car elles s'exécutent avec le contexte de sécurité de leur DEFINERutilisateur, permettant à toute personne disposant de EXECUTEprivilèges sur la procédure d'assumer temporairement des privilèges accrus pour leur permettre de faire les choses spécifiques la procédure accomplit.

Michael - sqlbot
la source
1
Merci. Outre une excellente réponse, j'ai également aimé votre mot de passe. :)
Ajeet Ganga
2
A noter: PROCESS et REPLICATION CLIENT sont des types de privilèges "globaux", donc la syntaxe échouera lorsqu'elle sera définie avec une exclusion "par base de données". GRANT PROCESS ON mydb. * Ne serait pas valide, mais GRANT PROCESS ON *. * Serait OK.
Bee Kay
GRANT SELECT ON db_name. * TO 'demo' @ '%' AVEC GRANT OPTION;
Musa
16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Cela créera un utilisateur avec des SELECTprivilèges pour toutes les bases de données, y compris les vues.

Mahesh Patil
la source
9

Différentes autorisations que vous pouvez accorder à un utilisateur sont

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

Pour fournir une autorisation à un utilisateur spécifique, vous pouvez utiliser ce framework:

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

J'ai trouvé cet article très utile

ath j
la source
3

Un guide étape par étape que j'ai trouvé ici .

Pour créer un compte utilisateur de base de données en lecture seule pour MySQL

À l'invite UNIX, exécutez le programme de ligne de commande MySQL et connectez-vous en tant qu'administrateur en tapant la commande suivante:

mysql -u root -p

Tapez le mot de passe du compte root. À l'invite mysql, effectuez l'une des étapes suivantes:

Pour donner à l'utilisateur l'accès à la base de données à partir de n'importe quel hôte, tapez la commande suivante:

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

Si le collecteur sera installé sur le même hôte que la base de données, saisissez la commande suivante:

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

Cette commande donne à l'utilisateur un accès en lecture seule à la base de données à partir de l'hôte local uniquement. Si vous connaissez le nom d'hôte ou l'adresse IP de l'hôte sur lequel le collecteur sera installé, tapez la commande suivante:

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

Le nom d'hôte doit pouvoir être résolu par DNS ou par le fichier d'hôtes local. À l'invite mysql, tapez la commande suivante:

flush privileges;

Tapez quit.

Voici une liste d'exemples de commandes et de messages de confirmation:

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
la source
3

Même l'utilisateur a obtenu une réponse et @Michael - sqlbot a très bien couvert la plupart des points dans son message, mais un point manque, alors essayez simplement de le couvrir.

Si vous souhaitez fournir une autorisation de lecture à un utilisateur simple (pas de type administrateur) -

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

Remarque: EXECUTE est requis ici, afin que l'utilisateur puisse lire les données s'il existe une procédure stockée qui produit un rapport (avec quelques instructions de sélection).

Remplacez localhost par une adresse IP spécifique à partir de laquelle l'utilisateur se connectera à DB.

Les autorisations de lecture supplémentaires sont-

  • SHOW VIEW: Si vous souhaitez afficher le schéma de vue.
  • CLIENT DE RÉPLICATION: si l'utilisateur a besoin de vérifier l'état de réplication / esclave. Mais besoin de donner la permission sur tous les DB.
  • PROCESSUS: Si l'utilisateur a besoin de vérifier le processus en cours. Fonctionnera uniquement avec tous les DB.
Zafar Malik
la source
1

Remarque pour MySQL 8, c'est différent

Vous devez le faire en deux étapes:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Daniel Patrick
la source
C'est la seule solution qui a fonctionné pour moi. Il semble que les autres solutions sont dépassées comme vous l'avez dit. Merci d'avoir fourni cette solution mise à jour.
Kyle Bridenstine il y a
0

Si vous souhaitez que la vue soit en lecture uniquement après avoir accordé l'autorisation de lecture, vous pouvez utiliser ALGORITHM = TEMPTABLE dans la définition DDL de la vue.

Daniel Fisher
la source