Heim >Datenbank >MySQL-Tutorial >MySQL-Sicherheitsleitfaden (1) (umgeleitet)
MySQL-Sicherheitshandbuch
Autor:
Yanzi
Als MySQL-Systemadministrator sind Sie für die Aufrechterhaltung der Datensicherheit und Integrität Ihres MySQL-Datenbanksystems verantwortlich. Dieser Artikel stellt hauptsächlich den Aufbau eines sicheren MySQL-Systems vor und bietet Ihnen eine Anleitung sowohl aus der internen als auch aus der externen Netzwerkperspektive des Systems.
Dieser Artikel befasst sich hauptsächlich mit den folgenden sicherheitsrelevanten Themen:
Warum ist Sicherheit wichtig und vor welchen Angriffen sollten Sie sich schützen?
Risiken des Servers (interne Sicherheit), wie geht man damit um?
Client-Risiko (externe Sicherheit) bei der Verbindung zum Server, wie geht man damit um?
MySQL-Administratoren sind dafür verantwortlich, die Sicherheit der Datenbankinhalte zu gewährleisten, sodass auf diese Datensätze nur ordnungsgemäß autorisierte Benutzer zugreifen können, was die interne Sicherheit und die externe Sicherheit des Datenbanksystems betrifft.
Bei der internen Sicherheit geht es um Probleme auf Dateisystemebene, d. h. darum, zu verhindern, dass das MySQL-Datenverzeichnis (DATADIR) von Personen mit Konten auf dem Server-Host (legitim oder gestohlen) angegriffen wird. Es macht keinen Sinn, sicherzustellen, dass die Autorisierungstabellen, die den Client-Zugriff über das Netzwerk steuern, korrekt eingerichtet sind, wenn der Inhalt des Datenverzeichnisses zu stark gewährt wird, sodass jeder die Dateien, die diesen Datenbanktabellen entsprechen, einfach überschreiben kann.
Bei der externen Sicherheit geht es darum, dass Clients von außen über das Netzwerk eine Verbindung zum Server herstellen, d. h. den MySQL-Server vor Angriffen schützen, die von Verbindungen zum Server über das Netzwerk ausgehen. Sie müssen die MySQL-Grant-Tabelle (grant
Tabelle), wodurch ihnen der Zugriff auf den Inhalt der vom Server verwalteten Datenbank verweigert wird, sofern kein gültiger Benutzername und ein gültiges Kennwort angegeben werden.
Im Folgenden wird detailliert beschrieben, wie das Dateisystem und die Autorisierungstabelle MySQL eingerichtet werden, um die zweistufige Sicherheit von MySQL zu erreichen.
1. Interne Sicherheit – Gewährleistung der Sicherheit des Datenverzeichniszugriffs
Der MySQL-Server bietet ein flexibles Berechtigungssystem über die Autorisierungstabelle in der MySQL-Datenbank. Sie können den Inhalt dieser Tabellen so einstellen, dass der Client-Zugriff auf die Datenbank zugelassen oder verweigert wird. Dies bietet Ihnen eine Sicherheitsmaßnahme, um zu verhindern, dass andere Benutzer auf dem Host direkt auf den Inhalt zugreifen In einem Datenverzeichnis hilft Ihnen die Einrichtung einer guten Sicherheit für den Datenbankzugriff über das Netzwerk nicht, es sei denn, Sie wissen, dass Sie der einzige Benutzer sind, der am Hostcomputer angemeldet ist, auf dem der MySQL-Server ausgeführt wird, und Sie müssen sich um die Möglichkeit anderer Benutzer kümmern auf diesem Computer Zugriff auf das Datenverzeichnis erhalten.
Das sollten Sie schützen:
Datenbankdateien. Natürlich möchten Sie die Privatsphäre der vom Server verwalteten Datenbank wahren. Datenbankeigentümer sollten in der Regel die Sicherheit von Datenbankinhalten berücksichtigen, auch wenn sie dies nicht möchten, und sollten erwägen, Datenbankinhalte öffentlich zu machen, anstatt sie durch schlechte Datenverzeichnissicherheit preiszugeben.
Protokolldatei. Allgemeine Protokolle und Änderungsprotokolle müssen sicher aufbewahrt werden, da sie Abfragetext enthalten. Jeder, der Zugriff auf die Protokolldateien hat, kann die in der Datenbank ausgeführten Vorgänge überwachen.
Die Sicherheit von Protokolldateien, die wichtiger berücksichtigt werden sollten, ist beispielsweise GRANT und SET
Abfragen wie PASSWord werden ebenfalls protokolliert, und im Allgemeinen enthalten Aktualisierungsprotokolle den Text vertraulicher Abfragen, einschließlich Passwörtern (MySQL verwendet Passwortverschlüsselung, wird aber bei nachfolgenden Verbindungsaufbauten erst verwendet, wenn sie festgelegt wurde. Der Prozess des Festlegens eines Passworts ist gestaltet wie GRANT oder SET
PASSWORT und andere Abfragen, und diese Abfragen werden im Klartext in der Protokolldatei aufgezeichnet. Wenn ein Angreifer Lesezugriff auf eine Datei erhält, kann er einfach grep auf der Protokolldatei ausführen und nach Wörtern wie GRANT und PASSWORD suchen, um vertrauliche Informationen zu entdecken.
Natürlich möchten Sie anderen Benutzern auf dem Server-Host keinen Schreibzugriff auf die Datenbankverzeichnisdateien gewähren, da diese Ihre Statusdateien oder Datenbanktabellendateien überschreiben können, aber auch Lesezugriff ist gefährlich. Wenn eine Datenbanktabellendatei gelesen werden kann, wäre es umständlich, die Datei zu stehlen und auf MySQL selbst zuzugreifen und den Inhalt der Tabelle im Klartext anzuzeigen. Warum? Denn Sie müssen Folgendes tun:
Installieren Sie Ihren eigenen „speziellen“ MySQL-Server auf dem Server-Host, jedoch mit einem anderen Port, Socket und Datenverzeichnis als die offizielle Serverversion.
Führen Sie mysql_install_db aus, um Ihr Datenverzeichnis zu initialisieren, wodurch Sie die Rolle von MySQL erhalten
Der Root-Benutzer hat Zugriff auf Ihren Server, sodass Sie die volle Kontrolle über den Serverzugriffsmechanismus haben. Außerdem wird eine Testdatenbank erstellt.
Kopieren Sie die Datei, die der Tabelle entspricht, die Sie stehlen möchten, in das Testverzeichnis unter dem Datenbankverzeichnis Ihres Servers.
Starten Sie Ihren Server. Sie können nach Belieben auf die Datenbanktabellen zugreifen, TABELLE ANZEIGEN VON
Der Test zeigt, dass Sie eine Kopie der gestohlenen Tabelle haben. SELECT * zeigt den gesamten Inhalt einer dieser Tabellen an.
Wenn Sie wirklich böswillig sind, stellen Sie die Berechtigungen jedem anonymen Benutzer auf Ihrem Server zur Verfügung, sodass jeder von überall aus eine Verbindung zum Server herstellen und auf Ihre Testdatenbank zugreifen kann. Sie haben die gestohlene Datenbanktabelle nun veröffentlicht.
Denken Sie aus der entgegengesetzten Perspektive darüber nach: Möchten Sie, dass andere Ihnen das antun? Natürlich nicht! Sie können sich bei der Datenbank anmelden, indem Sie ls ausführen
Der Befehl -l ermittelt, ob Ihre Datenbank unsichere Dateien und Verzeichnisse enthält. Suchen Sie nach Dateien und Verzeichnissen, für die die Berechtigungen „Gruppe“ und „Andere Benutzer“ festgelegt sind. Das Folgende ist eine Teilliste eines unsicheren Datenverzeichnisses:
%
ls -l
insgesamt 10148
drwxrwxr-x 11 mysqladm Wheel 1024 8. Mai 12:20
.
drwxr-xr-x 22 Wurzelrad 512 8. Mai 13:31
..
drwx------ 2 mysqladm mysqlgrp 512 16. APRIL 15:57
menagerie
drwxrwxr-x 2 mysqladm Wheel 512 25. Januar 20:40
mysql
drwxrwxr-x 7 mysqladm Wheel 512 31. August 1998
sql-bench
drwxrwxr-x 2 mysqladm Wheel 1536 6. Mai 06:11
test
drwx------ 2 mysqladm mysqlgrp 1024 8. Mai 18:43
tmp
....
Wie Sie sehen, verfügen einige Datenbanken über die richtigen Berechtigungen, andere nicht. Die Situation in diesem Beispiel ist das Ergebnis nach einer gewissen Zeit. Weniger restriktive Berechtigungen werden von älteren Servern festgelegt, deren Berechtigungseinstellungen weniger restriktiv sind als neuere Versionen (beachten Sie, dass die restriktiveren Verzeichnisse menageria und tmp beide neuere Daten haben). Aktuelle Versionen von MySQL stellen sicher, dass diese Dateien nur von dem Benutzer gelesen werden können, der den Server betreibt.
Lassen Sie uns diese Berechtigungen so korrigieren, dass nur der Serverbenutzer darauf zugreifen kann. Ihre primären Schutztools sind die Tools, die das UNIX-Dateisystem selbst zum Festlegen von Datei- und Verzeichniseigentümern und -modi bereitstellt. Folgendes müssen wir tun:
Gehen Sie in das Verzeichnis
%
CD
DATADIR
Legt den Besitz aller Dateien im Datenverzeichnis so fest, dass sie dem Konto gehören, mit dem der Server ausgeführt wird (Sie müssen Root sein, um diesen Schritt auszuführen). In diesem Artikel werden mysqladm und mysqlgrp als Benutzername und Gruppenname des Kontos verwendet. Sie können den Besitzer mit einem der folgenden Befehle ändern:
#
chown mysqladm.mysqlgrp .
# find . -follow -type d -print |
mysqladm.mysqlgrp
Stellen Sie den Modus Ihres Datenverzeichnisses und Datenbankverzeichnisses so ein, dass diese nur von mysqladm gelesen werden können. Dadurch wird verhindert, dass andere Benutzer auf den Inhalt Ihres Datenbankverzeichnisses zugreifen. Sie können einen der folgenden Befehle verwenden, um als Root oder mysqladm auszuführen.
%
chmod -R go-rwx .
% find . -follow -type d -print |
go-rwx
Der Besitzer und Modus des Datenverzeichnisinhalts werden für mysqladm festgelegt. Nun sollten Sie darauf achten, dass Sie den Server immer als mysqladm-Benutzer betreiben, da dieser nun der einzige Benutzer (außer root) ist, der Zugriff auf das Datenbankverzeichnis hat.
Nach Abschluss dieser Einstellungen sollten Sie über die folgenden Datenverzeichnisberechtigungen verfügen:
% ls -l
total
10148
drwxrwx--- 11 mysqladm mysqlgrp 1024 8. Mai 12:20
.
drwxr-xr-x 22 Wurzelrad 512 8. Mai 13:31
..
drwx------ 2 mysqladm mysqlgrp 512 16. April 15:57
menagerie
drwx------ 2 mysqladm mysqlgrp 512 25. Januar 20:40
mysql
drwx------ 7 mysqladm mysqlgrp 512 31. August 1998
sql-bench
drwx------ 2 mysqladm mysqlgrp 1536 6. Mai 06:11
test
drwx------ 2 mysqladm mysqlgrp 1024 8. Mai 18:43
tmp
...
2. Externe Sicherheit – Gewährleistung der Sicherheit des Netzwerkzugriffs
Das Sicherheitssystem von MySQL ist sehr flexibel und ermöglicht die Verwendung einer Vielzahl von andere Methode zum Festlegen von Benutzerberechtigungen. Im Allgemeinen können Sie dies mit den standardmäßigen SQL-Anweisungen GRANT und REVOKE tun, die die Grant-Tabellen ändern, die den Client-Zugriff für Sie steuern. Möglicherweise bleiben Sie jedoch bei einer älteren Version von MySQL (vor 3.22.11), die dies nicht unterstützt Diese Anweisungen funktionieren nicht), oder Sie stellen fest, dass die Benutzerberechtigungen nicht wie gewünscht funktionieren. In dieser Situation ist es hilfreich, die Struktur der MySQL-Autorisierungstabellen zu verstehen und zu verstehen, wie der Server sie verwendet, um Zugriffsberechtigungen zu bestimmen. Ein solches Verständnis ermöglicht es Ihnen, Benutzerberechtigungen hinzuzufügen, zu löschen oder zu ändern, indem Sie die Autorisierungstabellen direkt ändern ermöglicht Ihnen die Überprüfung dieser Tabellen bei der Diagnose von Berechtigungsproblemen.
Informationen zur Verwaltung von Benutzerkonten finden Sie unter „MySQL-Benutzerverwaltung“. Eine detaillierte Beschreibung der GRANT- und REVOKE-Anweisungen finden Sie im „MySQL-Referenzhandbuch“.
2.1
Die Struktur und der Inhalt der MySQL-Autorisierungstabelle
Der Zugriff auf die MySQL-Datenbank durch Clients, die über das Netzwerk eine Verbindung zum Server herstellen, wird durch den Inhalt der Autorisierungstabelle gesteuert. Diese Tabellen befinden sich in der MySQL-Datenbank und werden während der ersten Installation von MySQL (Ausführen des Skripts mysql_install_db) initialisiert. Es gibt 5 Autorisierungstabellen: user, db, host, tables_priv und columns_priv.
Tabelle 1
Struktur der Benutzer-, Datenbank- und Host-Autorisierungstabelle
Spalte „Zugriffsbereich“
Benutzerdatenbank-Host
Host Host Host
Benutzerdatenbank
Db
Passwortbenutzer
Datenbank-/Tabellenberechtigungsspalte
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Delete_priv Delete_priv Delete_priv
Drop_priv Drop_priv Drop_priv
Index_priv Index_priv Index_priv
Insert_priv Insert_priv Insert_priv
References_priv References_priv
References_priv
Select_priv Select_priv Select_priv
Update_priv
Update_priv Update_priv
File_priv Grant_priv Grant_priv
Grant_priv
Process_priv
Reload_priv
Shutdown_priv
Tabelle 2 tables_priv und columns_priv Eigentumstabellenstruktur
Zugriffsbereichsspalten
tables_priv columns_priv
Host Host
Db Db
Benutzer Benutzer
Tabellenname Tabellenname
Spaltenname
Berechtigungsspalte
Table_priv Column_priv
Der Inhalt der Autorisierungstabelle dient den folgenden Zwecken:
Benutzertabelle
Die Benutzertabelle listet die Benutzer auf, die sich mit dem Server verbinden können, sowie ihre Passwörter und gibt an, um welche Art von global (Superuser) haben sie Berechtigungen. Alle für die Benutzertabelle aktivierten Berechtigungen sind globale Berechtigungen und gelten für alle Datenbanken. Wenn Sie beispielsweise DELETE-Berechtigungen aktivieren, können die hier aufgeführten Benutzer Datensätze aus jeder Tabelle löschen. Denken Sie also sorgfältig darüber nach, bevor Sie dies tun.
DB-Tabelle
DB-Tabelle listet die Datenbanken auf, auf die Benutzer zugreifen dürfen. Die hier angegebenen Berechtigungen gelten für alle Tabellen in einer Datenbank.
Host-Tabelle
Die Host-Tabelle wird in Kombination mit der DB-Tabelle verwendet, um die Zugriffsrechte eines bestimmten Hosts auf die Datenbank auf einer besseren Ebene zu steuern, was möglicherweise besser ist als die alleinige Verwendung von DB. Diese Tabelle wird von GRANT- und REVOKE-Anweisungen nicht beeinflusst, sodass Sie möglicherweise feststellen, dass Sie sie überhaupt nicht verwenden.
tables_priv table
tables_priv table gibt Berechtigungen auf Tabellenebene an. Eine hier angegebene Berechtigung gilt für alle Spalten einer Tabelle.
columns_priv-Tabelle
columns_priv-Tabelle gibt Berechtigungen auf Spaltenebene an. Die hier angegebenen Berechtigungen gelten für bestimmte Spalten einer Tabelle.
Im Abschnitt „Einrichten von Benutzern ohne GRANT“ besprechen wir, wie die GRANT-Anweisung zum Ändern dieser Tabellen funktioniert und wie Sie den gleichen Effekt erzielen können, indem Sie die Berechtigungstabelle direkt ändern.
tables_priv- und columns_priv-Tabellen in MySQL
Eingeführt in Version 3.22.11 (gleichzeitig mit der GRANT-Anweisung). Wenn Sie eine frühere Version von MySQL haben, verfügt Ihre MySQL-Datenbank nur über die Tabellen user, db und host. Wenn Sie von einer älteren Version auf 3.22.11 oder neuer aktualisiert haben und nicht über die Tabellen tables_priv und columns_priv verfügen, führen Sie das Skript mysql_fix_privileges_tables aus, um sie zu erstellen.
MySQL verfügt nicht über eine rows_priv-Tabelle, da sie keine Berechtigungen auf Datensatzebene bereitstellt. Beispielsweise können Sie Benutzer nicht auf Zeilen in der Tabelle beschränken, die bestimmte Spaltenwerte enthalten. Wenn Sie diese Fähigkeit wirklich benötigen, müssen Sie sie mithilfe der Anwendungsprogrammierung bereitstellen. Wenn Sie die empfohlene Sperrung auf Datensatzebene durchführen möchten, können Sie dies mit der Funktion GET_LOCK() tun.
Die Autorisierungstabelle enthält zwei Arten von Spalten: die Bereichsspalte, die bestimmt, wann eine Berechtigung angewendet wird, und die Berechtigungsspalte, die bestimmt, welche Berechtigung erteilt wird.
2.1.1
Bereichsspalte der Autorisierungstabelle
Die Bereichsspalte der Autorisierungstabelle gibt an, wann die Berechtigungen in der Tabelle angewendet werden. Jeder Autorisierungstabelleneintrag enthält Benutzer- und Hostspalten, um anzugeben, wann Berechtigungen für die Verbindung eines bestimmten Benutzers von einem bestimmten Host aus gelten. Andere Tabellen enthalten zusätzliche Bereichsspalten, z. B. die Datenbanktabelle mit einer Datenbankspalte, die angibt, für welche Datenbank die Berechtigung gilt. Ebenso enthalten die Tabellen tables_priv und columns_priv Bereichsfelder, die den Bereich auf eine bestimmte Tabelle in einer Datenbank oder auf eine bestimmte Spalte einer Tabelle einschränken.
2.1.2
Berechtigungsspalten der Autorisierungstabelle
Die Autorisierungstabelle enthält auch Berechtigungsspalten, die angeben, über welche Berechtigungen der in der Bereichsspalte angegebene Benutzer verfügt. Die von MySQL unterstützten Berechtigungen sind in der folgenden Tabelle aufgeführt. Die Tabelle verwendet den Berechtigungsnamen der GRANT-Anweisung. Für die meisten Berechtigungsspaltennamen in den Benutzer-, Datenbank- und Hosttabellen besteht ein offensichtlicher Zusammenhang zwischen den Namen in der GRANT-Anweisung. Select_priv entspricht beispielsweise der SELECT-Berechtigung.
Das Obige ist der Inhalt des MySQL-Sicherheitshandbuchs (1) (neu veröffentlicht). Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (www.php.cn)!