
Das Ausführen deiner gesamten MySQL-Instanz unter dem Root-Konto ist das Datenbankäquivalent dazu, die Vordertür deines Servers unverschlossen zu lassen. Hier erfährst du, wie du Benutzer mit den richtigen Berechtigungen erstellst und nicht mehr.
Voraussetzungen: MySQL-Zugriff und Einrichtung
Du benötigst eine bestehende MySQL-Installation und die Möglichkeit, dich als Root oder als Benutzer mit GRANT OPTION-Berechtigungen anzumelden:
mysql -u root -pGib dein Root-Passwort ein, wenn du dazu aufgefordert wirst. Von hier aus kannst du Benutzer erstellen, Berechtigungen zuweisen und die gesamte Zugriffskontrollebene verwalten.
Wie man einen MySQL-Benutzer erstellt
CREATE USER-Anweisungssyntax
Die vollständige Syntax zum Erstellen eines MySQL-Benutzers:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';Der Host-Teil steuert, woher Verbindungen kommen können. localhost schränkt auf nur auf lokale Verbindungen ein. % erlaubt Verbindungen von jedem Host. Du kannst auch eine IP-Adresse oder ein Subnetz angeben.
Einen Benutzer mit einem Passwort erstellen
Erstelle einen lokalen Benutzer mit dem Namen appuser:
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';Unter MySQL 8.0+ ist das Standard-Authentifizierungs-Plugin caching_sha2_password. Ältere Clients benötigen möglicherweise stattdessen mysql_native_password:
CREATE USER 'appuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'StrongPassword123!';Einen Benutzer für den Remote-Zugriff erstellen
Erlaube Verbindungen von jedem Host, indem du % als Hostwert verwendest:
CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'RemotePassword456!';Für eine strengere Kontrolle beschränke dich auf eine bestimmte IP:
CREATE USER 'remoteuser'@'192.168.1.100' IDENTIFIED BY 'RemotePassword456!';Wie Berechtigungen in MySQL gewährt werden
Alle Berechtigungen für eine Datenbank gewähren
Gewähre einem Benutzer vollen Zugriff auf eine bestimmte Datenbank:
GRANT ALL PRIVILEGES ON mydatabase.* TO 'appuser'@'localhost';Die *.*-Syntax gewährt Berechtigungen für alle Datenbanken, was du nur für Administratorkonten verwenden solltest.
Spezifische Berechtigungen gewähren
Das Prinzip der geringsten Berechtigung ist der richtige Ansatz. Ein Benutzer für schreibgeschützte Berichterstattung benötigt nur SELECT:
GRANT SELECT ON mydatabase.* TO 'readonly_user'@'localhost';Eine Anwendung, die nur Datensätze liest und schreibt:
GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'appuser'@'localhost';Zu den verfügbaren Berechtigungen gehören: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE und mehr.
Anwenden von Berechtigungsänderungen mit FLUSH PRIVILEGES
Nach dem Vergeben der Berechtigungen solltest du die Grant-Tabellen neu laden, damit die Änderungen sofort wirksam werden:
FLUSH PRIVILEGES;MySQL 8.0 wendet GRANT und REVOKE automatisch an, aber die Ausführung von FLUSH PRIVILEGES ist immer noch eine gute Praxis, wenn Systemtabellen direkt geändert werden.
Wie man gewährte Berechtigungen anzeigt
Überprüfe, welche Berechtigungen ein Benutzer derzeit hat:
SHOW GRANTS FOR 'appuser'@'localhost';Für den aktuell angemeldeten Benutzer:
SHOW GRANTS FOR CURRENT_USER();Wie man MySQL-Benutzer widerruft und entfernt
Widerrufen spezifischer Berechtigungen
Schreibzugriff entfernen und Lesezugriff beibehalten:
REVOKE INSERT, UPDATE, DELETE ON mydatabase.* FROM 'appuser'@'localhost';Dann die Änderungen laden:
FLUSH PRIVILEGES;Einen MySQL-Benutzeraccount löschen
Einen Benutzer vollständig entfernen:
DROP USER 'appuser'@'localhost';Dadurch werden das Benutzerkonto und alle damit verbundenen Berechtigungen entfernt. Überprüfe, ob der Benutzer entfernt wurde:
SELECT User, Host FROM mysql.user;Best Practices für die MySQL-Benutzersicherheit
- Verwende niemals das Root-Konto für Anwendungsverbindungen. Erstelle dedizierte Benutzer pro Anwendung.
- Gewähre nur die Berechtigungen, die die Anwendung tatsächlich benötigt. Ein CMS benötigt SELECT, INSERT, UPDATE, DELETE. Es braucht weder DROP noch ALTER.
- Verwende starke, einzigartige Passwörter. Speichere sie in Umgebungsvariablen oder einem Secrets-Manager, nicht im Code.
- Zugriffsrechte auf Hosts einschränken. Verwende nach Möglichkeit localhost oder eine bestimmte IP anstelle von %.
- Überprüfe deine Benutzerliste regelmäßig: SELECT User, Host FROM mysql.user
FAQ: MySQL Benutzer erstellen
Führe Folgendes aus: CREATE USER ‚Benutzername’@’localhost‘ IDENTIFIED BY ‚passwort‘; Gewähre dann die entsprechenden Berechtigungen mit GRANT … ON datenbank.* TO ‚benutzername’@’localhost‘;
Führe Folgendes aus: GRANT ALL PRIVILEGES ON databasename.* TO ‚username’@’host‘; Führe anschliessend FLUSH PRIVILEGES; aus, um die Änderungen sofort wirksam zu machen.
Führe Folgendes aus: SHOW GRANTS FOR ‚username’@’host‘; Dadurch werden alle Berechtigungen aufgelistet, die diesem Benutzer zugewiesen sind.
Führe Folgendes aus: REVOKE privilege_type ON database.* FROM ‚username’@’host‘; Gib genau an, welche Berechtigungen entfernt werden sollen. Danach FLUSH PRIVILEGES;