Einführung
In der professionellen Systemadministration ist es ein erhebliches Sicherheitsrisiko, für alltägliche Verbindungen von Anwendungen den Benutzer root zu verwenden. Wenn ein Angreifer eine Anwendung kompromittiert, die das Root-Konto verwendet, erhält er vollständige Kontrolle über jede Datenbank auf dem Server.
Als bewährte Vorgehensweise sollte jede Anwendung einen eigenen dedizierten Benutzer mit Berechtigungen erhalten, die ausschließlich auf die eigene dedizierte Datenbank beschränkt sind.
Das entspricht auf Datenbankebene der Trennung von Anwendungsidentitäten auf Betriebssystemebene. Die Zugriffskontrolle sollte sich am Zweck und nicht nur an der Bequemlichkeit orientieren.
Dies ist die Datenbankvariante des Prinzips der geringsten Rechte, das Sie bereits bei der Verwaltung von Linux-Benutzern kennengelernt haben. Wird ein Anwendungskonto kompromittiert, begrenzen die eingeschränkten Berechtigungen den möglichen Schaden.
In diesem Lab sichern Sie Ihre Umgebung mit den folgenden Standardverfahren ab:
- Erstellen Sie eine neue Datenbank für eine beispielhafte Anwendung.
- Erstellen Sie ein eigenes Benutzerkonto für diese Anwendung.
- Erteilen Sie dem Benutzer nur für seine spezifische Datenbank Berechtigungen.
- Überprüfen Sie die Einrichtung, indem Sie sich als der neue Benutzer anmelden.
Eine neue Datenbank erstellen
Melden Sie sich zunächst mit administrativen Berechtigungen am MySQL-Server an, um die neue Datenbank zu erstellen.
Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus, um auf die MySQL-Shell zuzugreifen:
sudo mysql
Hinweis: Mit dem Befehl
sudoauthentifizieren Sie sich über den System-Socket als root. Wenn Sie zur Eingabe eines Passworts aufgefordert werden, das Sie nicht kennen, versuchen Sie es mitmysql -u root -p.
Sobald die Eingabeaufforderung mysql> angezeigt wird, können Sie SQL-Befehle ausführen.
Zu diesem Zeitpunkt sind Sie als administrativer Datenbankbenutzer verbunden, da das Erstellen von Datenbanken eine privilegierte Operation ist. Normale Anwendungskonten verfügen in der Regel nicht über diese weitreichenden Berechtigungen.
Erstellen Sie eine neue Datenbank mit dem Namen app_db. Sie dient als Container für die Daten der Anwendung.
CREATE DATABASE app_db;
Bei erfolgreicher Ausführung antwortet MySQL mit Query OK. Überprüfen Sie, ob die Datenbank vorhanden ist, indem Sie alle Datenbanken auflisten:
SHOW DATABASES;
In der Liste sollte app_db angezeigt werden.
Einen dedizierten Benutzer erstellen
Nachdem die Datenbank vorhanden ist, benötigen Sie einen Benutzer für ihre Verwaltung. Erstellen Sie einen Benutzer mit dem Namen app_user.
Führen Sie in derselben MySQL-Shell den folgenden Befehl aus:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';
Aufschlüsselung des Befehls:
'app_user': Der Benutzername.'@'localhost': Beschränkt den Benutzer darauf, sich nur von diesem Server aus zu verbinden. Das ist eine Sicherheitsmaßnahme.IDENTIFIED BY 'password': Legt das Passwort auf „password“ fest.
Zu diesem Zeitpunkt existiert der Benutzer, hat aber keine Berechtigungen. Er kann sich anmelden, aber keine Daten lesen oder schreiben.
Dieses Sicherheitsmodell ist wichtig: Identität und Berechtigungen sind getrennt. Das Erstellen eines Kontos gewährt nicht automatisch Zugriff auf jedes Datenbankobjekt.
Überprüfen Sie, ob der Benutzer vorhanden ist, indem Sie die Systemtabelle der Benutzer abfragen:
SELECT User, Host FROM mysql.user WHERE User = 'app_user';
Berechtigungen erteilen
Erteilen Sie nun app_user ausdrücklich die Berechtigung, app_db zu verwenden.
Gewähren Sie unserem Benutzer ALL-Berechtigungen für app_db, also zum Lesen, Schreiben und Ändern von Tabellen.
Führen Sie diesen Befehl in der MySQL-Shell aus:
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
Aufschlüsselung der Syntax:
GRANT ALL PRIVILEGES: Gewährt vollständige Zugriffsrechte.ON app_db.*: Wendet diese Rechte auf die Datenbankapp_dbund auf*, also alle darin enthaltenen Tabellen, an.TO 'app_user'@'localhost': Gibt an, wem diese Rechte erteilt werden.
Das Muster database.* ist wichtig, weil Berechtigungen auf bestimmte Bereiche beschränkt werden können. In MySQL/MariaDB lassen sich Rechte global, pro Datenbank, pro Tabelle und teilweise noch feiner abgestuft vergeben.
Damit verfügt app_user innerhalb von app_db über weitreichende Rechte, außerhalb dieser Datenbank jedoch über keine entsprechenden Rechte.
Bestätigen Sie, dass die Berechtigungen korrekt zugewiesen wurden:
SHOW GRANTS FOR 'app_user'@'localhost';
Den Benutzerzugriff überprüfen
Um sicherzustellen, dass alles wie erwartet funktioniert, melden Sie sich vom Root-Konto ab und anschließend als der neue Benutzer an.
Beenden Sie zuerst die Root-Sitzung:
EXIT;
Melden Sie sich anschließend wieder im Linux-Terminal als app_user an:
mysql -u app_user -p
Geben Sie bei der Aufforderung das Passwort password ein.
Prüfen Sie nach der Anmeldung, welche Datenbanken Sie sehen können:
SHOW DATABASES;
Darauf sollten Sie achten:
- Sie sollten
app_dbundinformation_schemasehen. - Sie sollten
mysqlodersysnicht sehen.
Damit ist bestätigt, dass Ihre Berechtigungseinstellungen korrekt funktionieren: Der Benutzer sieht nur die Datenbanken, auf die er zugreifen darf.
Dieser Überprüfungsschritt ist bei der Zugriffskontrolle entscheidend. Es reicht nicht aus, eine GRANT-Anweisung auszuführen. Sie sollten bestätigen, dass die resultierende Sicht auf das System Ihrem beabsichtigten Design mit geringsten Rechten entspricht.
Wechseln Sie zum Abschluss des Labs in Ihre Datenbank:
USE app_db;
EXIT;
Zusammenfassung
In diesem Lab haben Sie erfolgreich ein sicheres Modell für den Datenbankzugriff umgesetzt. Sie haben gelernt:
- Eine neue Datenbank (
app_db) zu erstellen. - Einen dedizierten Benutzer (
app_user) zu erstellen. - Mit dem Befehl
GRANTgezielte Berechtigungen zu erteilen. - Zu überprüfen, ob die Zugriffskontrollen wie vorgesehen funktionieren.
Dieses Modell der „geringsten Rechte“ ist ein grundlegender Bestandteil der Datenbanksicherheit und sollte für jede von Ihnen bereitgestellte Anwendung verwendet werden.



