Problem mit Berechtigungen zum Ändern gespeicherter Prozeduren in MySQL

Problem mit Berechtigungen zum Ändern gespeicherter Prozeduren in MySQL

Bei der Verwendung einer MySQL-Datenbank treten häufig folgende Probleme auf: Die von anderen Benutzern definierte gespeicherte Prozedur kann von anderen Benutzern nicht geändert oder gelöscht werden. Normalerweise hat der Definierer der gespeicherten Prozedur die Berechtigung, diese zu ändern und zu löschen, andere Benutzer müssen jedoch über die entsprechende Berechtigung verfügen, da sie sie sonst nicht anzeigen oder aufrufen können.

In MySQL erstellt Benutzer A eine gespeicherte Prozedur. Nun möchte ein anderer Benutzer B die von A erstellte gespeicherte Prozedur ändern. Basierend auf dieser Situation werden die folgenden Datensätze generiert.

Berechtigungen des Benutzers A für die OTO3-Bibliothek:

mysql> Berechtigungen für 'a'@'%' anzeigen;
+---------------------------------------------------+
| Zuschüsse für a@% |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO 'a'@'%' |
| GEWÄHREN SIE 'a'@'%' ALLE PRIVILEGIEN FÜR `OTO3`.* |
+---------------------------------------------------+
2 Zeilen im Satz (0,00 Sek.)

Berechtigungen von Benutzer B:

mysql> Berechtigungen für „swper“@„%“ anzeigen;
+----------------------------------------------------------------------+
| Zuschüsse für swper@% |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* AN 'swper'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER ON `OTO3`.* TO 'swper'@'%' |
+----------------------------------------------------------------------+
2 Zeilen im Satz (0,00 Sek.)

Melden Sie sich bei MySQL als Benutzer B an;

[root@mysql ~]# mysql -h10.0.10.110 -uswper -p123456

Beim Überprüfen der Liste der gespeicherten Prozeduren wird angezeigt, dass keine Berechtigung vorliegt:

mysql> wähle „Name“ aus mysql.proc, wobei db = „OTO3“ und „Typ“ = „PROZEDUR“;
FEHLER 1142 (42000): SELECT-Befehl für Benutzer „swper“@„mysql“ für Tabelle „proc“ verweigert

Fügen Sie als Root dem Benutzer B die Berechtigung zum Anzeigen gespeicherter Prozeduren hinzu:

mysql> gewähre 'swper'@'%' Auswahl auf mysql.proc;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
 
mysql> Berechtigungen für „swper“@„%“ anzeigen;
+----------------------------------------------------------------------+
| Zuschüsse für swper@% |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* AN 'swper'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER ON `OTO3`.* TO 'swper'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'swper'@'%' |
+----------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Gehen Sie zurück zu Benutzer B, um die Liste der gespeicherten Prozeduren anzuzeigen:

mysql> wähle „Name“ aus mysql.proc, wobei db = „OTO3“ und „Typ“ = „PROZEDUR“;
+------------------------+
| Name |
+------------------------+
| Debuggen |
+------------------------+
1 Zeile im Satz (0,00 Sek.)

Zu diesem Zeitpunkt wird eine zusätzliche MySQL-Datenbank gefunden, aber es sind nur Abfrageberechtigungen für mysql.proc verfügbar:

mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|OTO3|
|mysql |
+--------------------+
3 Zeilen im Satz (0,00 Sek.)

Es gibt nur eine Tabelle in der MySQL-Bibliothek: proc

mysql> mysql verwenden
mysql> Tabellen anzeigen;
+-----------------+
| Tabellen_in_mysql |
+-----------------+
|proc|
+-----------------+
1 Zeile im Satz (0,00 Sek.)

Sie können auch die Details der gespeicherten Prozedur sehen:

mysql> zeige Prozedur zum Erstellen von proc_cs\G
*************************** 1. Reihe ***************************
      Prozedur: proc_cs
      SQL-Modus: STRICT_TRANS_TABLES, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION
  Prozedur erstellen: CREATE DEFINER=`a`@`%` PROCEDURE `proc_cs`()
BEGINNEN

Versuchen Sie, die Konfiguration der gespeicherten Prozedur zu ändern:

mysql> ALTER PROCEDURE proc_cs ändert SQL-Daten SQL SECURITY INVOKER;
FEHLER 1370 (42000): Befehl zum Ändern der Routine für Routine „OTO3.proc_cs“ dem Benutzer „b“@„%“ verweigert

Um die Anzeige zu erleichtern, versuchen Sie, die gespeicherte Prozedur im Navicat-Tool zu ändern, und melden Sie beim Speichern das folgende Berechtigungsproblem:

1227 - Zugriff verweigert; Sie benötigen (mindestens eines) der SUPER-Privilegien für diesen Vorgang

Versuchen Sie, eine gespeicherte Prozedur hinzuzufügen und Berechtigungsinformationen zu melden:

1044 - Der Zugriff auf die Datenbank „OTO3“ wurde dem Benutzer „b“@„%“ verweigert.

Dies bedeutet, dass Benutzer B nicht die Berechtigung hat, die autorisierte gespeicherte Prozedur von OTO3 zu ändern.

Versuchen Sie, die folgende gespeicherte Prozedur als Benutzer B aufzurufen:

Die Ausführung der Prozedur ist fehlgeschlagen
1370 - Ausführung des Befehls für Benutzer „b“@„%“ für Routine „OTO3.proc_cs“ verweigert

Es liegt offensichtlich keine Lauferlaubnis vor.

Versuchen Sie, die ursprüngliche benutzerdefinierte gespeicherte Prozedur a zu löschen. Die Berechtigungsinformationen werden ebenfalls wie folgt gemeldet:

1370 - Befehl zur Routineänderung für Benutzer „b“@„%“ für Routine „OTO3.proc_cs“ verweigert

Man sieht, dass Benutzer B gar nicht die Berechtigung hat, die gespeicherte Prozedur aufzurufen. Hier fügen wir zunächst die Ausführungsberechtigung hinzu:

Fügen Sie als Nächstes eine Berechtigung zum Ausführen der gespeicherten Prozedur hinzu:

mysql> gewähre Ausführung auf OTO3.* für 'b'@'%';
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
 
mysql> Berechtigungen für 'b'@'%' anzeigen;
+----------------------------------------------------------------------------------+
| Zuschüsse für b@% |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'b'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE ON `OTO3`.* TO 'b'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |
+----------------------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Führen Sie die gespeicherte Prozedur erneut aus und stellen Sie sicher, dass sie erfolgreich ist.

Zeit: 0,080 ms
Vorgang erfolgreich ausgeführt
Betroffene Zeilen: 0

Fügen Sie dann die Berechtigung zum Erstellen und Hinzufügen gespeicherter Prozeduren hinzu:

mysql> gewähre 'b'@'%' CREATE ROUTINE auf OTO3.*;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> Berechtigungen für 'b'@'%' anzeigen;
+-----------------------------------------------------------------------------------------------+
| Zuschüsse für b@% |
+-----------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'b'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE ON `OTO3`.* TO 'b'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |
+-----------------------------------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Nachdem Sie die oben genannten Berechtigungen hinzugefügt haben, können Sie eine gespeicherte Prozedur erstellen.

CREATE DEFINER=`b`@`%` PROZEDURE `aaaa`()
BEGINNEN
  #Routinekörper kommt hier hin...
SELECT * von mysql.user;
ENDE

Die von Ihnen erstellten können Sie jedoch nicht löschen.

1370 - Befehl zur Routineänderung für Benutzer „b“@„%“ für Routine „OTO3.aaaa“ verweigert

Fügen Sie als nächstes eine Änderungsberechtigung hinzu, die auch gelöscht werden kann;

mysql> Berechtigung zum Ändern von ROUTINE auf OTO3.* für 'b'@'%';
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

Benutzerberechtigungen anzeigen

mysql> Berechtigungen für 'b'@'%' anzeigen;
+-----------------------------------------------------------------------------------------------------------+
| Zuschüsse für b@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'b'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE AUF `OTO3`.* TO 'b'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |
+-----------------------------------------------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Nachdem Sie die oben genannte Berechtigung „ROUTINE ändern“ hinzugefügt haben, verfügen Sie über die Löschberechtigung für alle gespeicherten Prozeduren von OTO3 [Ihre eigenen definierten Prozeduren hinzufügen, löschen und ändern]. Sie können die von anderen definierten gespeicherten Prozeduren löschen, aber nicht ändern. Beim Ändern der von anderen definierten gespeicherten Prozeduren wird die folgende Eingabeaufforderung angezeigt:

1227 - Zugriff verweigert; Sie benötigen (mindestens eines) der SUPER-Privilegien für diesen Vorgang

Können Sie hier erklären, wo diese SUPER-Berechtigung ist? Durch die Überprüfung der Benutzerberechtigungen stellt sich heraus, dass hier:

mysql> wähle * aus mysql.user, wobei Benutzer='b'\G
*************************** 1. Reihe ***************************
         Gastgeber: %
         Benutzer: b
      Select_priv: N
      Insert_priv: N
      Update_priv: N
      Löschpriv: N
      Create_priv: N
       Drop_priv: N
      Reload_priv: N
     Shutdown_priv: N
     Prozesspriv: N
       File_priv: N
      Grant_priv: N
    Referenzen_priv: N
      Index_priv: N
      Alter_priv: N
     Show_db_priv: N
      Super_priv: N
 Create_tmp_table_priv: N
   Lock_tables_priv: N
     Execute_priv: N
    Repl_slave_priv: N
   Repl_client_priv: N
   Create_view_priv: N
    Show_view_priv: N
  Create_routine_priv: N
  Alter_routine_priv: N
   Create_user_priv: N
      Event_priv: N
     Trigger_priv: N
Create_tablespace_priv: N
       SSL-Typ:
      ssl_chiffre:
      x509_issuer:
     x509_Betreff:
     max_fragen: 0
      max_updates: 0
    max_Verbindungen: 0
 Max_Benutzerverbindungen: 0
        plugin:mysql_native_password
 Authentifizierungszeichenfolge: *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175
   password_expired: N
 Passwort zuletzt geändert: 06.03.2017 11:37:35
   password_lifetime: NULL
    Konto gesperrt: Nein
1 Zeile im Satz (0,00 Sek.)

Versuchen Sie, die SUPER-Berechtigung hinzuzufügen:

mysql> gewähre SUPER auf OTO3.* an 'b'@'%';
FEHLER 1221 (HY000): Falsche Verwendung von DB GRANT und GLOBAL PRIVILEGES
 
mysql> gewähre 'b'@'%' SUPER auf *.*;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Diese Berechtigung kann für die angegebene Datenbank nicht ausgeführt werden, da SUPER eine globale Berechtigung für das gesamte MySQL ist.

mysql> Berechtigungen für „swper“@„%“ anzeigen;
+-----------------------------------------------------------------------------------------------------------+
| Zuschüsse für swper@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT SUPER ON *.* TO 'swper'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'swper'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'swper'@'%' |
+-----------------------------------------------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Wenn Sie es noch einmal überprüfen, werden Sie feststellen, dass sich Super_priv: Y geändert hat. Ändern Sie dann die von anderen definierte gespeicherte Prozedur.

mysql> wähle * aus mysql.user, wobei Benutzer='b'\G

Beim Überprüfen aller Datenbanken stellte ich fest, dass nur eine Proc-Tabelle in der MySQL-Datenbank Leseberechtigung hatte. SUPER war nicht so leistungsfähig, wie ich dachte.

mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|OTO3|
|mysql |
+--------------------+
3 Zeilen im Satz (0,00 Sek.)

Wenn Sie genau hinschauen, werden Sie die Ausführungsanweisung finden:

mysql> wähle * aus mysql.user, wobei Benutzer='b'\G

Wir können sehen, dass Create_routine_priv: N und Alter_routine_priv: N vorhanden sind. Diese beiden Berechtigungen sind offensichtlich Berechtigungen für gespeicherte Prozeduren. Können wir diese beiden Berechtigungen ohne SUPER verwenden?

Fordern Sie diese SUPER-Berechtigung zurück;

mysql> Super auf *.* von 'b'@'%' widerrufen;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

Alter_routine_priv, Create_routine_priv hinzufügen

mysql> Berechtigung zum Ändern der Routine, Erstellen einer Routine auf *.* für 'b'@'%';
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Berechtigungen von Benutzer B anzeigen

mysql> Berechtigungen für 'b'@'%' anzeigen;
+-----------------------------------------------------------------------------------------------------------+
| Zuschüsse für b@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT CREATE ROUTINE, ALTER ROUTINE ON *.* TO 'b'@'%' |
| GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE AUF `OTO3`.* TO 'b'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |
+-----------------------------------------------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Es wurde festgestellt, dass immer noch dasselbe Berechtigungsproblem gemeldet wird:

1227 - Zugriff verweigert; Sie benötigen (mindestens eines) der SUPER-Privilegien für diesen Vorgang

Nachdem Sie die oben genannten Berechtigungen ausgeführt haben, können Sie andere Systembibliotheken sehen: [Beispielsweise verfügt die Sys-Bibliothek auch über gespeicherte Prozeduren, da diese beiden Berechtigungen global sind]

mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|OTO3|
|mysql |
| Leistungsschema |
|System|
| Prüfung |
+--------------------+
6 Zeilen im Satz (0,00 Sek.)

Diese beiden Berechtigungen sind mächtiger. Sie können sogar gespeicherte Prozeduren in der Systembibliothek sys sehen, ändern und löschen, was sehr gefährlich ist. Wir haben uns entschieden, die Berechtigungen wieder zu widerrufen.

Routine schaffen, Routine ändern;
mysql> widerrufe Erstellungsroutine, ändere Routine auf *.* von 'b'@'%';

Es ist sicherer, das SUPER-Privileg zu verwenden.

Aus den oben genannten Tests wurden folgende Schlussfolgerungen gezogen:

  • Berechtigungen für gespeicherte Prozeduren anzeigen: SELECT # ist die Berechtigung für die Tabelle mysql.proc;
  • Berechtigung zum Ausführen gespeicherter Prozeduren: EXECUTE # ist die Berechtigung für die angegebene Datenbank;
  • Berechtigung zum Erstellen gespeicherter Prozeduren: CREATE ROUTINE # ist die Berechtigung für die angegebene Datenbank;
  • Ändern Sie die Berechtigungen für gespeicherte Prozeduren: ALTER ROUTINE # dient zum Definieren der gespeicherten Prozedur in der angegebenen Datenbank.
  • Ändern Sie die von anderen definierten Berechtigungen für gespeicherte Prozeduren: SUPER # ist die globale Berechtigung für das gesamte MySQL;

Kurz gesagt definiert Benutzer A eine gespeicherte Prozedur in der Datenbank OTO3. Nun möchte er Benutzer B verwenden, um die gespeicherte Prozedur auszuführen und zu ändern. Er muss Benutzer B die folgenden Berechtigungen hinzufügen:

GRANT SELECT AUF MYSQL.PROC AUF „B“;
GRANT EXECUTE, CREATE ROUTINE, ALTER ROUTINE AUF `OTO3`.* AUF 'B';
GRANT SUPER AUF *.* AUF ‚B‘;

Die grundlegendsten Berechtigungen für Benutzer B sind also:

mysql> Berechtigungen für 'b'@'%' anzeigen;
+----------------------------------------------------------------------------------------+
| Zuschüsse für b@% |
+----------------------------------------------------------------------------------------+
| GRANT SUPER ON *.* TO 'b'@'%' |
| GRANT SELECT, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'b'@'%' |
| GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' |
+----------------------------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

An diesem Punkt ist es sehr klar, dass ein anderer Benutzer das Recht hat, die von anderen in MySQL definierten gespeicherten Prozeduren zu ändern.

Wenn die gespeicherte Prozedur nicht als ein anderer Benutzer aufgerufen wird, können Sie Root-Berechtigungen verwenden, um den Definierer der gespeicherten Prozedur zu ändern. Dies entspricht dem Ändern der Berechtigungen des Eigentümers in Linux.

Aktualisiere mysql.proc, setze DEFINER='b'@'%', wobei NAME='proc_cs' und db='OTO3';

Dies ist das Ende dieses Artikels über das Problem der Berechtigungen im Zusammenhang mit geänderten MySQL-gespeicherten Prozeduren. Weitere relevante Inhalte zu Berechtigungen für gespeicherte MySQL-Prozeduren finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Eine kurze Erläuterung der MySQL-Benutzerberechtigungstabelle
  • Implementierung der MySQL-Benutzerrechteverwaltung
  • Detaillierte Erläuterung der MySQL-Benutzerrechteverwaltung
  • Detailanalyse der MySQL-Berechtigungskontrolle
  • Detaillierte Erklärung der MySQL-Berechtigungssteuerung
  • Detailliertes Tutorial zum Erstellen eines Benutzers in MySQL und zum Erteilen von Benutzerberechtigungen
  • So legen Sie Remotezugriffsberechtigungen in MySQL 8.0 fest
  • Fallstudie zu MySQL-Berechtigungen und Datenbankdesign

<<:  Zusammenfassung der Funktionsweise von JS auf Seiten innerhalb und außerhalb von Iframes

>>:  Teilen Sie 6 Einladungscodes zur unbegrenzten Aktivierung von Alibaba Cloud Disk. Wenn Sie mir nicht glauben, können Sie Alibaba Cloud Disk aktivieren.

Artikel empfehlen

So implementieren Sie eine bidirektionale MySQL-Sicherung

Die bidirektionale MySQL-Sicherung wird auch als ...

mysql5.7.18 dekomprimierte Version zum Starten des MySQL-Dienstes

Die dekomprimierte Version von mysql5.7.18 starte...

Sehr detaillierte JavaScript-Implementierung eines Webseiten-Karussells

Inhaltsverzeichnis Erstellen von HTML-Seiten Impl...

Lösungen für Websites mit hohem Datenverkehr

Erstens: Stellen Sie zunächst sicher, dass die Ser...

JavaScript fügt Prototyp-Methodenimplementierung für integrierte Objekte hinzu

Die Reihenfolge, in der Objekte Methoden aufrufen...

Eine kurze Einführung in die Gesamtstruktur von Tomcat

Tomcat ist weithin als Webcontainer bekannt. Es h...

Zwei Möglichkeiten zur Verwendung von React in React HTML

Grundlegende Verwendung <!DOCTYPE html> <...

Detaillierte Schritte zur Yum-Konfiguration des Nginx-Reverse-Proxys

Teil.0 Hintergrund Die Intranetserver des Unterne...

20 CSS-Codierungstipps für mehr Effizienz (sortiert)

In diesem Artikel möchten wir eine Sammlung von 2...

Lösung für das Problem „VMware-virtuelle Maschine ohne Netzwerk“

Inhaltsverzeichnis 1. Problembeschreibung 2. Prob...

Samba-Serverkonfiguration unter Centos7 (tatsächlicher Kampf)

Samba Übersicht Samba ist eine kostenlose Softwar...

Detaillierte Erklärung der MySQL-Zeichenfolgenverkettungsfunktion GROUP_CONCAT

Im vorherigen Artikel habe ich ein tabellenübergr...