Best Practices zur Absicherung der MySQL Server-Sicherheitskonfigurationen

Schützen Sie Ihre kritischen MySQL-Bereitstellungen mit diesem umfassenden Leitfaden zu den wichtigsten Best Practices zur Sicherheitshärtung. Erfahren Sie, wie Sie eine robuste Benutzer- und Zugriffsverwaltung implementieren, Netzwerkverbindungen mit Firewalls und SSL/TLS absichern, `my.cnf` für optimale Sicherheit feinabstimmen und Schutzmaßnahmen auf Betriebssystemebene anwenden. Entdecken Sie praktische Konfigurationstipps und umsetzbare Schritte, um gängige Schwachstellen zu mindern, unbefugten Zugriff zu verhindern und die Integrität sowie Vertraulichkeit Ihrer Datenbank zu gewährleisten. Ein Muss für jeden, der für die MySQL-Sicherheit verantwortlich ist.

34 Aufrufe

Best Practices zur Härtung der Sicherheitskonfigurationen von MySQL-Servern

MySQL ist ein Eckpfeiler für unzählige Anwendungen und treibt alles von kleinen Blogs bis hin zu massiven Unternehmenssystemen an. Seine Beliebtheit, obwohl ein Beweis für seine Robustheit und Flexibilität, macht es auch zu einem häufigen Ziel für böswillige Akteure. Ein falsch konfigurierter oder nicht gehärteter MySQL-Server kann eine erhebliche Schwachstelle darstellen, sensible Daten preisgeben und ein Einfallstor für unbefugten Zugriff auf Ihre gesamte Infrastruktur bieten. Der Schutz Ihrer MySQL-Bereitstellung ist keine einmalige Aufgabe, sondern eine kontinuierliche Verpflichtung, die Wachsamkeit und die Einhaltung von Sicherheitspraktiken erfordert.

Dieser Artikel bietet einen umfassenden Leitfaden zu wesentlichen Konfigurationstipps und Maßnahmen zur Sicherheitsstärkung. Wir werden uns mit verschiedenen Sicherheitsebenen befassen, von der Benutzerverwaltung und Netzwerksicherheit bis hin zu Anpassungen der Konfigurationsdatei und Überlegungen zum Betriebssystem. Durch die Implementierung dieser Empfehlungen können Sie die Angriffsfläche Ihres MySQL-Servers erheblich reduzieren und eine widerstandsfähigere Datenbankumgebung gegen gängige Schwachstellen und unbefugte Zugriffsversuche aufbauen.

1. Benutzer- und Zugriffsverwaltung: Das Prinzip der geringsten Rechte (Least Privilege)

Eine effektive Benutzerverwaltung ist die Grundlage für die MySQL-Sicherheit. Benutzern nur die Berechtigungen zu erteilen, die sie unbedingt benötigen, ist von größter Bedeutung.

Erstellen Sie spezifische Benutzer für spezifische Anwendungen

Vermeiden Sie die Verwendung des root-Benutzers für Anwendungsverbindungen. Erstellen Sie stattdessen dedizierte Benutzer mit granularen Berechtigungen.

CREATE USER 'my_app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `your_database`.* TO 'my_app_user'@'localhost';
FLUSH PRIVILEGES;

Erzwingen Sie starke Passwörter

Starke, eindeutige Passwörter sind Ihre erste Verteidigungslinie. Nutzen Sie das integrierte Passwortvalidierungs-Plugin von MySQL, sofern verfügbar.

  • Komplexität: Mischen Sie Groß- und Kleinbuchstaben, Zahlen und Symbole.
  • Länge: Streben Sie mindestens 12-16 Zeichen an.
  • Einzigartigkeit: Verwenden Sie niemals Passwörter wieder.
  • Rotation: Implementieren Sie eine Richtlinie für regelmäßige Passwortänderungen.

Sie können die Komponente validate_password (MySQL 8.0+) oder das Plugin (MySQL 5.7+) aktivieren:

INSTALL COMPONENT 'file://component_validate_password';
-- ODER für ältere Versionen
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

-- Konfigurieren Sie die Stärkepolitik (z. B. MEDIUM für 8+ Zeichen, Mischung aus Groß-/Kleinbuchstaben, Zahlen, Sonderzeichen)
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;

Standard- und ungenutzte Benutzer entfernen

MySQL wird mit Standardbenutzern ausgeliefert (z. B. root@localhost). Obwohl root@localhost notwendig ist, stellen Sie sicher, dass er ein starkes Passwort hat. Entfernen oder sichern Sie insbesondere andere Standardbenutzer wie mysql.session, mysql.sys und den anonymen Benutzer, falls diese nicht explizit benötigt und ordnungsgemäß konfiguriert sind.

-- Um anonyme Benutzer zu identifizieren:
SELECT user, host FROM mysql.user WHERE user = '';
-- Um einen anonymen Benutzer zu löschen (falls gefunden):
DROP USER ''@'localhost';

-- Um Testdatenbanken zu entfernen (falls sie existieren):
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;

Host-Zugriff beschränken

Beschränken Sie Benutzerkonten so, dass sie sich nur von bestimmten IP-Adressen oder Hostnamen aus verbinden können. Vermeiden Sie die Verwendung von % als Platzhalter für den Host, es sei denn, dies ist unbedingt erforderlich und wird mit anderen starken Sicherheitskontrollen kombiniert.

-- Benutzer kann sich nur von localhost verbinden
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AnotherStrongPass!';

-- Benutzer kann sich nur von einer bestimmten IP-Adresse verbinden
CREATE USER 'backup_user'@'192.168.1.100' IDENTIFIED BY 'BackupPass!';

Seien Sie vorsichtig mit GRANT OPTION

The WITH GRANT OPTION-Klausel erlaubt es einem Benutzer, seine eigenen Berechtigungen an andere Benutzer zu vergeben. Dies kann ein erhebliches Sicherheitsrisiko darstellen, wenn es nicht vertrauenswürdigen Benutzern erteilt wird. Verwenden Sie es sparsam und nur für Administratorkonten, die diese Funktion wirklich benötigen.

-- Ein Benutzer mit der Befugnis, Berechtigungen zu vergeben (mit äußerster Vorsicht verwenden)
GRANT ALL PRIVILEGES ON *.* TO 'superadmin'@'localhost' IDENTIFIED BY 'SuperAdminPass!' WITH GRANT OPTION;

2. Netzwerksicherheit: Isolieren Ihrer Datenbank

Netzwerkebene-Kontrollen sind entscheidend, um unbefugten externen Zugriff auf Ihren MySQL-Server zu verhindern.

Firewalls konfigurieren

Erlauben Sie Verbindungen zum Standardport von MySQL (3306) nur von vertrauenswürdigen IP-Adressen oder Netzwerken. Blockieren Sie alle anderen eingehenden Verbindungen zu diesem Port.

Beispiel (UFW unter Linux):

sudo ufw enable
sudo ufw allow from 192.168.1.0/24 to any port 3306
sudo ufw deny 3306
sudo ufw status

Beispiel (CentOS/RHEL mit firewalld):

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --permanent --remove-port=3306/tcp --zone=public # Sicherstellen, dass er nicht global geöffnet ist
sudo firewall-cmd --reload

Verbindungen mit SSL/TLS absichern

Verschlüsseln Sie den gesamten Datenverkehr zwischen Clients und dem MySQL-Server mithilfe von SSL/TLS, um Lauschangriffe und Man-in-the-Middle (MitM)-Angriffe zu verhindern. Dies ist besonders wichtig für Verbindungen über nicht vertrauenswürdige Netzwerke.

Um SSL/TLS zu aktivieren, müssen Sie in der Regel SSL-Zertifikate und Schlüssel generieren und dann Ihre my.cnf konfigurieren:

# my.cnf
[mysqld]
ssl_ca=/etc/mysql/certs/ca.pem
ssl_cert=/etc/mysql/certs/server-cert.pem
ssl_key=/etc/mysql/certs/server-key.pem

Clients sollten dann so konfiguriert werden, dass sie SSL/TLS verwenden, oft mit REQUIRE SSL in der GRANT-Anweisung des Benutzers:

CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'SSLUserPass!';
GRANT SELECT ON `your_database`.* TO 'ssl_user'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;

An spezifische IP-Adressen binden

Standardmäßig lauscht MySQL möglicherweise auf allen verfügbaren Netzwerkschnittstellen (0.0.0.0). Beschränken Sie es so, dass es nur auf den Schnittstellen lauscht, die Verbindungen akzeptieren müssen (z. B. localhost für lokale Anwendungen oder eine private Netzwerk-IP für interne Verbindungen).

# my.cnf
[mysqld]
bind-address = 127.0.0.1  # Nur für lokale Verbindungen
# ODER
bind-address = 192.168.1.10  # Für eine bestimmte interne IP

Tipp: Wenn sich Ihre Anwendung und Ihr MySQL-Server auf demselben Computer befinden, ist bind-address = 127.0.0.1 (localhost) die sicherste Option, da sie jegliche externen Verbindungen vollständig verhindert.

3. Härtung der Konfigurationsdatei (my.cnf / my.ini)

Die MySQL-Konfigurationsdatei (my.cnf unter Linux, my.ini unter Windows) bietet zahlreiche Parameter zur Verbesserung der Sicherheit.

Deaktivieren Sie ungenutzte Funktionen

Minimieren Sie die Angriffsfläche, indem Sie Funktionen deaktivieren, die für Ihre Bereitstellung nicht erforderlich sind.

  • local_infile = 0: Verhindert, dass Clients den Server auffordern, Daten aus beliebigen Dateien auf dem Server-Host zu laden. Dies ist ein häufiger Vektor für die Datenexfiltration.
    ini [mysqld] local_infile = 0
  • skip-networking: Wenn Ihre Datenbank nur von Anwendungen auf demselben Server abgerufen wird, deaktivieren Sie das Netzwerk vollständig. Dies zwingt alle Verbindungen, den Unix-Socket oder benannte Pipes zu verwenden.
    ini [mysqld] skip-networking
  • symbolic-links = 0: Verhindert die Verwendung von symbolischen Links für Datenbank-Tablespaces, die ausgenutzt werden könnten, um auf Dateien außerhalb des MySQL-Datenverzeichnisses zuzugreifen.
    ini [mysqld] symbolic-links = 0
  • secure_file_priv: Beschränkt die Verzeichnisse, aus denen Dateien von Funktionen wie LOAD DATA INFILE und SELECT ... INTO OUTFILE gelesen und geschrieben werden können.
    ```ini
    [mysqld]
    secure_file_priv = "/var/lib/mysql-files" # Auf ein bestimmtes, eingeschränktes Verzeichnis setzen
    # ODER
    # secure_file_priv = "