
MySQL-Datenbanksicherheit freischalten
MySQL ist eine der beliebtesten Open-Source-Datenbanken, die auf verschiedenen Plattformen läuft. Es ist relativ einfach zu konfigurieren, bietet eine einfache Firewall und zeigt gute Leistungseigenschaften, selbst unter erheblicher Last, weist jedoch immer noch eine Vielzahl von sicherheitsrelevanten Konfigurationsproblemen auf.
Best Practices zur MySQL-Datenbanksicherheit
Der beste Sicherheitsmanagementansatz ist es, paranoid zu sein und jederzeit mit einem Angriff von jeder Seite zu rechnen. Wenn Sie jedoch einige Vorsichtsmaßnahmen ergreifen, wird es nicht so schwierig. Die folgenden Richtlinien helfen Ihnen, die Angriffsfläche erheblich zu reduzieren.
Lesen Sie zuerst die Sicherheitsrichtlinien unter http://dev.mysql.com/doc/refman/5.7/en/security.html und prüfen Sie regelmäßig auf Updates. In letzter Zeit wurden mehrere schwerwiegende Schwachstellen für MySQL-RDBMS gefunden, für die frei verfügbare Exploits existieren. Nutzen Sie Updates, die neue Funktionen hinzufügen und, was noch wichtiger ist, Sicherheitslücken beheben.
Überwachen Sie regelmäßig Schwachdatenbanken. Seien Sie sich stets neu entdeckter Bedrohungen für Ihr System bewusst.
Betriebssystem
- Deaktivieren Sie unnötige Daemons und Dienste. Je weniger Komponenten Angreifer zugreifen können, desto geringer ist die Wahrscheinlichkeit, dass sie eine Schwachstelle finden, die genutzt werden kann, um auf das System zuzugreifen. Durch eine einfache Hostkonfiguration verringern Sie den Aufwand, der zur Verwaltung des Systems erforderlich ist, und minimieren das Risiko von Sicherheitslücken.
- Stellen Sie sicher, dass MySQL-Benutzer nicht auf Dateien außerhalb eines begrenzten Verzeichnisses zugreifen können. MySQL-Datendateien sollten nur von Root- oder Administrator-Konten gelesen werden dürfen.
- Deaktivieren oder beschränken Sie den Fernzugriff. Falls Ihr MySQL-Datenbank aus der Ferne zugänglich sein muss, konfigurieren Sie den GRANT-Befehl, der verwendet wird, um das Benutzerkonto einzurichten, so dass es SSL erfordert.
- Stellen Sie sicher, dass kein Benutzer außer dem MySQL-Benutzer MySQL-Konfigurations- und Protokolldateien lesen kann. Die Dateien my.cnf, my.ini und master.info enthalten häufig unverschlüsselte Benutzernamen und Passwörter. Falls eine Abfrageprotokolldatei vorhanden ist, enthält diese wahrscheinlich auch Passwörter. Einige MySQL-Konfigurationsdateien können auch Klartext-Benutzernamen und Passwörter enthalten. Stellen Sie sicher, dass diese Dateien vor unbefugten Benutzern geschützt sind.
- Führen Sie MySQL mit der –chroot-Option aus. Diese bietet eine hervorragende Milderung der Datei-Berechtigungen. Chroot wird verwendet, um den Datei-Zugriff eines Prozesses auf ein bestimmtes Verzeichnis zu beschränken. Auch mit der chroot-Option kann ein Angreifer, der Datei-Berechtigungen erlangt, alle MySQL-Daten lesen und wahrscheinlich weiterhin benutzerdefinierte Funktionen (UDFs) ausführen.
- Löschen Sie regelmäßig Ihre .mysql_history-Datei oder verlinken Sie diese dauerhaft zu /dev/null. Standardmäßig finden Sie auf Unix-Systemen eine .mysql_history-Datei in Ihrem Home-Verzeichnis. Diese enthält eine Protokollierung aller Abfragen, die Sie in den MySQL-Befehlszeilenclient getippt haben. Führen Sie den folgenden Befehl aus, um den Verlauf zu löschen:
cat /dev/null > ~/.mysql_history
Benutzer
Nachdem das Betriebssystem konfiguriert ist, müssen Sie ein Berechtigungsmodell erstellen und Benutzerkonten zuweisen.
- Entfernen Sie während der anfänglichen Einrichtung alle nicht root-MySQL-Benutzer, damit Sie wissen, welche Benutzer Zugriff auf die Datenbank haben. Der beste Weg ist, von Null zu beginnen und Benutzer nach Bedarf aufzubauen.
- Benennen Sie den Root-Benutzernamen um und ändern Sie das Passwort unter Verwendung verschiedener Zahlen und Zeichen. Sie können den Benutzernamen des Administrators mit dem folgenden Befehl in der MySQL-Konsole ändern:
mysql> RENAME USER root TO new_name;
- Gewähren Sie keine Kontoberechtigungen, die sie nicht wirklich benötigen, insbesondere File_priv, Grant_priv und Super_priv. Ziehen Sie in Erwägung, ein separates MySQL-Konto zu erstellen, das Ihre Anwendung für Interaktionen mit dem Dateisystem innerhalb von MySQL verwenden kann. Beachten Sie, dass dieser Benutzer Zugriff auf alle MySQL-Daten einschließlich Passwort-Hashes hat.
- Falls möglich, erstellen Sie für jede Webanwendung oder für jede Rolle innerhalb der Webanwendung einen MySQL-Benutzer. Weisen Sie innerhalb dieser Anwendung nur die erforderlichen Befehle zu. Dies kann mühsam erscheinen, macht jedoch Sinn, wenn es darum geht, ein umfassendes Sicherheitssystem einzurichten.
- Falls Fernverbindungen aktiviert sind, spezifizieren Sie REQUIRE SSL im GRANT-Befehl, der zur Einrichtung des Benutzers verwendet wird. Einige Exploit-Skripte funktionieren nicht, wenn sie keine SSL-Unterstützung haben. Darüber hinaus gewährleistet das SSL-Protokoll die Vertraulichkeit einer Passwortantwortsequenz. Sie können auch Einschränkungen basierend auf einem Client-Zertifikat festlegen, das verwendet wird, um sich mit SSL zu authentifizieren. Eine weitere nützliche Sicherheitsmaßnahme besteht darin, dass das Wissen eines Passworts nicht ausreicht, ein spezifiziertes Zertifikat wird ebenfalls benötigt.
- Geben Sie niemandem Zugriff auf die mysql.user.Tabelle (außer Benutzern mit Root-Rechten).
MySQL-Konfiguration
- Deaktivieren Sie den Befehl LOAD DATA LOCAL INFILE. Es ist eine Konstruktion, die hilft, lokale Dateien in eine Tabelle zu importieren und hat eine Besonderheit, die unter bestimmten Umständen zum Abruf des Inhalts der Datei /etc/passwd führen kann. Ein Exploit hierfür ist seit 2013 frei verfügbar. Fügen Sie set-variable=local-infile=0 in die my.cnf-Datei ein.
- Entfernen Sie unbenutzte benutzerdefinierte Funktionen (UDF). UDFs stellen ebenfalls Bedrohungen für die Datenbanksicherheit dar. Wenn Sie unbenutzte UDFs in der mysql.func-Tabelle sehen, entfernen Sie diese.
- Wenn Sie nur lokale Verbindungen verwenden und keine Remote-Hosts eine Verbindung zu MySQL herstellen müssen, deaktivieren Sie TCP/IP-Verbindungen über die –skip-networking-Option.
- Entfernen Sie die Test-Datenbank. Es gibt standardmäßig eine Test-Datenbank, auf die jeder zugreifen kann. Entfernen Sie diese oder beschränken Sie die Berechtigungen.
- Entfernen Sie anonyme Konten. Lassen Sie keine Benutzer mit leeren Passwörtern zurück.
Mit diesem Befehl finden Sie anonyme Benutzer:
select * from mysql.user where user=””;
- Stellen Sie sicher, dass der MySQL-Datenverkehr verschlüsselt ist.
- Aktivieren Sie die Protokollierung über die –log-Option. Laut MySQL-Dokumentation ist das allgemeine Abfrageprotokoll eine Debugging-Funktion, Sie können es jedoch auch als Sicherheitsmaßnahme verwenden. Es protokolliert erfolgreiche Verbindungen und ausgeführte Abfragen. Standardmäßig ist das Abfrageprotokoll deaktiviert, Sie können es mit der –log-Option aktivieren.
Beachten Sie, dass Abfrageprotokolle und Fehlerprotokolle auch eine Informationsquelle für einen Angreifer darstellen können. Stellen Sie sicher, dass die Protokolldatei nur für den Systemadministrator oder Root-Account sichtbar ist. Auch werden die Ergebnisse der Abfragen und abgerufenen Daten nicht protokolliert. Es gibt jedoch spezielle Datenbank-Aktivitätsüberwachungslösungen für diesen Zweck.
Überwachen Sie regelmäßig die Abfrageprotokolle und suchen Sie nach SQL-Injections-Angriffen und der Verwendung der Load_file-, Infile- und Outfile-Dateisystem-Befehle.
Installieren Sie Antivirus- und Antispam-Software. Setzen Sie eine Firewall ein, um den ein- und ausgehenden Netzwerkverkehr zu steuern und sich vor Angriffen zu schützen.
Ein umfassendes MySQL-Datenbanksicherheitssystem wird durch die Kombination einer Vielzahl von unauffälligen Konfigurationsänderungen aufgebaut. Jedes Detail ist wichtig. Es gibt keine Möglichkeit, 100% Sicherheit zu garantieren, aber das Streben nach maximalem Schutz ist in der Ära der Cyberkriminalität ein Muss.