Einige grundlegende Informationen, bevor wir loslegen:
Quelle:Oracle MySQL Community Server 5.7 des Center for Internet Security (CIS)
Betriebssystem: Windows 10
Wo ausführen: Befehlszeile
mysql -u USERNAME -p
Zielanwendung: Oracle MySQL Community-Server 5.7
Prüfung und Protokollierung für Informationssysteme
Protokolle spielen eine entscheidende Rolle für die Sicherheit, wenn ein Cyberangriff vermutet wird. Eine manuelle Überprüfung von Protokollen ist für das Sicherheitspersonal mühsam, und sie müssen Tools zur Protokollüberprüfung verwenden, um Informationen zu extrahieren und zu analysieren. Protokolle sollten eine WORM-Speichertechnologie (Write Once Read Many) und Verschlüsselung verwenden, um eine Beschädigung und den Verlust von Protokolldaten zu vermeiden. Außerdem sollten Protokolle ein standardisiertes Format haben, um die Wartung, den Zugriff und den Vergleich zu erleichtern.
Stellen Sie sicher, dass „log_error“ nicht leer ist
Befehl:
SHOW variables LIKE ‘log_error’;
Fehlerprotokolle enthalten Daten zu Ereignissen, wenn mysqld startet oder stoppt. Es zeigt auch, wann ein Tisch überprüft oder repariert werden muss. Es muss einen „Wert“ generieren. Der Grund für die Aktivierung der Fehlerprotokollierung liegt darin, dass sie dazu beiträgt, böswillige Versuche gegen MySQL und andere wichtige Nachrichten zu erkennen.
Stellen Sie sicher, dass Protokolldateien auf einer Nicht-Systempartition gespeichert werden
Befehl:
SELECT @@global.log_bin_basename;
Protokolldateien von MySQL können überall im Dateisystem gespeichert und über die MySQL-Konfiguration eingestellt werden. Außerdem ist es eine bewährte Methode, sicherzustellen, dass die Protokolle im Dateisystem nicht mit anderen Protokollen wie Anwendungsprotokollen überladen sind. Sie müssen sicherstellen, dass der zurückgegebene Wert nicht darauf hinweist, dass er sich im Stamm „(‚/‘)“, „/var“ oder „/usr“ befindet. Der Grund dafür ist, dass die Partitionierung die Wahrscheinlichkeit von Denial-of-Service verringert, wenn der verfügbare Speicherplatz für das Betriebssystem erschöpft ist.
Stellen Sie sicher, dass „log_error_verbosity“ nicht auf „1“ gesetzt ist
Befehl:
SHOW GLOBAL VARIABLES LIKE ‘log_error_verbosity’;
Diese Prüfung liefert zusätzliche Informationen darüber, welche Funktionalitäten das MySQL-Protokoll bei Fehlermeldungen hat oder aktiviert hat. Ein Wert von 1 aktiviert die Protokollierung von Fehlermeldungen. Ein Wert von 2 aktiviert sowohl die Protokollierung von Fehler- als auch von Warnmeldungen. Ein Wert von 3 aktiviert die Protokollierung von Fehler-, Warn- und Hinweismeldungen. Dies hilft, böswilliges Verhalten zu erkennen, indem Kommunikationsfehler und abgebrochene Verbindungen protokolliert werden.
Stellen Sie sicher, dass die Audit-Protokollierung aktiviert ist
Die Aktivierung der Überwachungsprotokollierung ist für die Produktionsumgebung für interaktive Benutzersitzungen und Anwendungssitzungen von entscheidender Bedeutung. Mit der Audit-Protokollierung hilft es zu erkennen, wer was wann geändert hat. Es kann auch helfen, herauszufinden, was ein Angreifer getan hat, und kann sogar als Beweismittel bei Ermittlungen verwendet werden.
Befehl:
SELECT NAME FROM performance_schema.setup_instruments WHERE NAME LIKE ‘%/alog/%’;
Befehl:
SET GLOBAL general_log = ‘ON’ ;
Befehl: ERSTELLEN SIE BENUTZER „user1“@„localhost“, IDENTIFIZIERT DURCH PASSWORT „not-so-secret“;
Den Pfad des Protokolls in Windows 10 finden Sie, indem Sie die Anwendung „Dienste“ verwenden, nachsehen, ob MySQL ausgeführt wird, und mit der rechten Maustaste auf „Eigenschaften“ klicken.
Das Log im System des Autors befand sich in:C:\ProgramData\MySQL\MySQL Server 5.7\Data\DJ-JASON-CLARK.log
Authentifizierung für Informationssystem
Die Authentifizierung stellt sicher, dass die vom Benutzer oder Computer bereitgestellten Anmeldeinformationen mit der Datenbank autorisierter Benutzer in einem lokalen Betriebssystem oder auf einem Authentifizierungsserver abgeglichen werden. Auf die Authentifizierung folgt dann die Autorisierung, die Benutzern oder Maschinen von einem Administrator erteilt wird. Eine Authentifizierung, die häufig sowohl in privaten als auch in öffentlichen Netzwerken verwendet wird, ist die passwortbasierte Authentifizierung.
Stellen Sie sicher, dass Passwörter nicht in der globalen Konfiguration gespeichert werden
Der Abschnitt [client] einer MySQL-Konfigurationsdatei ermöglicht die Erstellung eines Benutzers und eines Kennworts, die festgelegt werden können. Die Überprüfung ist wichtig, da das Zulassen eines Benutzers und Passworts in der Konfigurationsdatei die Vertraulichkeit des Benutzerpassworts negativ beeinflusst.
Öffnen Sie zur Prüfung die MySQL-Konfigurationsdatei und untersuchen Sie den Abschnitt [client] – es darf kein Passwort gespeichert sein. Im System des Autors wurde kein Passwort gesetzt (siehe Abbildung unten). Wenn in der Konfigurationsdatei ein Passwort gesetzt wurde, verwenden Sie mysql_config_editor, um Passwörter in verschlüsselter Form in .mylogin.cnf zu speichern.
Stellen Sie sicher, dass „sql_mode“ „NO_AUTO_CREATE_USER“ enthält
„no_auto_create_user“ ist eine Option, um die automatische Erstellung von Benutzern zu verhindern, wenn keine Authentifizierungsinformationen bereitgestellt werden.
Befehl:
SELECT @@global.sql_mode;
Befehl:
SELECT @@session.sql_mode;
Stellen Sie sicher, dass Passwörter für alle MySQL-Konten festgelegt sind
Ein Benutzer kann ein leeres Kennwort erstellen. Ein leeres Passwort zu haben ist riskant, da jeder einfach die Identität des Benutzers annehmen, die Anmelde-ID des Benutzers eingeben und sich mit dem Server verbinden kann. Dies umgeht die Authentifizierung, was schlecht ist.
Befehl:
SELECT User,host FROM mysql.user WHERE authentication_string=’’;
Stellen Sie sicher, dass „default_password_lifetime“ kleiner oder gleich „90“ ist
Das Ändern der Kennwortlebensdauer auf 90 Tage verringert die Zeit, die dem Angreifer zur Kompromittierung des Kennworts zur Verfügung steht, und verringert somit die Wahrscheinlichkeit, angegriffen zu werden.
Befehl:
SHOW VARIABLES LIKE ‘default_password_lifetime’;
Befehl:
SET GLOBAL default_password_lifetime=90;
Stellen Sie sicher, dass die Passwortkomplexität vorhanden ist
Die Passwortkomplexität erhöht die Sicherheit von Authentifizierungen und umfasst das Hinzufügen oder Erhöhen von Länge, Groß- und Kleinschreibung, Zahlen und Sonderzeichen. Je komplexer das Passwort, desto schwieriger ist es für Angreifer, mit Brute Force an das Passwort zu gelangen. Schwache Passwörter finden Sie leicht in einem Passwortwörterbuch.
Befehl:
SHOW VARIABLES LIKE ‘validate_password%’;
Stellen Sie sicher, dass keine Benutzer Wildcard-Hostnamen haben
Benutzern mit Wildcard-Hostnamen (%) wird die Berechtigung für jeden Standort gewährt. Es ist am besten, die Erstellung von Wildcard-Hostnamen zu vermeiden. Erstellen Sie stattdessen Benutzer und geben Sie ihnen bestimmte Standorte, von denen aus ein bestimmter Benutzer eine Verbindung zur Datenbank herstellen und mit ihr interagieren kann.
Befehl:
SELECT user, host FROM mysql.user WHERE host = ‘%’;
Stellen Sie sicher, dass keine anonymen Konten vorhanden sind
Benutzer können einen anonymen (leeren oder leeren) Benutzernamen haben. Diese anonymen Benutzernamen haben keine Passwörter und jeder andere Benutzer kann diesen anonymen Benutzernamen verwenden, um sich mit dem MySQL-Server zu verbinden. Das Entfernen dieser anonymen Konten stellt sicher, dass nur identifizierte und vertrauenswürdige Benutzer auf den MySQL-Server zugreifen können.
Befehl:
SELECT user,host FROM mysql.user WHERE user = ‘’;
Netzwerkverbindung zum MySQL-Server
Die Netzwerkverbindung spielt eine wichtige Rolle für die Kommunikation zwischen dem Benutzer und dem MySQL-Server. Unsichere Netzwerkverbindungen sind sehr anfällig für Angriffe. Im Folgenden finden Sie Überprüfungen für die Sicherheit der Netzwerkverbindung.
Stellen Sie sicher, dass „have_ssl“ auf „YES“ gesetzt ist
Um zu verhindern, dass böswillige Angreifer in Ihr System hineinspähen, verwenden Sie am besten SLL/TLS für den gesamten Netzwerkverkehr, wenn Sie nicht vertrauenswürdige Netzwerke verwenden.
Befehl:
WHERE variable_name = ‘have_ssl’;
Stellen Sie sicher, dass „ssl_type“ auf „ANY“, „X509“ gesetzt ist, oder 'SPECIFIED' für alle Remote-Benutzer
SSL/TLS sollte pro Benutzer konfiguriert werden. Dadurch wird das Abhören böswilliger Angreifer weiter verhindert.
Befehl:
SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN (‘::1’, ‘127.0.0.1’, ‘localhost’);
Replikation
Durch die Überprüfung des Replikationsstatus können Sie Leistungs- und Sicherheitslücken überwachen. Microsoft SQL Server Management Studio verfügt über die folgenden Tools zum Überwachen der Replikation:
- Snapshot-Agent-Status anzeigen,
- den Status des Protokollleseagenten anzeigen und
- Synchronisierungsstatus anzeigen.
Stellen Sie sicher, dass der Replikationsverkehr gesichert ist
Replikation Der Datenverkehr zwischen Servern muss gesichert werden. Während Replikationsübertragungen könnten Passwörter preisgegeben werden.
Überprüfen Sie zur Prüfung, ob sie Folgendes verwenden:ein privates Netzwerk, ein VPN, SSL/TLS oder einen SSH-Tunnel. Hoffentlich verwendet das System des Autors ein privates Netzwerk. Korrigieren Sie dies andernfalls und sichern Sie es, indem Sie das private Netzwerk, ein VPN, SSL/TLS oder einen SSH-Tunnel verwenden.
Stellen Sie sicher, dass „MASTER_SSL_VERIFY_SERVER_CERT“ auf „YES“ oder „1“ gesetzt ist
„MASTER_SSL_VERIFY_SERVER_CERT“ prüft, ob das Replikat das Zertifikat des Primärservers verifizieren soll oder nicht. Das Replikat sollte das Zertifikat des Primärservers überprüfen, um den Primärserver zu authentifizieren, bevor die Verbindung fortgesetzt wird.
Befehl:
SELECT ssl_verify_server_cert FROM mysql.slave_master_info;
Stellen Sie sicher, dass „master_info_repository“ auf „TABLE“ gesetzt ist
Das „master_info_repository“ bestimmt, wo das Replikat den Status und die Verbindungsinformationen des Primärservers protokolliert. Das Passwort wird im primären Info-Repository gespeichert, das eine reine Textdatei ist. Das Speichern des Passworts in der TABLE master_info ist sicherer.
Befehl:
SHOW GLOBAL VARIABLES LIKE ‘master_info_repository’;
Stellen Sie sicher, dass „super_priv“ für Replikationsbenutzer nicht auf „Y“ gesetzt ist
Die Das „SUPER“-Privileg („super_priv“), das sich in der „mysql.user“-Tabelle befindet, hat Funktionen wie „CHANGE“, „MASTER TO“, „KILL“, „mysqladmin kill“, „PURGE BINARY LOGS“, „SET GLOBAL“, „mysqladmin debug“ und andere Protokollierungssteuerelemente. Wenn Sie einem Benutzer das „SUPER“-Privileg erteilen, kann der Benutzer gerade ausgeführte SQL-Anweisungen anzeigen und beenden, sogar für die Kennwortverwaltung. Wenn der Angreifer das „SUPER“-Privileg ausnutzt und erlangt, kann er Protokolldaten deaktivieren, ändern oder zerstören.
Befehl:
SELECT user, host FROM mysql.user WHERE user=’repl’ and Super_priv = ‘Y’;
Stellen Sie sicher, dass keine Replikationsbenutzer Wildcard-Hostnamen haben
MySQL ermöglicht es Ihnen, Wildcard-Hostnamen Berechtigungen zu erteilen. Wildcard-Hostnamen sollten vermieden werden, und Sie sollten Benutzer erstellen oder ändern und ihnen bestimmte Orte zuweisen, von denen aus ein bestimmter Benutzer eine Verbindung zur Datenbank herstellen und mit ihr interagieren kann.
Schlussfolgerung
Die folgenden Prüfungen werden für eine einzelne Arbeitsumgebung durchgeführt, die MySQL als Informationssystem sowohl auf der Anwendungsseite als auch auf der Benutzerseite verwendet.
Die Bewertung ist zwingend erforderlich, um die standardmäßige Protokollierung von MySQL zu überprüfen und zusätzliche Protokollierungsfunktionen zu aktivieren (es ermöglicht auch die Überprüfung auf Schwachstellen bei der Authentifizierung). Netzwerkprüfungen sind wichtig, um zu verhindern, dass andere Benutzer mit böswilligen Absichten in Ihr Netzwerk hineinspähen. Implementieren Sie immer SSL/TLS zum Verschlüsseln. Eine sichere Übertragung in eine Richtung ist erforderlich. Das Sichern des Replikationsdatenverkehrs fügt eine Verteidigungsebene hinzu.
Das Ergebnis der Bewertung kann Ihnen Aufschluss darüber geben, ob das System auf einer Vertrauensebene betrieben werden kann.
Vielen Dank für das Lesen meines Blogs! Sie haben nun den Weg zur Sicherung Ihrer MySQL-Datenbank begonnen.=)