MySQL-Sicherheitshandbuch (3)
2.4
Einrichten von Benutzern ohne GRANT
Wenn Sie eine MySQL-Version vor 3.22.11 haben, können Sie die GRANT- (oder REVOKE-)Anweisung nicht verwenden, um Benutzer und ihre Zugriffsrechte festzulegen, aber Sie können den Inhalt der Autorisierungstabelle direkt ändern. Dies ist einfach, wenn Sie verstehen, wie die GRANT-Anweisung die Grant-Tabelle ändert. Anschließend können Sie das Gleiche selbst tun, indem Sie die INSERT-Anweisung manuell ausführen.
Wenn Sie eine GRANT-Anweisung abgeben, geben Sie einen Benutzernamen und einen Hostnamen sowie möglicherweise ein Passwort an. Für diesen Benutzer wird ein Benutzertabellendatensatz generiert und diese Werte werden in den Spalten Benutzer, Host und Passwort aufgezeichnet. Wenn Sie globale Berechtigungen in einer GRANT-Anweisung angeben, werden diese Berechtigungen in der Spalte „Berechtigungen“ des Datensatzes aufgezeichnet. Beachten Sie, dass die GRANT-Anweisung das Passwort für Sie verschlüsselt, INSERT jedoch nicht. Sie müssen die Funktion PASSWORD() in INSERT verwenden, um das Passwort zu verschlüsseln.
Wenn Sie Berechtigungen auf Datenbankebene angeben, werden der Benutzername und der Hostname in den Spalten „Benutzer“ und „Host“ der Datenbanktabelle aufgezeichnet. Die Datenbank, für die Sie die Autorisierung vornehmen, wird in der Spalte „Db“ aufgezeichnet, und die von Ihnen erteilten Berechtigungen werden in der Spalte „Berechtigungen“ aufgezeichnet.
Bei Berechtigungen auf Tabellen- und Spaltenebene ist der Effekt ähnlich. Erstellen Sie Datensätze in den Tabellen tables_PRiv und columns_priv, um den Benutzernamen, den Hostnamen und die Datenbank sowie zugehörige Tabellen und Spalten aufzuzeichnen. Die gewährten Berechtigungen werden in der Spalte „Berechtigungen“ erfasst.
Wenn Sie sich an die vorherige Einführung erinnern, sollten Sie in der Lage sein, das zu tun, was GRANT tut, ohne die GRANT-Anweisung zu verwenden. Denken Sie daran, dass Sie den Server anweisen, die Autorisierungstabelle neu zu laden, wenn Sie die Autorisierungstabelle direkt ändern, da er sonst nichts von Ihren Änderungen erfährt. Sie können einen MySQL-Admin ausführen
Flush-Privilegien oder MySQLadmin
Der Reload-Befehl erzwingt ein Neuladen. Wenn Sie dies vergessen, werden Sie sich fragen, warum der Server nicht das tut, was Sie wollen.
Die folgende GRANT-Anweisung erstellt einen Superuser mit Besitz. Beinhaltet die Möglichkeit, an andere zu delegieren:
GRANT
ALL ON *.* TO anyname@localhost IDENTIFIED BY „passwd“
WITH GRANT
OPTION
Diese Anweisung erstellt einen Datensatz für anyname@localhost in der Benutzertabelle und öffnet alle Berechtigungen, da hier die Superuser-Berechtigungen (global) gespeichert sind. Um dasselbe mit der INSERT-Anweisung zu tun, lautet die Anweisung :
EINFÜGEN IN
user VALUES("localhost","anyname",PASSWORD("passwd"),
"Y", "Y", "Y", "Y", "Y", "Y", "Y", Y“, „Y“, „Y“, „Y“, „Y“, „Y“, „Y“)
Abhängig von Ihrer MySQL-Version funktioniert es möglicherweise nicht. Die Struktur der Berechtigungstabelle hat sich geändert und Ihre Benutzertabelle enthält möglicherweise nicht mehr 14 Berechtigungsspalten. Verwenden Sie SHOW
SPALTEN Finden Sie heraus, welche Berechtigungsspalte Ihre Grant-Tabelle enthält, und passen Sie Ihre INSERT-Anweisung entsprechend an. Die folgende GRANT-Anweisung erstellt ebenfalls einen Benutzer mit Superuser-Status, jedoch mit nur einer einzigen Berechtigung:
GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY
„flushpass“
Die INSERT-Anweisung in diesem Beispiel ist einfacher als die vorherige. Sie listet die Spaltennamen einfach auf und gibt nur eine Berechtigungsspalte an. Alle anderen Spalten werden auf den Standardwert „N“ gesetzt:
INSERT INTO Benutzer (Host, Passwort, Neu laden)
VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
Verwenden Sie ein ON für Berechtigungen auf Datenbankebene
db_name.*-Klausel anstelle von ON *.* für die Autorisierung:
GRANT ALL ON sample.* TO boris@localhost
IDENTIFIZIERT DURCH
„ruby“
Diese Berechtigungen sind nicht global, daher werden sie nicht in der Benutzertabelle gespeichert. Wir müssen immer noch einen Datensatz in der Benutzertabelle erstellen (damit der Benutzer eine Verbindung herstellen kann), aber wir müssen auch eine Datenbank erstellen Tabellendatensatzdatensatzdatenbanksatz Berechtigungen:
INSERT INTO Benutzer (Host, Benutzer, Passwort)
VALUES("localhost","boris",PASSWORD("ruby"))
INSERT INTO db
VALUES("localhost", "sample_db", "boris", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", „Y“)
Die Spalte „N“ steht für GRANT-Berechtigungen; mit WITH für die letzte Datenbankebene
GEWÄHREN
Für die GRANT-Anweisung von OPTION müssen Sie die Spalte auf „Y“ setzen.
Um Berechtigungen auf Tabellen- oder Spaltenebene festzulegen, verwenden Sie die INSERT-Anweisung für tables_priv oder columns_priv. Wenn Sie keine GRANT-Anweisung haben, werden Sie diese Tabellen natürlich nicht haben, da sie alle gleichzeitig in MySQL erscheinen. Wenn Sie über diese Tabellen verfügen und sie aus irgendeinem Grund manuell bearbeiten möchten, beachten Sie, dass Sie keine Berechtigungen für einzelne Spalten aktivieren können.
Sie legen die Spalte tables_priv.Table_priv oder columns_priv.Column_priv so fest, dass sie den Berechtigungswert enthält, den Sie aktivieren möchten. Um beispielsweise SELECT- und INSERT-Berechtigungen für eine Tabelle zu aktivieren, legen Sie Table_priv im zugehörigen tables_priv-Datensatz auf „Select,Insert“ fest.
Wenn Sie Berechtigungen für einen Benutzer mit einem MySQL-Konto ändern möchten, verwenden Sie UPDATE anstelle von INSERT, unabhängig davon, ob Sie Berechtigungen hinzufügen oder widerrufen. Um einen Benutzer vollständig zu löschen, löschen Sie Datensätze aus jeder vom Benutzer verwendeten Tabelle.
Wenn Sie lieber vermeiden möchten, eine Abfrage zum direkten Ändern der vollständigen Berechtigungstabelle auszuführen, können Sie einen Blick auf die Skripte mysqlaccess und mysql_setpermissions werfen, die mit MySQL geliefert werden.
Anhang 1
Quiz
Nachdem Sie gerade einen MySQL-Server installiert und einen Benutzer hinzugefügt haben, der eine Verbindung zu MySQL herstellen darf, verwenden Sie die folgende Anweisung:
GRANT ALL ON
samp_db.* AN fred@*.snake.net IDENTIFIZIERT
„Kakao“
Und Fred hatte zufällig ein Konto auf dem Server-Host, also versuchte er, eine Verbindung zum Server herzustellen:
%mysql -u fred -pcocoa
samp_db
FEHLER 1045: Zugriff verweigert für Benutzer: „fred@localhost“ (Passwort wird verwendet:
JA)
Warum?
Der Grund ist:
Überlegen Sie zunächst, wie mysql_install_db die anfängliche Berechtigungstabelle erstellt und wie der Server Benutzertabellendatensätze verwendet, um Kundenverbindungen abzugleichen. Wenn Sie Ihre Datenbank mit mysql_install_db initialisieren, wird eine Benutzertabelle wie diese erstellt:
Host
Benutzer
localhost
pit.snake.net
localhost
pit.snake.net
root
root
Mit den ersten beiden Datensätzen kann root „localhost“ oder „hostname“ angeben, um eine Verbindung zum lokalen Server herzustellen, und mit den letzten beiden können anonyme Benutzer lokal eine Verbindung herstellen. Nach dem Hinzufügen des Fred-Benutzers
Host
Benutzer
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net
root
root
fred
Wenn der Server startet, liest er die Datensätze und sortiert sie (zuerst nach Host, dann nach Benutzer auf dem Host), wobei die spezifischeren Datensätze an erster Stelle stehen:
Hostbenutzer
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.net
root
root
fred
Die beiden Datensätze mit „localhost“ werden zusammen eingestuft, während der Datensatz für „root“ an erster Stelle steht, da er spezifischer als null ist. Die Datensätze für pit.snake.net sind ähnlich. Bei all diesen handelt es sich um wörtliche Host-Werte ohne Platzhalter, daher werden sie vor dem Datensatz für fred eingestuft, insbesondere anonyme Benutzer vor fred.
Das Ergebnis ist, dass, wenn Fred versucht, eine Verbindung von localhost herzustellen, ein Datensatz mit einem leeren Benutzernamen in der Host-Spalte vor einem Datensatz mit %.snake.net abgeglichen wird. Das Passwort für diesen Datensatz ist leer, da der standardmäßige anonyme Benutzer kein Passwort hat. Da Fred beim Herstellen der Verbindung ein Passwort angegeben hat, kam es zu einer Nichtübereinstimmung und die Verbindung schlug fehl.
Hier ist zu beachten, dass es zwar praktisch ist, Platzhalter zu verwenden, um die Hosts anzugeben, von denen aus Benutzer eine Verbindung herstellen können. Sie werden jedoch Probleme beim Herstellen einer Verbindung von localhost haben, solange Sie anonyme Benutzerdatensätze in der Tabelle behalten.
Im Allgemeinen wird empfohlen, anonyme Benutzerdatensätze zu löschen:
mysql>
VON Benutzer WO LÖSCHEN
User="";
Gehen Sie einen Schritt weiter und löschen Sie alle anonymen Benutzer in anderen Autorisierungstabellen. Die Tabellen mit den Benutzerspalten sind db, tables_priv und columns_priv.
Anhang 2
Eine neue MySQL-Installation sicherer machen
Nachdem Sie selbst einen neuen MySQL-Server installiert haben, müssen Sie ein Verzeichnis für den MySQL-Root-Benutzer angeben (standardmäßig kein Passwort). Andernfalls ist MySQL in einem äußerst unsicheren Zustand, wenn Sie dies vergessen Zustand (zumindest für eine Weile).
Unter Unix (Linux) müssen Sie nach der Installation von MySQL gemäß den Anweisungen im Handbuch das Skript mysql_install_db ausführen, um die MySQL-Datenbank einzurichten, die die Autorisierungstabelle und die anfänglichen Berechtigungen enthält. Führen Sie unter Windows das Setup-Programm in der Distribution aus, um das Datenverzeichnis und die MySQL-Datenbank zu initialisieren. Es wird davon ausgegangen, dass auch der Server läuft.
Wenn Sie MySQL zum ersten Mal auf Ihrem Computer installieren, wird die Autorisierungstabelle in der MySQL-Datenbank wie folgt initialisiert:
Sie können sich von localhost aus als Root verbinden, ohne ein Passwort anzugeben. Der Root-Benutzer hat alle Rechte (einschließlich Administratorrechte) und kann alles tun. (Der MySQL-Superuser hat übrigens denselben Namen wie der Unix-Superuser und sie haben nichts miteinander zu tun.)
Anonymer Zugriff wird Benutzern gewährt, die sich lokal mit Datenbanken namens test und allen Datenbanken verbinden können, deren Name mit test_ beginnt. Anonyme Benutzer können alles mit der Datenbank machen, haben aber keine Administratorrechte.
Verbindungen zu mehreren Servern von localhost sind zulässig, unabhängig davon, ob der verbindende Benutzer einen localhost-Hostnamen oder einen echten Hostnamen verwendet. Zum Beispiel:
% mysql -h
localhost test
% mysql -h pit.snake.net
test
Die Tatsache, dass Sie sich als Root mit MySQL verbinden, ohne auch nur ein Passwort anzugeben, bedeutet nur, dass die Erstinstallation nicht sicher ist. Als Administrator sollten Sie also als Erstes das Root-Passwort festlegen und Verwenden Sie dann die Methode, mit der Sie das Kennwort festlegen. Sie können den Server auch anweisen, die Autorisierungstabelle neu zu laden, damit er über diese Änderung informiert wird. (Wenn der Server startet, lädt er die Tabellen neu in den Speicher und weiß möglicherweise nicht, dass Sie sie geändert haben.)
Für MySQL
Für Versionen 3.22 und höher können Sie mysqladmin verwenden, um das Passwort festzulegen:
% mysqladmin -u Root-Passwort
IhrPasswort
Für jede MySQL-Version können Sie das MySQL-Programm verwenden und die Benutzerautorisierungstabelle in der MySQL-Datenbank direkt ändern:
%
mysql -u root mysql
mysql>UPDATE user SET
passwort=PASSWORD("IhrPasswort") WHERE
User="root";
Wenn Sie eine alte Version von MySQL haben, verwenden Sie mysql und UPDATE.
Nachdem Sie das Passwort festgelegt haben, prüfen Sie, ob Sie den Server anweisen müssen, die Autorisierungstabelle neu zu laden, indem Sie den folgenden Befehl ausführen:
%
mysqladmin -u Root-Status
Wenn der Server Sie weiterhin als Root ohne Angabe eines Passworts verbinden lässt, laden Sie die Autorisierungstabelle neu:
%
mysqladmin -u root
neu laden
Nachdem Sie das Root-Passwort festgelegt (und gegebenenfalls die Autorisierungstabellen neu geladen) haben, müssen Sie das Passwort jedes Mal angeben, wenn Sie sich als Root mit dem Server verbinden.
Das Obige ist der Inhalt des MySQL-Sicherheitshandbuchs (3) (Nachdruck). Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (m.sbmmt.com)!