MySQL-Sicherheitspraktiken

MySQLBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie die Sicherheit Ihrer MySQL-Datenbank verbessern können. Wir werden wesentliche Sicherheitspraktiken behandeln, darunter das Festlegen eines Passworts für den root-Benutzer, das Erstellen dedizierter Benutzer nach dem Prinzip der geringsten Rechte (principle of least privilege), die Verwaltung von Benutzerberechtigungen und das Entfernen anonymer Konten. Am Ende dieses Labs werden Sie ein besseres Verständnis dafür haben, wie Sie Ihren MySQL-Server vor gängigen Schwachstellen schützen können.

Root-Konto absichern

Eine Standard-MySQL-Installation erlaubt oft dem root-Benutzer, sich von der lokalen Maschine aus ohne Passwort zu verbinden. Ihr erster Schritt zur Absicherung von MySQL ist das Festlegen eines starken Passworts für das root-Konto.

Öffnen Sie zuerst das Terminal auf Ihrem Desktop.

Verbinden Sie sich als root-Benutzer mit dem MySQL-Server. In dieser Lab-Umgebung können Sie sudo verwenden, um sich ohne Passwort zu verbinden.

sudo mysql -u root

Sobald Sie verbunden sind, sehen Sie die MySQL-Eingabeaufforderung (mysql>).

Legen Sie nun ein Passwort für den root-Benutzer fest. Die Anweisung ALTER USER wird verwendet, um Benutzerkonten zu ändern. Ersetzen Sie YourStrongPassword! durch ein Passwort Ihrer Wahl.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword!';

Dieser Befehl legt ein Passwort für den root-Benutzer fest, wenn er sich von localhost aus verbindet. Sie sollten die folgende Ausgabe sehen, die bestätigt, dass der Befehl erfolgreich war:

Query OK, 0 rows affected (0.01 sec)

Wenden Sie als Nächstes die Berechtigungsänderungen sofort mit dem Befehl FLUSH PRIVILEGES an.

FLUSH PRIVILEGES;

Die Ausgabe wird sein:

Query OK, 0 rows affected (0.00 sec)

Sie haben nun erfolgreich ein Passwort für den root-Benutzer festgelegt. Während Sie sich weiterhin mit sudo mysql -u root verbinden können, erfordert jeder direkte Verbindungsversuch mit mysql -u root -p nun das gerade festgelegte Passwort. Dies ist ein entscheidender erster Schritt zur Absicherung Ihrer Datenbank.

Dedizierten Benutzer und Datenbank erstellen

Die Verwendung des root-Kontos für Anwendungen stellt ein Sicherheitsrisiko dar, da es unbegrenzte Berechtigungen hat. Eine bewährte Methode ist die Erstellung dedizierter Benutzer mit eingeschränkten Berechtigungen für jede Anwendung. In diesem Schritt erstellen Sie eine neue Datenbank und einen Benutzer, der nur Zugriff auf diese Datenbank hat.

Erstellen Sie nun eine neue Datenbank für Ihre Anwendung. Nennen wir sie app_db.

CREATE DATABASE app_db;

Sie sollten diese Bestätigung sehen:

Query OK, 1 row affected (0.01 sec)

Erstellen Sie als Nächstes einen neuen Benutzer, den Ihre Anwendung zum Verbinden mit der Datenbank verwenden wird. Wir nennen diesen Benutzer app_user und weisen ihm ein Passwort zu.

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'UserPassword123';

Die Ausgabe wird sein:

Query OK, 0 rows affected (0.01 sec)

Gewähren Sie nun app_user die erforderlichen Berechtigungen. In diesem Beispiel gewähren wir SELECT- und INSERT-Berechtigungen für alle Tabellen innerhalb der Datenbank app_db. Dies folgt dem Prinzip der geringsten Rechte (principle of least privilege), indem dem Benutzer nur die benötigten Berechtigungen erteilt werden.

GRANT SELECT, INSERT ON app_db.* TO 'app_user'@'localhost';

Wenden Sie die Änderungen an, indem Sie die Berechtigungen leeren.

FLUSH PRIVILEGES;

Sie können die gerade erteilten Berechtigungen überprüfen, indem Sie Folgendes ausführen:

SHOW GRANTS FOR 'app_user'@'localhost';

Die Ausgabe zeigt die genauen Berechtigungen für app_user:

+------------------------------------------------------------------+
| Grants for app_user@localhost                                    |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                     |
| GRANT SELECT, INSERT ON `app_db`.* TO `app_user`@`localhost`     |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)

Sie haben erfolgreich eine dedizierte Datenbank und einen Benutzer mit entsprechenden Berechtigungen erstellt.

Benutzerberechtigungen verwalten

Anwendungsanforderungen können sich ändern, und Sie müssen möglicherweise die Benutzerberechtigungen entsprechend anpassen. In diesem Schritt üben Sie die Änderung von Berechtigungen, indem Sie eine bestehende Berechtigung von app_user widerrufen.

Nehmen wir an, app_user soll nun nur noch Daten lesen (SELECT) dürfen, aber keine neuen Daten hinzufügen (INSERT). Sie müssen die INSERT-Berechtigung widerrufen.

Verwenden Sie die Anweisung REVOKE, um die INSERT-Berechtigung von app_user für die Datenbank app_db zu entfernen.

REVOKE INSERT ON app_db.* FROM 'app_user'@'localhost';

Sie sehen die folgende Bestätigung:

Query OK, 0 rows affected (0.00 sec)

Wenden Sie die Änderungen an, indem Sie die Berechtigungen leeren.

FLUSH PRIVILEGES;

Überprüfen Sie nun, ob die Berechtigung widerrufen wurde, indem Sie die Grants des Benutzers erneut prüfen.

SHOW GRANTS FOR 'app_user'@'localhost';

Die Ausgabe sollte nun zeigen, dass app_user nur die SELECT-Berechtigung für app_db hat. Die INSERT-Berechtigung ist entfernt worden.

+--------------------------------------------------------------+
| Grants for app_user@localhost                                |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                 |
| GRANT SELECT ON `app_db`.* TO `app_user`@`localhost`         |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

Dies zeigt, wie Benutzerberechtigungen effektiv verwaltet werden können, um sich an sich ändernde Sicherheitsanforderungen anzupassen.

Anonyme Benutzerkonten entfernen

Standardmäßig erstellen einige MySQL-Installationen anonyme Benutzerkonten, die einen leeren Benutzernamen haben. Diese Konten stellen ein Sicherheitsrisiko dar, da sie unbefugten Zugriff ermöglichen können. Es ist eine kritische Sicherheitspraxis, nach ihnen zu suchen und sie zu entfernen, falls sie vorhanden sind.

Sie können anonyme Benutzer identifizieren, indem Sie die Tabelle mysql.user nach Einträgen mit einem leeren Benutzernamen abfragen.

SELECT User, Host FROM mysql.user WHERE User = '';

Wenn anonyme Benutzer vorhanden sind, listet diese Abfrage sie auf. Eine frische Installation auf Ubuntu kann einen enthalten, aber neuere Versionen von MySQL/MariaDB haben oft standardmäßig keine anonymen Benutzer.

Wenn Sie Ergebnisse wie diese sehen:

+------+-----------+
| User | Host      |
+------+-----------+
|      | localhost |
+------+-----------+
1 row in set (0.00 sec)

Dann sollten Sie den anonymen Benutzer mit der Anweisung DROP USER entfernen und sowohl den Benutzernamen (der ein leerer String '' ist) als auch den Host angeben:

DROP USER ''@'localhost';

Sie sollten diese Bestätigung sehen:

Query OK, 0 rows affected (0.01 sec)

Wenn Ihre Abfrage jedoch ein leeres Set zurückgibt, wie zum Beispiel:

Empty set (0.00 sec)

Bedeutet dies, dass keine anonymen Benutzer in Ihrer Datenbank vorhanden sind, was bereits sicher ist. In diesem Fall erhalten Sie einen Fehler, wenn Sie versuchen, einen nicht vorhandenen anonymen Benutzer zu löschen:

ERROR 1396 (HY000): Operation DROP USER failed for ''@'localhost'

Dieser Fehler ist zu erwarten, wenn kein anonymer Benutzer vorhanden ist, und Sie können sicher fortfahren.

Nachdem Sie nach anonymen Benutzern gesucht und diese gegebenenfalls entfernt haben, leeren Sie die Berechtigungen, um sicherzustellen, dass alle Änderungen angewendet werden:

FLUSH PRIVILEGES;

Überprüfen Sie erneut, ob keine anonymen Benutzer mehr vorhanden sind, indem Sie die SELECT-Abfrage ausführen:

SELECT User, Host FROM mysql.user WHERE User = '';

Diese Abfrage sollte ein leeres Set zurückgeben und bestätigen, dass keine anonymen Benutzer vorhanden sind:

Empty set (0.00 sec)

Sie haben erfolgreich nach einer potenziellen Sicherheitslücke auf Ihrem Server gesucht und diese behoben. Sie können nun die MySQL-Shell verlassen.

exit;

Zusammenfassung

In diesem Lab haben Sie mehrere wesentliche MySQL-Sicherheitspraktiken gelernt und angewendet. Sie haben erfolgreich das root-Konto mit einem Passwort gesichert, einen dedizierten Anwendungsbenutzer mit eingeschränkten Berechtigungen basierend auf dem Prinzip der geringsten Rechte (least privilege) erstellt, den Benutzerzugriff durch Widerruf von Berechtigungen verwaltet und potenzielle anonyme Benutzerkonten überprüft und behoben.

Durch die Implementierung dieser grundlegenden Sicherheitsmaßnahmen können Sie die Sicherheit Ihrer MySQL-Datenbank erheblich verbessern und sie vor unbefugtem Zugriff und potenziellen Bedrohungen schützen.