Zum Inhalt springen

Mysql/Benutzer

Aus Foxwiki

Mysql/Benutzer


Benutzer anlegen

Bei der Installation wird ein root-Benutzerkonto erstellt

  • Volle Rechte auf dem MySQL-Server
  • Vollständigen Zugriff über alle Datenbanken, Tabellen, Benutzer, ...
  • DARF NUR für Verwaltungsfunktionen eingesetzt werden
auth_socket

Seit MySQL 5.7

  • Root-Benutzer verwendet das auth_socket-Plug-in, statt sich mit einem Passwort zu authentifizieren
  • Dieses Plugin erfordert, dass der Name des Betriebssystembenutzers, der den MySQL-Client aufruft, mit dem Namen des im Befehl angegebenen MySQL-Benutzers übereinstimmt

Das bedeutet, dass Sie dem mysql-Befehl sudo voranstellen müssen, um ihn mit den Rechten des root-Ubuntu-Benutzers aufzurufen, damit Sie Zugriff auf den MySQL-Root erhalten

sudo mysql
Hinweis
Wenn Ihr root MySQL-Benutzer so konfiguriert ist, dass er sich mit einem Passwort authentifiziert, müssen Sie einen anderen Befehl verwenden, um auf die MySQL-Shell zuzugreifen

Mit dem folgenden Befehl wird Ihr MySQL-Client mit normalen Benutzerrechten ausgeführt, und Sie erhalten nur dann Administratorrechte in der Datenbank, wenn Sie sich mit dem richtigen Passwort authentifizieren

mysql -u root -p

Sobald Sie Zugriff auf die MySQL-Eingabeaufforderung haben, können Sie einen neuen Benutzer mit einer CREATE USER-Anweisung erstellen

Allgemeinen Syntax

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

Nach CREATE USER geben Sie einen Benutzernamen an

  • Direkt danach folgt ein @-Zeichen und dann der Hostname, von dem aus sich dieser Benutzer verbinden wird
  • Wenn Sie diesen Benutzer nur lokal von Ihrem Ubuntu-Server aus ansprechen wollen, können Sie localhost angeben
  • Es ist nicht immer notwendig, sowohl den Benutzernamen als auch den Host in einfache Anführungszeichen zu setzen, aber es kann helfen, Fehler zu vermeiden

Bei der Auswahl des Plugins für die Benutzerauthentifizierung haben Sie mehrere Möglichkeiten

  • Das bereits erwähnte auth_socket-Plugin kann praktisch sein, da es starke Sicherheit bietet, ohne dass gültige Benutzer ein Passwort eingeben müssen, um auf die Datenbank zuzugreifen
  • Aber es verhindert auch Remote-Verbindungen, was die Sache verkomplizieren kann, wenn externe Programme mit MySQL interagieren müssen

Als Alternative können Sie den WITH Teil der Syntax ganz weglassen, um den Benutzer mit dem Standard-Plugin von MySQL, caching_sha2_password, zu authentifizieren

  • Die MySQL-Dokumentation empfiehlt dieses Plugin für Benutzer, die sich mit einem Passwort anmelden wollen, da es starke Sicherheitsfunktionen bietet

Führen Sie den folgenden Befehl aus, um einen Benutzer zu erstellen, der sich mit caching_sha2_password authentifiziert. Ändern Sie in Ihren bevorzugten Benutzernamen und in ein sicheres Passwort Ihrer Wahl

CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
Hinweis
Es gibt ein bekanntes Problem mit einigen PHP-Versionen, das Probleme mit caching_sha2_password verursacht
  • Wenn Sie diese Datenbank mit einer PHP-Anwendung - zum Beispiel phpMyAdmin - verwenden wollen, sollten Sie stattdessen einen Benutzer anlegen, der sich mit dem älteren, aber immer noch sicheren mysql_native_password-Plugin authentifiziert
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Wenn Sie sich nicht sicher sind, können Sie immer einen Benutzer erstellen, der sich mit caching_sha2_plugin authentifiziert und ihn dann später mit diesem Befehl ALTERN

ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Nachdem Sie den neuen Benutzer erstellt haben, können Sie ihm die entsprechenden Berechtigungen erteilen

Berechtigungen erteilen

Allgemeine Syntax
GRANT PRIVILEGE ON database.table TO 'username'@'host';

Der Wert in dieser Beispielsyntax definiert, welche Aktionen der Benutzer auf der angegebenen und durchführen darf

  • Sie können demselben Benutzer mehrere Berechtigungen in einem Befehl erteilen, indem Sie die einzelnen Befehle durch ein Komma trennen
  • Sie können einem Benutzer auch global Privilegien erteilen, indem Sie Sternchen (*) anstelle der Datenbank- und Tabellennamen eingeben
  • In SQL sind Sternchen Sonderzeichen, die für "alle" Datenbanken oder Tabellen stehen

Zur Veranschaulichung: Der folgende Befehl gewährt einem Benutzer globale Berechtigungen zum CREATE, ALTER und DROP von Datenbanken, Tabellen und Benutzern sowie die Befugnis zum INSERT, UPDATE und DELETE von Daten aus jeder Tabelle auf dem Server

  • Es gibt dem Benutzer auch die Möglichkeit, Daten mit SELECT abzufragen, Fremdschlüssel mit dem REFERENCES Schlüsselwort zu erstellen und FLUSH Operationen mit dem RELOAD Privileg durchzuführen
  • Sie sollten den Benutzern jedoch nur die Berechtigungen erteilen, die sie benötigen, daher können Sie die Berechtigungen Ihrer eigenen Benutzer nach Bedarf anpassen

Sie können die vollständige Liste der verfügbaren Rechte in der offiziellen MySQL-Dokumentation finden

Führen Sie diese GRANT-Anweisung aus und ersetzen Sie durch den Namen Ihres eigenen MySQL-Benutzers, um Ihrem Benutzer diese Rechte zu gewähren

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

Beachten Sie, dass diese Anweisung auch WITH GRANT OPTION enthält

  • Damit kann Ihr MySQL-Benutzer anderen Benutzern im System alle Rechte erteilen, die er hat
Warnung
Einige Benutzer möchten ihrem MySQL-Benutzer vielleicht das ALL PRIVILEGES-Recht gewähren, was ihnen weitreichende Superuser-Rechte ähnlich denen des root-Benutzers gibt, etwa so
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

Solch weitreichende Privilegien sollten nicht leichtfertig vergeben werden, da jeder, der Zugriff auf diesen MySQL-Benutzer hat, die vollständige Kontrolle über jede Datenbank auf dem Server hat

In vielen Handbüchern wird empfohlen, den Befehl FLUSH PRIVILEGES unmittelbar nach einer CREATE USER- oder GRANT-Anweisung auszuführen, um die Berechtigungstabellen neu zu laden und sicherzustellen, dass die neuen Berechtigungen in Kraft gesetzt werden

FLUSH PRIVILEGES;

Laut der offiziellen MySQL-Dokumentation wird die Datenbank jedoch, wenn Sie die Berechtigungstabellen indirekt mit einer Kontoverwaltungsanweisung wie GRANT ändern, die Berechtigungstabellen sofort wieder in den Speicher laden, was bedeutet, dass der Befehl FLUSH PRIVILEGES in unserem Fall nicht notwendig ist

  • Andererseits hat die Ausführung des Befehls keine negativen Auswirkungen auf das System

Wenn Sie eine Genehmigung widerrufen müssen, ist die Struktur fast identisch mit der Erteilung der Genehmigung

REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';

Beachten Sie, dass beim Entzug von Berechtigungen die Syntax verlangt, dass Sie FROM verwenden, anstatt TO, das Sie beim Erteilen der Berechtigungen verwendet haben

Sie können die aktuellen Berechtigungen eines Benutzers überprüfen, indem Sie den Befehl SHOW GRANTS ausführen

SHOW GRANTS FOR 'username'@'host';

Genauso wie Sie Datenbanken mit DROP löschen können, können Sie DROP verwenden, um einen Benutzer zu löschen

DROP USER 'username'@'localhost';

Nachdem Sie Ihren MySQL-Benutzer erstellt und ihm Rechte gewährt haben, können Sie den MySQL-Client beenden

exit

Um sich in Zukunft als Ihr neuer MySQL-Benutzer anzumelden, verwenden Sie einen Befehl wie den folgenden

mysql -u sammy -p

Das -p-Flag veranlasst den MySQL-Client, Sie nach dem Passwort Ihres MySQL-Benutzers zu fragen, um sich zu authentifizieren

Benutzer entfernen

Um einen MySQL-Benutzer zu entfernen, können Sie den Befehl DROP USER verwenden

Die Syntax für diesen Befehl lautet wie folgt

DROP USER 'username'@'host';

Ersetzen Sie durch den tatsächlichen Benutzernamen, den Sie entfernen möchten, und durch den Hostnamen oder die IP-Adresse, von der aus sich der Benutzer verbinden kann

Um etwa einen Benutzer namens "sammy" zu entfernen, der sich von "localhost" aus verbinden kann, würden Sie Folgendes verwenden

DROP USER 'sammy'@'localhost';

Nach der Ausführung dieses Befehls wird der angegebene Benutzer vom MySQL-Server entfernt

  • Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann
  • Verwenden Sie diesen Befehl daher mit Vorsicht und nur, wenn Sie sicher sind, dass Sie den Benutzer entfernen möchten

Es ist auch wichtig zu wissen, dass Sie einen Benutzer, der derzeit mit dem MySQL-Server verbunden ist, nicht entfernen können

  • Wenn Sie dies versuchen, erhalten Sie eine Fehlermeldung, die besagt, dass der Benutzer noch verbunden ist
  • Sie müssen die Verbindung des Benutzers trennen, bevor Sie versuchen, ihn zu entfernen

Problembehebung

Zugriff wegen Benutzerfehler verweigert

Der Fehler Zugriff für Benutzer verweigert tritt typischerweise auf, wenn ein Benutzer versucht, eine Verbindung zu einer MySQL-Datenbank mit falschen Anmeldeinformationen oder unzureichenden Rechten herzustellen

  • Dieser Fehler kann frustrierend sein, lässt sich aber in der Regel leicht beheben, indem die Anmeldeinformationen und Berechtigungen des Benutzers überprüft und angepasst werden

Gehen Sie folgendermaßen vor, um diesen Fehler zu beheben

Überprüfen Sie die Anmeldedaten des Benutzers

Stellen Sie sicher, dass der Benutzername, das Passwort und der Host korrekt sind. Überprüfen Sie, ob der Benutzername und das Kennwort richtig geschrieben sind und ob der Host auf den richtigen Wert gesetzt ist (z. B. "localhost", "%" oder eine bestimmte IP-Adresse)

Privilegien prüfen

Vergewissern Sie sich, dass der Benutzer über die notwendigen Rechte für den Zugriff auf die Datenbank verfügt

  • Sie können dies tun, indem Sie den Befehl SHOW GRANTS ausführen, um die aktuellen Berechtigungen des Benutzers zu überprüfen
SHOW GRANTS FOR 'username'@'localhost';

Dadurch werden die dem Benutzer derzeit gewährten Rechte angezeigt

  • Wenn der Benutzer nicht über die erforderlichen Berechtigungen verfügt, können Sie diese mit dem Befehl GRANT erteilen
Spezifischer Datenbank- oder Tabellenzugriff

Wenn der Benutzer versucht, auf eine bestimmte Datenbank oder Tabelle zuzugreifen, vergewissern Sie sich, dass dem Benutzer Berechtigungen für diese spezielle Datenbank oder Tabelle gewährt wurden

Beispiel
Rechte für eine bestimmte Datenbank gewähren
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';

Oder, um Privilegien für eine bestimmte Tabelle zu gewähren

GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.table_name TO 'username'@'localhost';

Wenn Sie diese Schritte befolgen, sollten Sie in der Lage sein, den Fehler Zugriff für Benutzer verweigert zu beheben und sicherzustellen, dass der Benutzer den erforderlichen Zugriff auf die MySQL-Datenbank hat

Benutzer kann sich nicht aus der Ferne verbinden

Um Remote-Verbindungen für einen Benutzer zu ermöglichen, stellen Sie sicher, dass das Benutzerkonto so konfiguriert ist, dass es Verbindungen von einem bestimmten Host oder einer IP-Adresse zulässt

  • Dies kann geschehen, indem Sie dem Benutzer mit dem richtigen Hostnamen oder der richtigen IP-Adresse Berechtigungen erteilen
Beispiel
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';

Dies gewährt dem Benutzer 'username' alle Privilegien von einem beliebigen Rechner (%)

Fehler 1396: Operation CREATE USER fehlgeschlagen

Der Fehler 1396 tritt typischerweise auf, wenn versucht wird, einen bereits existierenden Benutzer zu erstellen

  • Um diesen Fehler zu beheben, stellen Sie sicher, dass der Benutzer nicht bereits in der MySQL-Datenbank vorhanden ist
  • Wenn der Benutzer existiert, können Sie versuchen, das bestehende Benutzerkonto zu ändern, anstatt ein neues zu erstellen
  • Wenn Sie einen neuen Benutzer mit demselben Namen erstellen möchten, können Sie zuerst den bestehenden Benutzer löschen und dann den neuen erstellen

Wenn Sie beispielsweise versuchen, einen Benutzer namens "newuser" zu erstellen, aber die Fehlermeldung 1396 erscheint, können Sie zunächst mit dem folgenden Befehl überprüfen, ob der Benutzer bereits existiert

SELECT * FROM mysql.user WHERE User = 'newuser';

Wenn der Benutzer existiert, können Sie das bestehende Benutzerkonto mit dem folgenden Befehl löschen

DROP USER 'newuser'@'%';

Nachdem Sie den bestehenden Benutzer gelöscht haben, können Sie das neue Benutzerkonto mit dem folgenden Befehl erstellen

CREATE USER 'newuser'@'%' IDENTIFIED BY 'password';

Root-Passwort zurücksetzen

Wenn Sie über Administrator-/sudo-Zugriff auf Ihren Server verfügen, können Sie das MySQL-Root-Passwort zurücksetzen, indem Sie die Berechtigungstabellen umgehen

1. MySQL-Dienst anhalten
sudo systemctl stop mysql
2. MySQL ohne Passwortüberprüfung starten
sudo mysqld_safe --skip-grant-tables &
3. An MySQL anmelden

root ohne Passwort

mysql -u root
4. Privilegien aktualisieren

Bearbeitung ermöglichen

FLUSH PRIVILEGES;
5. Neues Passwort setzen
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YOUR_NEW_PASSWORD';
6. MySQL normal neu starten
sudo systemctl restart mysql



Anhang

Siehe auch



Dokumentation

Projekt