MySql: Nur-Lese-Optionen gewähren?

97

Ich habe einen Benutzer, dem ich die gesamte READ-Berechtigung für ein Datenbankschema erteilen möchte.

Ein Weg ist folgender:

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

Gibt es eine Möglichkeit, alle Lesevorgänge in Grant zu gruppieren?

Ajeet Ganga
quelle
Das Privileg ist SHOW VIEWnicht SHOW_VIEW, aber Sie müssen dies einem Benutzer nicht gewähren, es sei denn, Sie möchten, dass er SHOW CREATE VIEWdie Ansichten bearbeiten kann ... er kann aus den Ansichten mit dem einzigen SELECTPrivileg auswählen . Was meinen Sie mit "Alle Lesevorgänge in Grant gruppieren"?
Michael - sqlbot
Wenn es ein einzelnes Privileg gibt, das für ALLE READ-Operationen in der Datenbank steht. Ich verstehe, dass sie einen feinkörnigen Zugang bieten, aber eine bequeme Abstraktion auf hoher Ebene hätte uns geholfen.
Ajeet Ganga

Antworten:

161

Wenn es ein einzelnes Privileg gibt, das für ALLE READ-Operationen in der Datenbank steht.

Es hängt davon ab, wie Sie "alle gelesen" definieren.

Das "Lesen" aus Tabellen und Ansichten ist das SELECTPrivileg. Wenn Sie das mit "alles gelesen" meinen, dann ja:

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

Es hört sich jedoch so an, als ob Sie die Fähigkeit meinen, alles zu "sehen", "zu schauen, aber nicht zu berühren". Also, hier sind die anderen Arten des Lesens, die mir in den Sinn kommen:

Das "Lesen" der Definition von Ansichten ist das SHOW VIEWPrivileg.

Das "Lesen" der Liste der aktuell ausgeführten Abfragen durch andere Benutzer ist das PROCESSPrivileg.

Das "Lesen" des aktuellen Replikationsstatus ist das REPLICATION CLIENTPrivileg.

Beachten Sie, dass einige oder alle dieser Informationen je nach Art des betreffenden Benutzers möglicherweise mehr Informationen enthalten, als Sie offenlegen möchten.

Wenn Sie dies lesen möchten, können Sie eine dieser (oder eine andere der verfügbaren) Berechtigungen in einer einzigen GRANTAnweisung kombinieren .

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

Es gibt jedoch kein einzelnes Privileg, das eine Teilmenge anderer Privilegien gewährt. So hört es sich an, als würden Sie fragen.

Wenn Sie die Dinge manuell ausführen und nach einer einfacheren Möglichkeit suchen, dies zu tun, ohne sich an die genaue Gewährung erinnern zu müssen, die Sie normalerweise für eine bestimmte Benutzerklasse gewähren, können Sie die Anweisung nachschlagen, um die Bewilligungen eines vergleichbaren Benutzers neu zu generieren, und sie ändern So erstellen Sie einen neuen Benutzer mit ähnlichen Berechtigungen:

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)

Wenn Sie 'not_leet' und 'localhost' so ändern, dass sie dem neuen Benutzer entsprechen, den Sie zusammen mit dem Kennwort hinzufügen möchten, wird eine wiederverwendbare GRANTAnweisung zum Erstellen eines neuen Benutzers erstellt.

Wenn Sie möchten, dass ein einzelner Vorgang den begrenzten Satz von Berechtigungen einrichtet und Benutzern gewährt und möglicherweise alle nicht verdienten Berechtigungen entfernt, können Sie eine gespeicherte Prozedur erstellen, die alles enthält, was Sie tun möchten. Im Hauptteil der Prozedur würden Sie die GRANTAnweisung mit dynamischem SQL erstellen und / oder die Grant-Tabellen selbst direkt bearbeiten.

In dieser aktuellen Frage zu Datenbankadministratoren wollte das Poster die Möglichkeit für einen nicht privilegierten Benutzer, andere Benutzer zu ändern. Dies ist natürlich normalerweise nicht möglich - ein Benutzer, der andere Benutzer ändern kann, ist dies per Definition nicht Ein nicht privilegierter Benutzer - gespeicherte Prozeduren - stellten in diesem Fall jedoch eine gute Lösung dar, da sie mit dem Sicherheitskontext seines DEFINERBenutzers ausgeführt werden und es jedem mit EXECUTEBerechtigung für die Prozedur ermöglichen, vorübergehend eskalierte Berechtigungen anzunehmen, damit er die spezifischen Dinge tun kann Verfahren erreicht.

Michael - sqlbot
quelle
1
Vielen Dank. Abgesehen von der tollen Antwort hat mir auch Ihr Passwort gefallen. :)
Ajeet Ganga
2
Bemerkenswert: PROCESS und REPLICATION CLIENT sind "globale" Berechtigungstypen, sodass die Syntax fehlschlägt, wenn sie mit einem Ausschluss "pro Datenbank" definiert wird. GRANT PROCESS ON mydb. * Wäre ungültig, GRANT PROCESS ON *. * Wäre in Ordnung.
Bee Kay
GRANT SELECT ON db_name. * TO 'demo' @ '%' WITH GRANT OPTION;
Musa
16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Dadurch wird ein Benutzer mit SELECTBerechtigungen für alle Datenbanken einschließlich Ansichten erstellt.

Mahesh Patil
quelle
9

Es gibt verschiedene Berechtigungen, die Sie einem Benutzer erteilen können

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

Um einem bestimmten Benutzer eine Berechtigung zu erteilen, können Sie dieses Framework verwenden:

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

Ich fand diesen Artikel sehr hilfreich

ath j
quelle
3

Eine Schritt-für-Schritt-Anleitung habe ich hier gefunden .

So erstellen Sie ein schreibgeschütztes Datenbankbenutzerkonto für MySQL

Führen Sie an einer UNIX-Eingabeaufforderung das MySQL-Befehlszeilenprogramm aus und melden Sie sich als Administrator an, indem Sie den folgenden Befehl eingeben:

mysql -u root -p

Geben Sie das Passwort für das Root-Konto ein. Führen Sie an der MySQL-Eingabeaufforderung einen der folgenden Schritte aus:

Geben Sie den folgenden Befehl ein, um dem Benutzer von einem beliebigen Host aus Zugriff auf die Datenbank zu gewähren:

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

Wenn der Collector auf demselben Host wie die Datenbank installiert wird, geben Sie den folgenden Befehl ein:

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

Mit diesem Befehl kann der Benutzer nur vom lokalen Host aus schreibgeschützt auf die Datenbank zugreifen. Wenn Sie den Hostnamen oder die IP-Adresse des Hosts kennen, auf dem der Collector installiert werden soll, geben Sie den folgenden Befehl ein:

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

Der Hostname muss durch DNS oder durch die lokale Hosts-Datei auflösbar sein. Geben Sie an der MySQL-Eingabeaufforderung den folgenden Befehl ein:

flush privileges;

Typ quit.

Das Folgende ist eine Liste von Beispielbefehlen und Bestätigungsmeldungen:

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
quelle
3

Sogar der Benutzer hat eine Antwort erhalten und @Michael - sqlbot hat die meisten Punkte in seinem Beitrag sehr gut behandelt, aber ein Punkt fehlt, also versuche nur, ihn zu behandeln.

Wenn Sie einem einfachen Benutzer eine Leseberechtigung erteilen möchten (keine Art von Administrator) -

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

Hinweis: Hier ist EXECUTE erforderlich, damit der Benutzer Daten lesen kann, wenn eine gespeicherte Prozedur vorhanden ist, die einen Bericht erstellt (mit wenigen select-Anweisungen).

Ersetzen Sie localhost durch eine bestimmte IP, von der aus der Benutzer eine Verbindung zur Datenbank herstellen wird.

Zusätzliche Leseberechtigungen sind:

  • ANSICHT ANZEIGEN: Wenn Sie das Ansichtsschema anzeigen möchten.
  • REPLICATION CLIENT: Wenn der Benutzer den Replikations- / Slave-Status überprüfen muss. Aber müssen Erlaubnis für alle DB geben.
  • PROZESS: Wenn der Benutzer den laufenden Prozess überprüfen muss. Funktioniert nur mit allen DBs.
Zafar Malik
quelle
0

Wenn die Ansicht nach Erteilung der Leseberechtigung nur gelesen werden soll, können Sie in Ihrer Ansicht die DDL-Definition ALGORITHM = TEMPTABLE verwenden.

Daniel Fisher
quelle
0

Hinweis für MySQL 8 ist es anders

Sie müssen dies in zwei Schritten tun:

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