MySQL umgeht die Gewährung von information_schema-Objekten und meldet den Fehler ERROR 1044 (4200)

MySQL umgeht die Gewährung von information_schema-Objekten und meldet den Fehler ERROR 1044 (4200)

Diese Frage ist eine Diskussion unter Internetnutzern in einer WeChat-Gruppe über MySQL-Berechtigungen. Es gibt eine solche Geschäftsanforderung (unten sind seine Originalworte):

Da viele Funktionen von MySQL auf Primärschlüsseln basieren, möchte ich den Zabbix-Benutzer verwenden, um alle Tabellen in der Geschäftsdatenbank zu überwachen und festzustellen, ob Primärschlüssel festgelegt wurden.

Die Monitoring-Erklärung lautet:

VON information_schema.tables t1 
    LINKER ÄUSSERER JOIN information_schema.table_constraints t2 
          EIN t1.table_schema = t2.table_schema 
            UND t1.Tabellenname = t2.Tabellenname 
            UND t2.constraint_name IN ( 'PRIMARY' ) 
Wobei t2.table_name NULL ist 
    UND t1.table_schema NICHT IN ( 'information_schema', 'myawr', 'mysql', 
                  'Leistungsschema', 
                  'langsamlog', 'sys', 'test') 
    UND t1.table_type = 'BASISTABELLE'

Ich möchte jedoch nicht, dass der Zabbix-Benutzer die Daten in der Geschäftsdatenbank lesen kann. Wenn dem Zabbix-Benutzer die Berechtigung zum Lesen der Geschäftsdatenbankdaten verweigert wird, enthalten information_schema.TABLES und information_schema.TABLE_CONSTRAINTS nicht die Tabelleninformationen der Geschäftsdatenbank und es lässt sich nicht ermitteln, ob die Geschäftsdatenbanktabelle einen Primärschlüssel besitzt. Gibt es eine Möglichkeit, Zabbix daran zu hindern, die Daten der Geschäftsdatenbank zu lesen, während überwacht wird, ob für die Tabelle der Geschäftsdatenbank kein Primärschlüssel festgelegt ist ?

Zunächst müssen wir eine Tatsache wissen: Die Ansicht unter „information_schema“ kann einem bestimmten Benutzer nicht autorisiert werden. Wie unten gezeigt

mysql> GRANT SELECT ON information_schema.TABLES TO test@'%';
FEHLER 1044 (42000): Dem Benutzer „root“@„localhost“ wurde der Zugriff auf die Datenbank „information_schema“ verweigert.

Weitere Informationen zu diesem Problem finden Sie in diesem Artikel auf mos: Warum das Festlegen von Berechtigungen für INFORMATION_SCHEMA nicht funktioniert (Dokument-ID 1941558.1)

GILT FÜR:

MySQL Server – Version 5.6 und höher

Die Informationen in diesem Dokument gelten für alle Plattformen.

ZIEL

Um zu bestimmen, wie MySQL-Berechtigungen für INFORMATION_SCHEMA funktionieren.

LÖSUNG

Eine einfache GRANT-Anweisung würde etwa so aussehen:

mysql> grant select,execute auf information_schema.* an 'dbadm'@'localhost';

FEHLER 1044 (42000): Dem Benutzer „root“@„localhost“ wurde der Zugriff auf die Datenbank „information_schema“ verweigert.

Der Fehler weist darauf hin, dass der Superuser nicht über die Berechtigung zum Ändern der Zugriffsberechtigungen für das Informationsschema verfügt.

Dies scheint im Widerspruch zu stehen zu dem, was normalerweise für das Root-Konto mit SUPER-Berechtigungen gilt.

Der Grund für diesen Fehler liegt darin, dass es sich bei der Datenbank information_schema eigentlich um eine virtuelle Datenbank handelt, die beim Starten des Dienstes erstellt wird.

Es besteht aus Tabellen und Ansichten, die dazu dienen, die Server-Metadaten, d. h. Details aller Tabellen, Prozeduren usw. im Datenbankserver, zu verfolgen.

Wenn man sich also speziell den obigen Befehl ansieht, sieht man dort einen Versuch, dieser spezialisierten Datenbank die Berechtigungen SELECT und EXECUTE hinzuzufügen.

Die Option „SELECT“ ist jedoch nicht erforderlich, da alle Benutzer die Möglichkeit haben, die Tabellen in der Datenbank „information_schema“ zu lesen. Daher ist diese Option redundant.

Die Option EXECUTE ist nicht sinnvoll, da Sie in dieser speziellen Datenbank keine Prozeduren erstellen dürfen.

Es besteht auch keine Möglichkeit, die Tabellen hinsichtlich INSERT, UPDATE, DELETE usw. zu ändern, sodass die Berechtigungen fest codiert und nicht pro Benutzer verwaltet werden.

Wie lässt sich also dieses Autorisierungsproblem lösen? Eine direkte Autorisierung funktioniert nicht, daher können wir dieses Problem nur umgehen und die Autorisierung indirekt implementieren. Die Idee ist folgende: Erstellen Sie zuerst eine gespeicherte Prozedur (Benutzerdatenbank), die die Anzahl der Tabellen ohne Primärschlüssel ermittelt, und gewähren Sie sie dann dem Testbenutzer.

TRENNUNGSZEICHEN //
CREATE DEFINER=`root`@`localhost` PROCEDURE `monitor_ohne_primärschlüssel`()
BEGINNEN
   ANZAHL AUSWÄHLEN(*) 
VON information_schema.tables t1 
    LINKER ÄUSSERER JOIN information_schema.table_constraints t2 
          EIN t1.table_schema = t2.table_schema 
            UND t1.Tabellenname = t2.Tabellenname 
            UND t2.constraint_name IN ( 'PRIMARY' ) 
Wobei t2.table_name NULL ist 
    UND t1.table_schema NICHT IN ( 'information_schema', 'myawr', 'mysql', 
                  'Leistungsschema', 
                  'langsamlog', 'sys', 'test') 
    UND t1.table_type = 'BASISTABELLE';
ENDE //
TRENNUNGSZEICHEN ;
 
 
mysql> GRANT EXECUTE ON PROCEDURE moitor_without_primarykey TO 'test'@'%';
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)

An diesem Punkt kann der Test Objekte unter information_schema indirekt abfragen.

mysql> wähle aktuellen_Benutzer();
+----------------+
| aktueller_Benutzer() |
+----------------+
| Test@% |
+----------------+
1 Zeile im Satz (0,00 Sek.)
 
mysql> rufe monitor_without_primarykey auf;
+----------+
| ANZAHL(*) |
+----------+
| 6 |
+----------+
1 Zeile im Satz (0,02 Sek.)
 
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)

Überprüfen Sie die Berechtigungen des Testbenutzers.

mysql> Berechtigungen für Test@'%' anzeigen;
+----------------------------------------------------------------------------------+
| Zuschüsse für test@% |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test`@`%` |
| GRANT EXECUTE ON PROCEDURE `zabbix`.`moitor_without_primarykey` TO `test`@`%` |
+----------------------------------------------------------------------------------+
2 Zeilen im Satz (0,00 Sek.)

Dies ist das Ende dieses Artikels über MySQL, das die Objektzuweisung im Informationsschema umgeht und FEHLER 1044 (4200) meldet. Weitere relevante Inhalte zu MySQL FEHLER 1044 (4200) finden Sie in den vorherigen Artikeln von 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:
  • Können Information_Schema und MySQL in der MySQL-Datenbank gelöscht werden?
  • Analysieren der information_schema-Datenbank von MySQL
  • Detaillierte Erklärung der MySQL information_schema-Datenbank

<<:  Docker-Verbindung – MongoDB-Implementierungsprozess und Codebeispiele

>>:  Beispielanalyse der Verwendung von Dockerfile-Textdateien

Artikel empfehlen

Detaillierte Erklärung zur korrekten Verwendung der Zählfunktion in MySQL

1. Beschreibung Wenn wir in MySQL die Gesamtzahl ...

Detaillierte Erklärung der Rolle von Klammern in AngularJS

1. Die Rolle der Klammern 1.1 Eckige Klammern [ ]...

jQuery implementiert Warenkorbfunktion

In diesem Artikelbeispiel wird der spezifische Co...

So konfigurieren Sie Benutzerrollenberechtigungen in Jenkins

Die Jenkins-Konfiguration von Benutzerrollenberec...

Detaillierte Erklärung zum Schreiben von MySQL ungleich null und gleich null

1. Tabellenstruktur 2. Tabellendaten 3. Das Abfra...

Node erstellt schnell die Backend-Implementierungsschritte

1. Installieren Sie zuerst Node, Express und Expr...

WeChat-Applet implementiert Puzzlespiel

In diesem Artikel finden Sie den spezifischen Cod...

Hinweise zum passenden MySql 8.0 und entsprechenden Treiberpaketen

MySql 8.0 entsprechendes Treiberpaket passend Nac...

Bootstrap realisiert den Karusselleffekt

In diesem Artikel wird der spezifische Code von B...

Verwendung des Docker-Systembefehlssatzes

Inhaltsverzeichnis Docker-System df Docker-System...

Tiefgreifendes Verständnis der Verwendung von CSS clear:both

clear:both wird zum清除浮動Das ist der Eindruck, den ...

Wie melde ich mich per Remote-Zugriff bei der MySql-Datenbank an?

Einführung: Manchmal müssen wir zur Entwicklung e...

js, um einen 3D-Karusselleffekt zu erzielen

In diesem Artikel wird der spezifische Code zur I...