Detailanalyse der MySQL-Berechtigungskontrolle

Detailanalyse der MySQL-Berechtigungskontrolle

Heute ist Sonntag. Ich war morgens eine Weile faul und bin etwas spät aufgestanden. Da ich mittags nichts zu tun hatte, habe ich mir das Berechtigungskontrollmodul in MySQL noch einmal angesehen. Wenn ich zurückblicke, gibt es noch viele Details, die ich sehr mitgenommen habe. Ich werde sie hier für Ihre spätere Überprüfung aufzeichnen.
Was den Inhalt von Berechtigungen betrifft, haben wir einige davon im vorherigen Artikel vom 11. März geschrieben. Heute werden wir anhand detaillierter Wissenspunkte nacheinander darüber schreiben (in diesem Artikel wird die MySQL-Version 5.7.16 verwendet). Bevor wir diese Wissenspunkte schreiben, stellen wir zunächst die Granularität der MySQL-Berechtigungskontrolle vor und verstehen dann die vom Server ausgeführte Überprüfungsarbeit, wenn der Client eine Anforderung in MySQL initiiert. Schauen wir uns zunächst die Granularität der Berechtigungskontrolle an:

1. Globale Ebene

Globale Berechtigungen gelten für alle Datenbanken auf einem bestimmten Server. Diese Berechtigungen werden in der Tabelle mysql.user gespeichert und mit den Methoden grant all on *.* und revoke all on *.* erteilt oder entzogen.

2. Datenbankebene

Datenbankberechtigungen gelten für alle Objekte in einer bestimmten Datenbank, einschließlich Tabellenobjekten und gespeicherten Prozeduren. Diese Berechtigungen werden in der Tabelle mysql.db gespeichert. Datenbankberechtigungen können mit grant all on db_name.* oder der entsprechenden Methode revoke erteilt und widerrufen werden.

3. Oberflächenniveau

Tabellenberechtigungen gelten für alle Spalten einer bestimmten Tabelle. Diese Berechtigungen werden in der MySQL-Tabelle tables_priv gespeichert. Berechtigungen werden im Allgemeinen mit grant all auf db_name.tbl_name und der entsprechenden revoke-Anweisung erteilt oder entzogen.

4. Berechtigungen auf Spaltenebene

Berechtigungen auf Spaltenebene gelten für bestimmte Spalten in einer bestimmten Tabelle. Diese Berechtigungen werden in der Tabelle mysql.columns_priv gespeichert. Da diese Berechtigung nicht häufig verwendet wird, folgt hier ein Beispiel, wie sie erteilt wird:

Zuerst erstellen wir einen Benutzer mit ausgewählten Berechtigungen für die Tabelle yeyztest.test1:

mysql:mysql 19:35:38>>Berechtigungen für dba_yeyz@'192.168.18.%' anzeigen;
+-------------------------------------------------------------------+
| Zuschüsse für [email protected].% |
+-------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dba_yeyz'@'192.168.18.%' |
| GRANT SELECT ON `yeyztest`.`test1` TO 'dba_yeyz'@'192.168.18.%' |
+-------------------------------------------------------------------+
2 Zeilen im Satz (0,00 Sek.)

Dann aktualisieren wir eine Feld-ID in Test1 und das Ergebnis ist wie folgt:

mysql> wähle * aus test1;
+-----------------+
|Ich würde|
+-----------------+
| 22 |
| 3333333333333 |
+-----------------+
2 Zeilen im Satz (0,00 Sek.)

mysql> Update Test1 setze ID=2, wobei ID=22;
FEHLER 1142 (42000): UPDATE-Befehl für Benutzer 'dba_yeyz'@'192.168.18.**' für Tabelle 'test1' verweigert

Natürlich können wir es nicht aktualisieren. Zu diesem Zeitpunkt verwenden wir das Root-Konto, um dem dba_yeyz-Konto eine Berechtigung für die ID-Spalte zu erteilen, und sehen uns dann die Ergebnisse an:

mysql:mysql 19:38:38>>Berechtigungen für dba_yeyz@'192.168.18.%' anzeigen;
+-------------------------------------------------------------------+
| Zuschüsse für [email protected].% |
+-------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dba_yeyz'@'192.168.18.%' |
| GRANT SELECT ON `yeyztest`.`test1` TO 'dba_yeyz'@'192.168.18.%' |
| GRANT SELECT, UPDATE (id) ON `yeyztest`.`test1` TO 'dba_yeyz'@'192.168.18.%' |
+-------------------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

Hier müssen wir auf die Anweisung achten, die dem Feld Berechtigungen hinzufügt, und zwar:

Gewähren Sie ein Update (ID) für yeyztest.test1 an XXXXXX

Das heißt, nach der Berechtigung folgt der Name des Feldes.

Zu diesem Zeitpunkt fragen wir die columns_priv-Tabelle ab und sehen, dass die Datensätze lauten:

mysql:mysql 19:39:46>>Wählen Sie * aus Spaltenpriv;
+--------------+----------+----------+-------------+-------------+-------------+---------------------+-------------+
| Host | Db | Benutzer | Tabellenname | Spaltenname | Zeitstempel | Spaltenpriv |
+--------------+----------+----------+-------------+-------------+-------------+---------------------+-------------+
| 192.168.18.% | yeyztest | dba_yeyz | test1 | ID | 0000-00-00 00:00:00 | Aktualisieren |
+--------------+----------+----------+-------------+-------------+-------------+---------------------+-------------+
1 Zeile im Satz (0,00 Sek.)

Führen Sie den Aktualisierungsvorgang mit dba_yeyz erneut aus. Das Ergebnis können Sie sich ansehen:

mysql> Update Test1 setze ID=2, wobei ID=22;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

mysql> wähle * aus test1;
+-----------------+
|Ich würde|
+-----------------+
| 2 |
| 3333333333333 |
+-----------------+
2 Zeilen im Satz (0,00 Sek.)

Die Spalte mit der ID=22 wurde erfolgreich in die ID=2 geändert.

5. Unterprogrammebene

Die Berechtigungen „Routine erstellen“, „Routine ändern“, „Ausführen“ und „Erteilen“ gelten für gespeicherte Routinen. Diese Berechtigungen können auf globaler Ebene und auf Datenbankebene erteilt und in mysql.procs_priv gespeichert werden.

Wenn der Client eine Anfrage initiiert, sieht das Flussdiagramm der Überprüfung der Anfrage durch den MySQL-Server wie folgt aus:

Ich werde nacheinander einige der Einzelheiten auflisten, die ich heute gesehen habe, und hoffe, dass sie für alle hilfreich sind:

1. In MySQL Version 5.7.16 gibt es in der MySQL-Systembibliothek keine Host-Tabelle. Es gibt nur fünf Tabellen zur Berechtigungssteuerung, nämlich user, db, table_priv, proc_priv und column_priv.

2. Der Primärschlüssel der mysql.user-Tabelle besteht aus Benutzer und Host. Schauen wir uns die Tabellenstruktur an:

[email protected]:mysql 19:44:56>>zeigen, erstellen Sie die Tabelle mysql.user\G
*************************** 1. Reihe ***************************
    Tabelle: Benutzer
Tabelle erstellen: CREATE TABLE `user` (
 `Host` char(60) COLLATE utf8_bin NICHT NULL DEFAULT '',
 `Benutzer` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
---------------Autorisierungsfelder (29)--------------
 `Select_priv` enum('N','Y') ZEICHENSATZ utf8 NICHT NULL STANDARD 'N',
 ......Hier weggelassen---------------Sicherheitsfelder (4)---------------
 `ssl_type` enum('','BELIEBIG','X509','ANGEGEBEN') ZEICHENSATZ utf8 NICHT NULL STANDARD '',
 `ssl_cipher`-Blob NICHT NULL,
 `x509_issuer` Blob NICHT NULL,
 `x509_subject`-Blob NICHT NULL,
---------------Ressourcenkontrollfelder (4)--------------
 `max_questions` int(11) unsigned NOT NULL DEFAULT '0',
 `max_updates` int(11) unsigned NOT NULL DEFAULT '0',
 `max_connections` int(11) unsigned NOT NULL DEFAULT '0',
 `max_user_connections` int(11) unsigned NICHT NULL STANDARD '0',
--------------Plugin-Feld (1 Element)---------------
 `plugin` char(64) COLLATE utf8_bin NOT NULL DEFAULT 'mysql_native_password',
--------------Passwortfelder (5)--------------
 `authentication_string` Text COLLATE utf8_bin,
 `password_expired` enum('N','Y') ZEICHENSATZ utf8 NICHT NULL STANDARD 'N',
 `password_last_changed` Zeitstempel NULL DEFAULT NULL,
 `password_lifetime` smallint(5) unsigned DEFAULT NULL,
 `account_locked` enum('N','Y') ZEICHENSATZ utf8 NICHT NULL STANDARD 'N',
 PRIMÄRSCHLÜSSEL (`Host`,`Benutzer`) -------------Gemeinsamer Primärschlüssel, Host zuerst-----------
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Benutzer und globale Berechtigungen'
1 Zeile im Satz (0,00 Sek.)

3. Die Tabelle tables_priv verfügt nur über die folgenden Berechtigungen, d. h. Berechtigungen für die Tabelle:

auswählen, einfügen, aktualisieren, löschen, löschen, erstellen, ändern, gewähren, referenzieren, indizieren, Ansicht erstellen, Ansicht anzeigen, auslösen;

Die Berechtigungen in der columns_priv-Tabelle sind nur die folgenden vier: select, insert, update, references

4. Es gibt grundsätzlich mehrere Möglichkeiten, das Passwort eines Benutzers zu ändern:

Passwort für Benutzer@Host festlegen = Passwort('neuesPasswort');
Aktualisieren Sie mysql.user und legen Sie authentication_string=password('pwd') fest, wobei user='Benutzername' und host='Hostname' ist.
Benutzer user@host ändern, identifiziert durch „newpassword“;
mysqladmin -u Benutzername -h Hostname -p Passwort "Neues Passwort";

Am besten verwenden Sie die Methode „Benutzer ändern“. Tatsächlich ist die Methode „Passwort festlegen“ in der neuen Version 8.0 nicht mehr verfügbar. Daher wird empfohlen, die Methode „Benutzer ändern“ zum Festlegen eines neuen Passworts zu verwenden.

Darüber hinaus gibt es noch eine andere Methode, die nicht häufig verwendet wird. Dabei wird die Grant-Methode verwendet, um das vorherige Passwort zu überschreiben. Hier experimentieren wir einfach und sehen uns den Effekt an:

mysql:mysql 20:01:05>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' identifiziert durch '111111';
Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,00 Sek.)
mysql:mysql 20:01:29>>Benutzer, Host, concat(Benutzer,'@','\'', Host,'\''), Authentifizierungszeichenfolge aus mysql.user auswählen;
+------------------+----------------+----------------------------------+-------------------------------------------+
| Benutzer | Host | concat(Benutzer,'@','\'',Host,'\'') | Authentifizierungszeichenfolge |
+------------------+----------------+----------------------------------+-------------------------------------------+
| dba_yeyz | 192.168.18.% | dba_yeyz@'192.168.18.%' | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
+------------------+----------------+----------------------------------+-------------------------------------------+
11 Zeilen im Satz (0,00 Sek.)

mysql:mysql 20:01:31>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' identifiziert durch '123456';
Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,00 Sek.)

mysql:mysql 20:01:57>>Benutzer, Host, concat(Benutzer,'@','\'', Host,'\''), Authentifizierungszeichenfolge aus mysql.user auswählen;
+------------------+----------------+----------------------------------+-------------------------------------------+
| Benutzer | Host | concat(Benutzer,'@','\'',Host,'\'') | Authentifizierungszeichenfolge |
+------------------+----------------+----------------------------------+-------------------------------------------+
| dba_yeyz | 192.168.18.% | dba_yeyz@'192.168.18.%' | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+----------------+----------------------------------+-------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Wie aus dem obigen Test ersichtlich ist, wird das vorherige Passwort überschrieben, wenn wir die Grant-Methode verwenden, um das Passwort für einen bestimmten Benutzer zurückzusetzen. Daher sollte dieser Vorgang online mit Vorsicht verwendet werden. Überprüfen Sie bei jedem Grant, ob ein vorhandenes Konto vorhanden ist, und bestätigen Sie dann, dass kein vorhandenes Konto vorhanden ist, den Grant.

5. Wenn wir versehentlich das Root-Passwort von MySQL vergessen, können wir den MySQL-Dienst neu starten und den Parameter --skip-grant-tables hinzufügen, um den MySQL-Dienst zu starten. Dadurch wird die Abgleicharbeit in der Berechtigungstabelle direkt vermieden und Sie können sich direkt beim MySQL-Dienst anmelden, um das Passwort des Root-Kontos zu ändern.

6. Wenn Sie „Update“ oder „Insert“ verwenden, um ein Konto zu erstellen oder das Kennwort in der Tabelle mysql.user zu ändern, müssen Sie nach der Ausführung der Anweisung den Vorgang „Flush Privileges“ verwenden, um die Berechtigungstabelle zu aktualisieren, da der Vorgang sonst nicht wirksam wird.

7. Es gibt mehrere Berechtigungen, die die Ausführung des mysqladmin-Tools beeinflussen, nämlich

Neuladeberechtigung: wirkt sich auf den Spülvorgang aus

Shutdown-Berechtigung: betrifft Shutdown-Vorgänge

Prozessberechtigungen: wirken sich auf Prozesslistenvorgänge aus

Super-Berechtigung: betrifft den Kill-Vorgang

8. Die zuvor erwähnten Ressourcensteuerungsfelder in der Tabelle mysql.user sind

max_questions: die maximale Anzahl von Anfragen pro Stunde, max_updates: die maximale Anzahl von Aktualisierungen pro Stunde, max_connections: die maximale Anzahl von Verbindungen pro Stunde und max_user_connections: die maximale Anzahl von Verbindungen, die ein einzelner Benutzer gleichzeitig herstellen kann.

Wenn wir diesen Parameter für einen Benutzer festlegen möchten, können wir dazu das folgende SQL verwenden:

mysql:mysql 20:01:58>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' mit max_queries_per_hour 1000;
Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,00 Sek.)

mysql:mysql 20:13:13>>Wählen Sie Benutzer, Host, max_questions aus mysql.user aus, wobei Benutzer = "dba_yeyz";  
+----------+--------------+------------------+
| Benutzer | Gastgeber | max_questions |
+----------+--------------+------------------+
| dba_yeyz | 192.168.18.% | 1000 |
+----------+--------------+------------------+
1 Zeile im Satz (0,00 Sek.)

Beachten Sie, dass die Option with hier in der Grant-Anweisung verwendet wird. Es gibt fünf Optionen, denen with folgen kann, nämlich:

Gewährungsoption: Der autorisierte Benutzer kann diese Berechtigungen anderen Benutzern erteilen

max_queries_per_hour count: Anzahl der Abfragen, die jede Stunde ausgeführt werden können;

max_updates_per_hour count: Anzahl der Aktualisierungen, die stündlich durchgeführt werden können;

max_connections_per_hour count: Anzahl der Verbindungen, die pro Stunde hergestellt werden können;

max_user_connections count: Legt die Anzahl der Verbindungen fest, die ein einzelner Benutzer gleichzeitig herstellen kann

9. Globale Variablen festlegen:

SETZEN SIE GLOBAL Standard-Passwortlebensdauer = 180;

SETZEN SIE GLOBAL Standard-Passwortlebensdauer = 0;

Der Passwortlebenszyklus kann auf 6 Monate eingestellt werden, danach verliert das Passwort seine Gültigkeit. Wenn der Wert auf 0 gesetzt wird, bleibt das Passwort für immer gültig.

Natürlich können Sie den Passwort-Änderungszyklus auch direkt beim Anlegen eines Benutzers festlegen bzw. deaktivieren:

BENUTZER 'jeffrey'@'localhost' ERSTELLEN. PASSWORT, ABLAUFINTERVALL 90 TAGE;
ALTER USER 'jeffrey'@'localhost' PASSWORT ABLAUFINTERVALL 90 TAGE;

BENUTZER 'jeffrey'@'localhost' ERSTELLEN, PASSWORT LÄUFT NIE AB;
ALTER USER 'jeffrey'@'localhost' PASSWORT LÄUFT NIE AB;

10. Manchmal scheint es, als hätten wir das Kontokennwort gelöscht, können aber trotzdem mit dem Kontokennwort darauf zugreifen. Zu diesem Zeitpunkt müssen wir eine Einstellung überprüfen, um festzustellen, ob die Benutzertabelle leere Datensätze enthält:

Wählen Sie Benutzer, Host aus mysql.user, wobei Benutzer='';

Sehr wahrscheinlich haben Sie den Benutzerdatensatz leer gelassen, sodass sich alle Benutzer direkt anmelden können. Wenn dies der Fall ist, sollten Sie es am besten direkt entfernen, da es den Sicherheitszweck verletzt.

Oben finden Sie eine detaillierte Analyse der MySQL-Berechtigungssteuerung. Weitere Informationen zur MySQL-Berechtigungssteuerung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

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

<<:  Analyse des Ausschnitts des Hintergrundbildes des Neunerrasters mit adaptiver Breite und Höhe

>>:  Die am häufigsten verwendeten HTML-Tags zum Erstellen von Webseiten

Artikel empfehlen

Der Unterschied zwischen char und varchar in MySQL

CHAR- und VARCHAR-Typen sind ähnlich und untersch...

Website User Experience Design (UE)

Ich habe gerade einen von JunChen verfassten Beitr...

Details zum JavaScript-Prototyp

Inhaltsverzeichnis 1. Übersicht 1.1 Was ist ein P...

So installieren Sie eine MySQL-Datenbank im Deepin 2014-System

Deepin 2014 herunterladen und installieren Zum He...

Detaillierte Erklärung redundanter und doppelter Indizes in MySQL

MySQL ermöglicht das Erstellen mehrerer Indizes f...

MySql-Abfrageanweisung mit mehreren Bedingungen und dem Schlüsselwort „OR“

Im vorherigen Artikel wurde die MySql-Abfrageanwe...

Element-Beispielcode zum Implementieren dynamischer Tabellen

Inhaltsverzeichnis 【Code-Hintergrund】 【Code-Imple...

Beispielschritte zur Verwendung von AntV X6 mit Vue.js

Inhaltsverzeichnis 0x0 Einführung 0x1 Installatio...

Drei Möglichkeiten zum Sperren und Entsperren von Benutzerkonten in Linux

Wenn in Ihrer Organisation bereits eine Kennwortr...

Schreiben Sie mit CSS in drei Schritten einen Coupon für eine Shopping-Card

Heute ist der 618. und alle großen Einkaufszentre...

So installieren Sie MySQL 8.0 in Docker

Umgebung: MacOS_Cetalina_10.15.1, Mysql8.0.18, Do...

Was sind HTML-Inline-Elemente und Block-Level-Elemente und ihre Unterschiede

Ich erinnere mich an eine Frage, die der Intervie...

Lösung für das MySQL Master-Slave-Verzögerungsproblem

Heute werden wir uns ansehen, warum es zu Master-...