MySQL ist ein vollständig vernetztes, plattformübergreifendes relationales Datenbanksystem und ein verteiltes Datenbankverwaltungssystem mit einer Client/Server-Architektur. MySQL ist ein vollständig vernetztes, plattformübergreifendes relationales Datenbanksystem und ein verteiltes Datenbankverwaltungssystem mit einer Client/Server-Architektur. Es bietet die Vorteile leistungsstarker Funktionen, einfacher Verwendung, bequemer Verwaltung, schneller Ausführungsgeschwindigkeit, hoher Sicherheit und Zuverlässigkeit. Benutzer können viele Sprachen verwenden, um Programme für den Zugriff auf die MySQL-Datenbank zu schreiben, insbesondere in Kombination mit PHP goldene Kombination und ist weit verbreitet.
Da es sich bei MySQL um eine plattformübergreifende Datenbank handelt, sollte davon ausgegangen werden, dass ihre Standardkonfiguration in verschiedenen Situationen anwendbar ist, sodass eine weitere Sicherheitsverstärkung in unserer eigenen Nutzungsumgebung durchgeführt werden sollte. Als MySQL-Systemadministrator sind wir für die Aufrechterhaltung der Datensicherheit und Integrität des MySQL-Datenbanksystems verantwortlich.
Die Sicherheitskonfiguration der MySQL-Datenbank muss von zwei Aspekten ausgehen: der internen Systemsicherheit und der externen Netzwerksicherheit. Darüber hinaus werden wir kurz einige Probleme und Tipps vorstellen, auf die Sie beim Programmieren achten sollten.
Systeminterne Sicherheit
Lassen Sie uns zunächst kurz die Verzeichnisstruktur der MySQL-Datenbank vorstellen. Nach der Installation von MySQL werden das Datenverzeichnis und die Datenbank initialisiert, nachdem das Skript mysql_db_install ausgeführt wurde. Wenn wir zur Installation das MySQL-Quellcodepaket verwenden und das Installationsverzeichnis /usr/local/mysql ist, ist das Datenverzeichnis im Allgemeinen /usr/local/mysql/var. Ein Datenbanksystem besteht aus einer Reihe von Datenbanken, die jeweils eine Reihe von Datenbanktabellen enthalten. MySQL verwendet den Datenbanknamen, um ein Datenbankverzeichnis im Datenverzeichnis zu erstellen. Jede Datenbanktabelle verwendet den Datenbanktabellennamen als Dateinamen, und drei Dateien mit den Erweiterungen MYD, MYI und frm werden im Datenbankverzeichnis abgelegt.
Die Autorisierungstabelle von MySQL bietet eine flexible Berechtigungssteuerung für den Datenbankzugriff. Wenn der lokale Benutzer jedoch Leseberechtigungen für die Bibliotheksdatei hat, muss der Angreifer nur das Datenbankverzeichnis packen und kopieren und es dann in sein eigenes Datenverzeichnis kopieren Datenbanken. Daher ist die Sicherheit des Hosts, auf dem sich MySQL befindet, das wichtigste Thema. Wenn der Host nicht sicher ist und nicht von Angreifern kontrolliert wird, kann die Sicherheit von MySQL nicht diskutiert werden. Der zweite Punkt ist die Sicherheit des Datenverzeichnisses und der Datendateien, bei der es um die Berechtigungseinstellungen geht.
Nach einigen alten Binärversionen der MySQL-Hauptseite ist das Attribut des Datenverzeichnisses in Version 3.21.xx 775, was sehr gefährlich ist. Jeder lokale Benutzer kann das Datenverzeichnis lesen, sodass die Datenbankdatei sehr unsicher ist. Das Attribut des Datenverzeichnisses in Version 3.22.xx ist 770. Dieses Attribut ist ebenfalls etwas gefährlich. Lokale Benutzer in derselben Gruppe können sowohl lesen als auch schreiben, sodass die Datendateien nicht sicher sind. Das Attribut des Datenverzeichnisses in Version 3.23.xx ist 700, was besser ist. Nur der Benutzer, der die Datenbank startet, kann die Datenbankdatei lesen und schreiben, wodurch die Sicherheit lokaler Datendateien gewährleistet wird.
Wenn der Benutzer, der die MySQL-Datenbank startet, MySQL ist, dann sind die folgenden Verzeichnisse und Dateien sicher. Bitte achten Sie auf das Datenverzeichnis und die folgenden Attribute:
Shell>ls -l /usr/local/mysql
insgesamt 40
drwxrwxr-x 2 root root 4096 27. Februar 20:07 bin
drwxrwxr-x 3 root root 4096 27. Februar 20:07 einschließen
drwxrwxr-x 2 root root 4096 27. Februar 20:07 Info
drwxrwxr-x 3 root root 4096 27. Februar 20:07 lib
drwxrwxr-x 2 root root 4096 27. Februar 20:07 libexec
drwxrwxr-x 3 root root 4096 27. Februar 20:07 man
drwxrwxr-x 6 root root 4096 27. Februar 20:07 MySQL-Test
drwxrwxr-x 3 root root 4096 27. Februar 20:07 teilen
drwxrwxr-x 7 root root 4096 27. Februar 20:07 sql-bench
drwx------ 4 mysql mysql 4096 27. Februar 20:07 var
Shell>ls -l /usr/local/mysql/var
insgesamt 8
drwx------ 2 mysql mysql 4096 27. Februar 20:08 mysql
drwx------ 2 mysql mysql 4096 27. Februar 20:08 Test
Shell>ls -l /usr/local/mysql/var/mysql
insgesamt 104
-rw------- 1 mysql mysql 0 27. Februar 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 27. Februar 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 27. Februar 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 27. Februar 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27. Februar 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27. Februar 20:08 db.frm
-rw------- 1 mysql mysql 0 27. Februar 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27. Februar 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27. Februar 20:08 func.frm
-rw------- 1 mysql mysql 0 27. Februar 20:08 host.MYD
-rw------- 1 mysql mysql 1024 27. Februar 20:08 host.MYI
-rw------- 1 mysql mysql 8958 27. Februar 20:08 host.frm
-rw------- 1 mysql mysql 0 27. Februar 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 27. Februar 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 27. Februar 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 27. Februar 20:08 user.MYD
-rw------- 1 mysql mysql 2048 27. Februar 20:08 user.MYI
-rw------- 1 mysql mysql 9148 27. Februar 20:08 user.frm
Wenn die Besitzer und Attribute dieser Dateien nicht so sind, verwenden Sie bitte die folgenden beiden Befehle, um das Problem zu beheben:
Shell>chown -R mysql.mysql /usr/local/mysql/var
Shell>chmod -R go-rwx /usr/local/mysql/var
Die Verwendung des Root-Benutzers zum Starten von Remote-Diensten war schon immer ein Sicherheitstabu, denn wenn es ein Problem mit dem Dienstprogramm gibt, ist es sehr wahrscheinlich, dass ein Remote-Angreifer die volle Kontrolle über den Host erlangt. MySQL hat seit Version 3.23.15 geringfügige Änderungen vorgenommen. Standardmäßig muss der Dienst nach der Installation vom MySQL-Benutzer gestartet werden, der Root-Benutzer darf ihn nicht starten. Wenn Sie zum Starten den Root-Benutzer verwenden müssen, müssen Sie den Parameter --user=root (./safe_mysqld --user=root &) hinzufügen. Da es in MySQL die SQL-Anweisungen LOAD DATA INFILE und SELECT... INTO OUTFILE gibt, verfügt der Datenbankbenutzer über die Schreibberechtigung des Root-Benutzers, wenn der Root-Benutzer den MySQL-Server startet. Allerdings gibt es bei MySQL noch einige Einschränkungen. Beispielsweise kann LOAD DATA INFILE nur global lesbare Dateien lesen und SELECT... INTO OUTFILE kann vorhandene Dateien nicht überschreiben.
Lokale Protokolldateien können nicht ignoriert werden, einschließlich Shell-Protokollen und MySQL-eigenen Protokollen. Aus Gründen der Bequemlichkeit beim lokalen Anmelden oder Sichern der Datenbank geben einige Benutzer das Datenbankkennwort manchmal direkt in die Befehlszeilenparameter ein, z. B.:
Shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
Shell>/usr/local/mysql/bin/mysql -uroot -ptest
Diese Befehle werden von der Shell in der Verlaufsdatei aufgezeichnet. Bash schreibt beispielsweise die Datei .bash_history in das Benutzerverzeichnis. Wenn diese Dateien versehentlich gelesen werden, wird das Kennwort der Datenbank preisgegeben. SQL-Befehle, die ausgeführt werden, nachdem sich der Benutzer bei der Datenbank angemeldet hat, werden von MySQL auch in der Datei .mysql_history im Benutzerverzeichnis aufgezeichnet. Wenn der Datenbankbenutzer das Datenbankkennwort mithilfe von SQL-Anweisungen ändert, wird es auch über die Datei .mysql_history durchgesickert. Daher sollten wir bei der Shell-Anmeldung und -Sicherung das Passwort nicht direkt nach -p hinzufügen, sondern das Datenbankpasswort nach der Aufforderung eingeben.
Darüber hinaus sollten wir für alle Fälle nicht zulassen, dass diese beiden Dateien unsere Vorgänge aufzeichnen.
Shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
Diese beiden Befehle verknüpfen diese beiden Dateien mit /dev/null, sodass unsere Vorgänge nicht in diesen beiden Dateien aufgezeichnet werden.
Externe Netzwerksicherheit
Nach der Installation der MySQL-Datenbank sieht die Benutzertabelle auf der Unix-Plattform so aus:
mysql> mysql verwenden;
Datenbank geändert
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+----- -------+
|. Host |. Passwort |
+-----------+------+----------+-------------+----- -------+
|. localhost |. root |
|. redhat |. Y |
|. localhost |
|. redhat |
+-----------+------+----------+-------------+----- -------+
4 Reihen im Satz (0,00 Sek.)
Die Benutzertabelle auf der Windows-Plattform sieht folgendermaßen aus:
mysql> mysql verwenden;
Datenbank geändert
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+----- -------+
|. Host |. Passwort |
+-----------+------+----------+-------------+----- -------+
|. localhost |. root |
|. % |. Y |
|. localhost |
|. % |
+-----------+------+----------+-------------+----- -------+
4 Reihen im Satz (0,00 Sek.)
Schauen wir uns zunächst die Benutzertabelle auf der Unix-Plattform an. Darunter ist Redhat nur der Maschinenname meiner Testmaschine, sodass MySQL auf der Unix-Plattform dieser Maschine tatsächlich standardmäßig nur die Verbindung mit der Datenbank zulässt. Das Standardkennwort des Root-Benutzers ist jedoch leer, sodass die oberste Priorität darin besteht, dem Root-Benutzer ein Kennwort hinzuzufügen. Es gibt drei Möglichkeiten, einem Datenbankbenutzer ein Passwort hinzuzufügen:
1) Verwenden Sie den Befehl mysqladmin an der Shell-Eingabeaufforderung, um das Root-Benutzerkennwort zu ändern:
Shell>mysqladmin -uroot Passworttest
Auf diese Weise wird das Passwort des MySQL-Datenbank-Root-Benutzers in test geändert. (Test ist nur ein Beispiel. Das von uns tatsächlich verwendete Passwort darf kein so leicht zu erratendes schwaches Passwort verwenden.)
2) Verwenden Sie „Passwort festlegen“, um das Passwort zu ändern:
mysql> Passwort für root festlegen@localhost=password('test' );
Zu diesem Zeitpunkt wird das Kennwort des Root-Benutzers in „test“ geändert.
3) Ändern Sie direkt das Root-Benutzerkennwort der Benutzertabelle:
mysql> mysql verwenden;
mysql> update user set password=password('test') where user='root';
mysql> Flush-Berechtigungen;
Auf diese Weise wurde auch das Passwort des MySQL-Datenbank-Root-Benutzers zum Testen geändert. Der letzte Befehl, Flush-Berechtigungen, bedeutet, die Speicherautorisierungstabelle zu erzwingen. Andernfalls wird weiterhin das Kennwort im Cache verwendet. Zu diesem Zeitpunkt können sich illegale Benutzer auch mit dem Root-Benutzer und einem leeren Kennwort anmelden, bis der MySQL-Server aktiviert ist wird neu gestartet.
Wir sehen auch den anonymen Benutzer, dessen Benutzer leer ist. Obwohl er unter der Unix-Plattform keine Berechtigungen hat, sollten wir ihn aus Sicherheitsgründen löschen:
mysql> delete from user where user='';