1. Sichern Sie Ihren Server
Viele bekannte Angriffe sind nur möglich, wenn physisch auf eine Maschine zugegriffen wird. Aus diesem Grund ist es am besten, den Anwendungsserver und den Datenbankserver auf verschiedenen Rechnern zu haben. Wenn dies nicht möglich ist, ist erhöhte Vorsicht geboten. Andernfalls kann ein Angreifer durch die Ausführung von Remote-Befehlen über einen Anwendungsserver Ihre Datenbank auch ohne Berechtigungen beschädigen. Aus diesem Grund sollte jedem Dienst, der auf demselben Rechner wie die Datenbank läuft, die niedrigstmögliche Berechtigung erteilt werden, die es dem Dienst noch erlaubt, zu funktionieren.
Vergessen Sie nicht, das gesamte Sicherheitspaket zu installieren:Antivirus und Anti-Spam, Firewall und alle vom Hersteller Ihres Betriebssystems empfohlenen Sicherheitspakete. Vergessen Sie auch nicht, 10 Minuten lang über den physischen Standort Ihres Servers nachzudenken - am falschen Standort kann Ihr Server gestohlen, überflutet oder von wilden Tieren oder Landstreichern beschädigt werden.
2. Localhost-Sicherheit oder Fernzugriff deaktivieren oder einschränken
Überlegen Sie, ob MySQL vom System abgerufen oder direkt von seinem eigenen Server aus aufgerufen wird. Stellen Sie sicher, dass nur bestimmte Hosts auf den Server zugreifen können, wenn Remotezugriff verwendet wird. Dies geschieht in der Regel über TCP-Wrapper, IP-Tabellen oder einige andere Firewall-Programmierungs- oder Hardwarezugriffstools.
Um MySQL daran zu hindern, einen Netzwerk-Socket zu öffnen, sollte der zugehörige Parameter in den [mysqld]-Bereich von my.cnf oder my.ini eingefügt werden:
Netzwerk überspringen
Das Dokument befindet sich im Verzeichnis "C:\Programme\MySQL\MySQL Server 5.1" catalog auf dem Windows-Betriebssystem oder "/etc/my.cnf" oder "/etc/mysql/my.cnf" auf Linux.
Diese Zeile lähmt den Start der Systemadministration mitten im MySQL-Start. Es wäre ideal, wenn Sie bedenken, dass eine lokale Verbindung verwendet werden kann, um eine Verbindung zum MySQL-Server herzustellen.
Eine andere mögliche Lösung besteht darin, MySQL zu zwingen, nur auf localhost zu lauschen, indem Sie die folgende Zeile in [mysqld] hinzufügen Abschnitt von my.cnf Bindungsadresse =127.0.0.1
Sie sind möglicherweise nicht bereit, den Systemzugriff auf Ihren Datenbankserver zu deaktivieren, wenn Clients in Ihrer Organisation von ihren Computern aus mit dem Server oder dem auf einem anderen Computer eingeführten Webserver verbunden sind. In diesem Fall sollte die folgende restriktive Erteilungssyntax in Betracht gezogen werden:
mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';
3. Deaktivieren Sie die Verwendung von LOCAL INFILE
Die nächste Änderung besteht darin, die Verwendung von "LOAD DATA LOCAL INFILE" zu deaktivieren Befehl, der dazu beitragen wird, nicht genehmigtes Durchlesen von Nachbarschaftsunterlagen zu verhindern. Dies ist besonders wichtig, wenn neue SQL-Injection-Schwachstellen in PHP-Anwendungen gefunden werden.
Außerdem in bestimmten Fällen das "LOCAL INFILE" Der Befehl kann verwendet werden, um Zugriff auf andere Dateien im Betriebssystem zu erhalten, zum Beispiel "/etc/passwd" , indem Sie den folgenden Befehl verwenden:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
Oder sogar deutlich weniger schwierig:
mysql> SELECT load\_file("/etc/passwd")
Um die Verwendung des "LOCAL INFILE" zu deaktivieren Befehl, sollte der folgende Parameter in [mysqld] hinzugefügt werden Abschnitt der MySQL-Konfigurationsdatei.
set-variable=local-infile=0
4. Ändern Sie den Root-Benutzernamen und das Passwort, und sorgen Sie dafür, dass sie stark bleiben.
Der standardmäßige Administrator-Benutzername auf dem MySQL-Server ist "root" . Hacker versuchen oft, Zugriff auf seine Berechtigungen zu erhalten. Um diese Aufgabe zu erschweren, benennen Sie "root" um zu etwas anderem und versehen Sie es mit einem langen, komplexen alphanumerischen Passwort.
Um den Benutzernamen des Administrators umzubenennen, verwenden Sie den Befehl rename in der MySQL-Konsole:
mysql> RENAME USER root TO new\_user;
Der MySQL "BENUTZER UMBENENNEN" Der Befehl erschien erstmals in MySQL-Version 5.0.2. Wenn Sie eine ältere Version von MySQL verwenden, können Sie andere Befehle verwenden, um einen Benutzer umzubenennen:
mysql> use mysql;
mysql> update user set user="new\_user" where user="root";
mysql> flush privileges;
Um das Kennwort eines Benutzers zu ändern, verwenden Sie den folgenden Befehlszeilenbefehl:
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');
Es ist auch möglich, das Passwort mit "mysqladmin" zu ändern Dienstprogramm:
shell> mysqladmin -u username -p password newpass
5. Entfernen Sie die "Test"-Datenbank
MySQL wird mit einer „Test“-Datenbank geliefert, die als Testraum gedacht ist. Es kann vom anonymen Benutzer abgerufen werden und wird daher von zahlreichen Angriffen verwendet.
Um diese Datenbank zu entfernen, verwenden Sie den Drop-Befehl wie folgt:
mysql> drop database test;
Oder verwenden Sie "mysqladmin" Befehl:
shell> mysqladmin -u username -p drop test
6. Anonyme und veraltete Konten entfernen
Die MySQL-Datenbank enthält einige anonyme Benutzer mit leeren Passwörtern. Daher kann sich jeder mit der Datenbank verbinden, um zu überprüfen, ob dies der Fall ist, gehen Sie wie folgt vor:
mysql> select \* from mysql.user where user="";
In einem sicheren System sollten keine Zeilen zurückgesendet werden. Eine andere Möglichkeit, dasselbe zu tun:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ''@'myhost';
Wenn die Genehmigungen vorhanden sind, kann jeder auf die Datenbank zugreifen und zumindest die Standarddatenbank "test" verwenden . Überprüfen Sie dies mit:
shell> mysql -u blablabla
Um das Konto zu entfernen, führen Sie den folgenden Befehl aus:
mysql> DROP USER "";
Der MySQL "DROP USER" Der Befehl wird ab MySQL-Version 5.0 unterstützt. Wenn Sie eine ältere Version von MySQL verwenden, können Sie das Konto wie folgt entfernen:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
7. Erhöhen Sie die Sicherheit mit rollenbasierter Zugriffskontrolle
Eine sehr häufige Empfehlung zur Datenbanksicherheit besteht darin, die Berechtigungen zu verringern, die verschiedenen Parteien erteilt werden. MySQL ist nicht anders. Wenn Entwickler arbeiten, verwenden sie normalerweise die maximale Berechtigung des Systems und achten weniger auf Berechtigungsprinzipien, als wir vielleicht erwarten. Diese Vorgehensweise kann die Datenbank einem erheblichen Risiko aussetzen.
* Jede neue MySQL 5.x-Installation, die bereits unter Verwendung der richtigen Sicherheitsmaßnahmen installiert wurde.
Stellen Sie zum Schutz Ihrer Datenbank sicher, dass das Dateiverzeichnis, in dem die MySQL-Datenbank tatsächlich gespeichert ist, dem Benutzer "mysql" und der Gruppe "mysql" gehört.
shell>ls -l /var/lib/mysql
Stellen Sie außerdem sicher, dass nur die Benutzer „mysql“ und „root“ Zugriff auf das Verzeichnis /var/lib/mysql
haben .
Die mysql-Binärdateien, die sich im Verzeichnis /usr/bin/ befinden, sollten „root“ oder dem spezifischen Systembenutzer „mysql“ gehören. Andere Benutzer sollten keinen Schreibzugriff auf diese Dateien haben.
shell>ls -l /usr/bin/my\*
8. Überprüfen Sie die Datenbankberechtigungen
Betriebssystemberechtigungen wurden im vorherigen Abschnitt behoben. Lassen Sie uns nun über Datenbankberechtigungen sprechen. In den meisten Fällen gibt es einen Administratorbenutzer (der umbenannte „root“) und einen oder mehrere tatsächliche Benutzer, die in der Datenbank koexistieren. Normalerweise hat die "Root" nichts mit den Daten in der Datenbank zu tun; Stattdessen wird es verwendet, um den Server und seine Tabellen zu verwalten, Berechtigungen zu erteilen und zu widerrufen usw.
Andererseits werden einige Benutzer-IDs verwendet, um auf die Daten zuzugreifen, wie z. B. die Benutzer-ID, die dem Webserver zugewiesen ist, um "select\update\insert\delete"-Abfragen auszuführen und gespeicherte Prozeduren auszuführen. In den meisten Fällen sind keine weiteren Benutzer erforderlich; Allerdings können nur Sie als Systemadministrator die Anforderungen Ihrer Anwendung wirklich kennen.
Nur Administratorkonten müssen die SUPER / PROCESS / FILE-Berechtigungen und Zugriff auf die MySQL-Datenbank gewährt werden. Normalerweise ist es eine gute Idee, die Berechtigungen des Administrators für den Zugriff auf die Daten zu verringern.
Überprüfen Sie die Berechtigungen der restlichen Benutzer und stellen Sie sicher, dass diese richtig eingestellt sind. Dies kann mit den folgenden Schritten erfolgen.
mysql> use mysql;
[Benutzer identifizieren]
mysql> select \* from users;
[Berechtigungen aller Benutzer auflisten]
mysql> show grants for ‘root’@’localhost’;
Die obige Anweisung muss für jeden Benutzer ausgeführt werden ! Beachten Sie, dass nur Benutzern, die wirklich Root-Privilegien benötigen, diese gewährt werden sollten.
Ein weiteres interessantes Privileg ist "SHOW DATABASES". Standardmäßig kann der Befehl von jedem verwendet werden, der Zugriff auf die MySQL-Eingabeaufforderung hat. Sie können es verwenden, um Informationen zu sammeln (z. B. um Datenbanknamen zu erhalten), bevor sie die Datenbank angreifen, indem sie beispielsweise die Daten stehlen. Um dies zu verhindern, wird empfohlen, die unten beschriebenen Verfahren zu befolgen.
- Fügen Sie " --skip-show-database" zum Startskript von MySQL hinzu oder fügen Sie es der MySQL-Konfigurationsdatei hinzu
- Gewähren Sie das SHOW DATABASES-Privileg nur den Benutzern, die diesen Befehl verwenden möchten
Um die Verwendung des Befehls "SHOW DATABASES" zu deaktivieren, sollte der folgende Parameter im Abschnitt [mysqld] von /etc/my.cnf
hinzugefügt werden :
[mysqld]
skip-show-database
9. Protokollierung aktivieren
Wenn Ihr Datenbankserver nicht viele Abfragen ausführt, wird empfohlen, dass Sie die Transaktionsprotokollierung aktivieren, indem Sie die folgende Zeile zum Abschnitt [mysqld] von /etc/my.cnf
hinzufügen Datei:
[mysqld]
log =/var/log/mylogfile
Dies wird für MySQL-Server mit hoher Produktionsleistung nicht empfohlen, da es einen hohen Overhead auf dem Server verursacht.
Stellen Sie außerdem sicher, dass nur die IDs „root“ und „mysql“ Zugriff auf diese Protokolldateien haben (mindestens Schreibzugriff).
Fehlerprotokoll Stellen Sie sicher, dass nur „root“ und „mysql“ Zugriff auf die Protokolldatei „hostname.err“ haben. Die Datei wird im MySQL-Datenverzeichnis gespeichert. Diese Datei enthält sehr vertrauliche Informationen wie Kennwörter, Adressen, Tabellennamen, Namen gespeicherter Prozeduren und Codeteile. Es kann zum Sammeln von Informationen verwendet werden und kann dem Angreifer in einigen Fällen die Informationen liefern, die er benötigt, um die Datenbank, den Computer, auf dem die Datenbank installiert ist, oder die darin enthaltenen Daten auszunutzen.
MySQL-Protokoll Stellen Sie sicher, dass nur „root“ und „mysql“ Zugriff auf die Protokolldatei „logfile XY“ haben. Die Datei wird im MySQL-Datenverzeichnis gespeichert.
10. Ändern Sie das Root-Verzeichnis
Eine Chroot auf UNIX-{Betriebssystem}-Betriebssystemen ist eine Operation, die das scheinbare Plattenstammverzeichnis für die gegenwärtig laufende Methode und ihre Kinder ändert. Ein Programm, das in ein anderes Verzeichnis neu gerootet wurde, kann nicht auf Dateien außerhalb dieses Verzeichnisses zugreifen oder sie benennen, und deshalb wird das Verzeichnis als "Chroot-Gefängnis" oder (seltener) als "Chroot-Gefängnis" bezeichnet.
Durch die Verwendung der chroot-Umgebung kann der Schreibzugriff der mySQL-Prozesse (und untergeordneten Prozesse) eingeschränkt werden, wodurch die Sicherheit des Servers erhöht wird.
Stellen Sie sicher, dass ein dediziertes Verzeichnis für die Chroot-Umgebung existiert. Dies sollte etwa so aussehen:/chroot/mysql
Um die Verwendung der Datenbankverwaltungswerkzeuge bequemer zu machen, sollte außerdem der folgende Parameter im Abschnitt [client] der MySQL-Konfigurationsdatei geändert werden:
[Kunde]
socket = /chroot/mysql/tmp/mysql.sock
Dank dieser Codezeile besteht keine Notwendigkeit, die Befehle mysql, mysqladmin, mysqldump usw. mit --socket=/chroot/mysql/tmp/mysql.sock
bereitzustellen Parameter jedes Mal, wenn diese Tools ausgeführt werden.
11. Alte Protokolle regelmäßig löschen
Während der Installationsprozeduren gibt es viele sensible Daten, die unerwünschten Benutzern helfen, eine Datenbank anzugreifen. Diese Daten werden im Verlauf des Servers gespeichert und können sehr nützlich sein, wenn während der Installation etwas schief geht. Durch die Analyse der Verlaufsdateien können Administratoren herausfinden, was schief gelaufen ist, und möglicherweise Abhilfe schaffen. Diese Dateien werden jedoch nach Abschluss der Installation nicht mehr benötigt.
Wir sollten den Inhalt der MySQL-Verlaufsdatei (~/.mysql_history) dort entfernen, wo alle toten SQL-Befehle aufbewahrt werden (insbesondere Passwörter, die als Klartext aufbewahrt werden):
cat /dev/null > ~/.mysql\_history
Abschließend sollten wir die Datenbanksicherheit betonen. Es sollte jedoch das Erste für jede Person oder ein Unternehmen sein.