Bewährte Methoden zur Härtung der MySQL-Server-Sicherheitskonfigurationen
Härten Sie MySQL mit Benutzern mit minimalen Rechten, Host-Einschränkungen, TLS, sichereren my.cnf-Einstellungen, Patchen und grundlegendem Auditing.
Bewährte Methoden zur Härtung der MySQL-Server-Sicherheitskonfigurationen
Die Härtung von MySQL beginnt mit einer einfachen Frage: Was würde ein Angreifer gewinnen, wenn ein Anwendungspasswort durchsickert? Wenn die Antwort "jede Datenbank von überall" lautet, benötigt Ihr Server strengere Benutzer, Netzwerkregeln und Konfigurationen.
Nutzen Sie diese Praktiken, um die Auswirkungen eines Kompromisses zu reduzieren, ohne die tägliche Verwaltung zu erschweren.
1. Benutzer- und Zugriffsverwaltung: Das Prinzip der geringsten Privilegien
Eine effektive Benutzerverwaltung ist grundlegend für die MySQL-Sicherheit. Gewähren Sie Benutzern nur die Berechtigungen, die sie unbedingt benötigen.
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';
Erzwingen Sie starke Passwörter
Starke, einzigartige Passwörter sind Ihre erste Verteidigungslinie. Nutzen Sie das integrierte Passwort-Validierungs-Plugin von MySQL, falls verfügbar.
- Komplexität: Mischen Sie Großbuchstaben, 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 validate_password-Komponente (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ärkerichtlinie (z.B. MEDIUM für 8+ Zeichen, gemischte Groß-/Kleinschreibung, Zahlen, Sonderzeichen)
SET GLOBAL validate_password.policy = MEDIUM;
SET GLOBAL validate_password.length = 12;
Entfernen Sie Standard- und ungenutzte Benutzer
MySQL kann administrative und interne Konten enthalten. Behalten Sie erforderliche Systemkonten wie mysql.session und mysql.sys bei, entfernen Sie jedoch anonyme Konten sowie alle menschlichen oder Anwendungskonten, die Sie nicht mehr verwenden.
-- 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 vorhanden):
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;
Beschränken Sie den Host-Zugriff
Beschränken Sie Benutzerkonten so, dass sie nur von bestimmten IP-Adressen oder Hostnamen aus eine Verbindung herstellen können. Vermeiden Sie die Verwendung von % als Platzhalter für den Host, es sei denn, es ist unbedingt erforderlich und mit anderen starken Sicherheitskontrollen gekoppelt.
-- Benutzer kann nur von localhost aus verbinden
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AnotherStrongPass!';
-- Benutzer kann nur von einer bestimmten IP-Adresse aus verbinden
CREATE USER 'backup_user'@'192.168.1.100' IDENTIFIED BY 'BackupPass!';
Seien Sie vorsichtig mit GRANT OPTION
Die WITH GRANT OPTION-Klausel erlaubt es einem Benutzer, seine eigenen Berechtigungen an andere Benutzer weiterzugeben. Dies kann ein erhebliches Sicherheitsrisiko darstellen, wenn es nicht vertrauenswürdigen Benutzern gewährt wird. Verwenden Sie es sparsam und nur für Administrationskonten, die diese Fähigkeit tatsächlich benötigen.
-- Ein Benutzer mit der Fähigkeit, Berechtigungen zu vergeben (mit äußerster Vorsicht verwenden)
CREATE USER 'superadmin'@'localhost' IDENTIFIED BY 'SuperAdminPass!';
GRANT ALL PRIVILEGES ON *.* TO 'superadmin'@'localhost' WITH GRANT OPTION;
2. Netzwerksicherheit: Isolieren Sie Ihre Datenbank
Netzwerkebenenkontrollen sind entscheidend, um unbefugten externen Zugriff auf Ihren MySQL-Server zu verhindern.
Konfigurieren Sie Firewalls
Erlauben Sie Verbindungen zum MySQL-Standardport (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 # Stellen Sie sicher, dass es nicht global geöffnet ist
sudo firewall-cmd --reload
Sichern Sie Verbindungen mit SSL/TLS
Verschlüsseln Sie den gesamten Datenverkehr zwischen Clients und dem MySQL-Server mit SSL/TLS, um Lauschangriffe und Man-in-the-Middle-Angriffe (MitM) zu verhindern. Dies ist besonders wichtig für Verbindungen über unsichere 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 eine Verbindung mit SSL/TLS herstellen, 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;
Binden Sie an bestimmte IP-Adressen
Standardmäßig hört MySQL möglicherweise auf allen verfügbaren Netzwerkschnittstellen (0.0.0.0). Beschränken Sie es so, dass es nur auf den Schnittstellen hört, 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 Ihre Anwendung und der MySQL-Server auf demselben Rechner laufen, 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: DeaktiviertLOAD DATA LOCAL INFILE, das andernfalls Dateien vom Client-Host lesen kann, wenn sowohl Client als auch Server dies zulassen.[mysqld] local_infile = 0skip-networking: Wenn Ihre Datenbank nur von Anwendungen auf demselben Server aus zugegriffen wird, deaktivieren Sie die Netzwerkfunktion vollständig. Dies erzwingt, dass alle Verbindungen den Unix-Socket oder Named Pipes verwenden.[mysqld] skip-networkingsymbolic-links = 0: Verhindert die Verwendung von symbolischen Links für Datenbank-Tablespaces, die ausgenutzt werden können, um auf Dateien außerhalb des MySQL-Datenverzeichnisses zuzugreifen.[mysqld] symbolic-links = 0secure_file_priv: Beschränkt das Verzeichnis, das für Dateiimport- und -exportoperationen wieLOAD DATA INFILEundSELECT ... INTO OUTFILEverwendet wird.[mysqld] secure_file_priv = /var/lib/mysql-files
Setzen Sie secure_file_priv auf ein dediziertes Verzeichnis, das dem MySQL-Dienstkonto gehört. Zeigen Sie nicht auf /tmp, ein Anwendungs-Upload-Verzeichnis oder einen Pfad, in den nicht vertrauenswürdige Benutzer schreiben können.
Vermeiden Sie Klartext-Geheimnisse in Optionsdateien
Client-Optionsdateien können versehentlich Datenbank-Passwörter für jeden offenlegen, der sie lesen kann. Wenn Sie Anmeldeinformationen für die Automatisierung speichern müssen, schränken Sie die Dateiberechtigungen ein und verwenden Sie ein dediziertes Konto mit niedrigen Privilegien.
chmod 600 /home/backup/.my.cnf
chown backup:backup /home/backup/.my.cnf
Für die interaktive Verwaltung bevorzugen Sie die Eingabeaufforderung für das Passwort:
mysql -u admin -p
4. Patchen und Überprüfen Sie den Server
Sicherheitskonfiguration wird einen nicht gepatchten Server nicht retten. Halten Sie MySQL, Client-Bibliotheken und das Betriebssystem durch Ihren normalen Paket- oder Anbieteraktualisierungsprozess auf dem neuesten Stand.
Nachdem Sie my.cnf geändert haben, validieren und starten Sie während eines Wartungsfensters neu:
mysqld --validate-config
sudo systemctl restart mysql
sudo systemctl status mysql
Paketnamen und Dienstnamen variieren je nach Distribution. Einige Systeme verwenden mysqld anstelle von mysql.
5. Überwachen Sie den Zugriff und überprüfen Sie Berechtigungen
Die Härtung ist nach dem ersten Durchlauf nicht abgeschlossen. Überprüfen Sie Konten und Berechtigungen regelmäßig, insbesondere nach Anwendungsänderungen oder Personalwechseln.
SELECT user, host, account_locked FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'my_app_user'@'localhost';
Achten Sie auf Konten, die %-Hosts, breite *.*-Berechtigungen, FILE, SUPER, SYSTEM_USER oder WITH GRANT OPTION verwenden. Diese Berechtigungen können für eine kleine Anzahl von Administrationskonten gültig sein, sollten aber niemals bei routinemäßigen Anwendungsbenutzern auftauchen.
Fazit
Härten Sie MySQL in Schichten. Beginnen Sie mit dedizierten Benutzern mit minimalen Rechten, beschränken Sie, von wo aus sie eine Verbindung herstellen können, verschlüsseln Sie den Datenverkehr, wenn er ein Netzwerk durchquert, deaktivieren Sie riskante Funktionen, die Sie nicht verwenden, und halten Sie den Server gepatcht. Planen Sie dann regelmäßige Berechtigungsüberprüfungen ein, damit alter Zugriff nicht stillschweigend zu Ihrem nächsten Vorfall wird.