Bewährte Methoden zum Erteilen und Entziehen von MySQL-Benutzerberechtigungen

Verwenden Sie MySQL GRANT, REVOKE, SHOW GRANTS und DROP USER sicher mit Beispielen für das Prinzip der geringsten Privilegien für Anwendungs- und Administratorkonten.

Bewährte Methoden zum Erteilen und Entziehen von MySQL-Benutzerberechtigungen

MySQL-Berechtigungen legen fest, was Ihre Anwendungen, Tools und Administratoren nach dem Verbinden tun können. Ein einziges Konto mit umfassendem Zugriff kann einen kleinen Fehler oder ein durchgesickertes Passwort in eine vollständige Datenbank-Offenlegung verwandeln.

Verwenden Sie GRANT, REVOKE und SHOW GRANTS mit dem Prinzip der geringsten Privilegien: Jedes Konto sollte nur die Berechtigungen haben, die es benötigt, und zwar nur von den Hosts, die es verwendet.

MySQL-Berechtigungen verstehen

Bevor wir uns mit GRANT und REVOKE befassen, ist es wichtig, die verschiedenen Bereiche und Arten von Berechtigungen in MySQL zu verstehen. Berechtigungen definieren, welche Aktionen ein Benutzer ausführen darf und auf welche Datenbankobjekte.

MySQL-Berechtigungen können nach ihrem Geltungsbereich kategorisiert werden:

  • Globale Berechtigungen (*.*): Gelten für alle Datenbanken und Tabellen auf dem MySQL-Server. Beispiele sind SUPER, PROCESS, RELOAD, CREATE USER.
  • Datenbankberechtigungen (datenbank_name.*): Gelten für alle Tabellen und Objekte innerhalb einer bestimmten Datenbank. Beispiele sind SELECT, INSERT, UPDATE, DELETE, CREATE, DROP.
  • Tabellenberechtigungen (datenbank_name.tabellen_name): Gelten für alle Spalten innerhalb einer bestimmten Tabelle. Beispiele sind SELECT, INSERT, UPDATE, DELETE, ALTER.
  • Spaltenberechtigungen (datenbank_name.tabellen_name.spalten_name): Gelten für bestimmte Spalten innerhalb einer Tabelle. Dies ist weniger verbreitet, aber nützlich für eine hochgradig granulare Kontrolle.
  • Routinenberechtigungen (datenbank_name.routinen_name): Gelten für gespeicherte Prozeduren und Funktionen und steuern EXECUTE und ALTER ROUTINE.
  • Proxy-Berechtigungen: Erlauben einem Benutzer, als ein anderer zu handeln, nützlich für Anwendungen, die Benutzeridentitäten verwalten.

Einige häufige spezifische Berechtigungen umfassen:

  • SELECT: Daten aus Tabellen lesen.
  • INSERT: Neue Zeilen zu Tabellen hinzufügen.
  • UPDATE: Vorhandene Zeilen in Tabellen ändern.
  • DELETE: Zeilen aus Tabellen entfernen.
  • CREATE: Datenbanken, Tabellen oder Indizes erstellen.
  • DROP: Datenbanken, Tabellen oder Indizes löschen.
  • ALTER: Tabellenstrukturen ändern.
  • INDEX: Indizes erstellen oder löschen.
  • REFERENCES: Fremdschlüssel-Constraints festlegen.
  • CREATE VIEW, SHOW VIEW: Ansichten verwalten.
  • CREATE ROUTINE, ALTER ROUTINE, EXECUTE: Gespeicherte Prozeduren und Funktionen verwalten und ausführen.
  • FILE: Dateien auf dem Server-Host lesen oder schreiben (sehr mächtig, mit äußerster Vorsicht verwenden).
  • GRANT OPTION: Erlaubt einem Benutzer, seine eigenen Berechtigungen an andere Benutzer zu vergeben. Dies ist eine sehr mächtige Berechtigung und sollte sparsam vergeben werden.

Der GRANT-Befehl: Berechtigungen sicher erteilen

Der GRANT-Befehl wird verwendet, um einem MySQL-Benutzer Berechtigungen zuzuweisen. Beim Erteilen von Berechtigungen ist es entscheidend, das Prinzip der geringsten Privilegien zu beachten – nur das zu gewähren, was unbedingt notwendig ist.

Grundlegende Syntax

Die allgemeine Syntax für den GRANT-Befehl lautet:

GRANT berechtigungen ON objekt TO 'benutzer'@'host' [WITH GRANT OPTION];
  • berechtigungen: Eine durch Kommas getrennte Liste von Berechtigungen (z. B. SELECT, INSERT).
  • objekt: Gibt den Geltungsbereich an (z. B. *.* für global, datenbank_name.*, datenbank_name.tabellen_name).
  • 'benutzer'@'host': Das Benutzerkonto, einschließlich des Benutzernamens und des Hosts, von dem aus es eine Verbindung herstellen kann. Der host kann eine IP-Adresse, ein Hostname oder ein Platzhalter sein (% für jeden Host, localhost für lokale Verbindungen).
  • WITH GRANT OPTION: (Optional) Erlaubt dem Benutzer, die angegebenen Berechtigungen an andere Benutzer zu vergeben.

Erstellen oder ändern Sie Passwörter mit CREATE USER und ALTER USER. Ältere MySQL-Versionen erlaubten GRANT ... IDENTIFIED BY, aber die moderne MySQL-Syntax hält die Kontenerstellung getrennt.

Praktische Beispiele

Lassen Sie uns einige häufige Szenarien durchgehen.

  1. Erstellen eines neuen Benutzers und Gewähren von globalem Nur-Lese-Zugriff (stark abgeraten)

    CREATE USER 'global_reader'@'localhost' IDENTIFIED BY 'StrongPass123!';
    GRANT SELECT ON *.* TO 'global_reader'@'localhost';
    

    Warnung: Das Gewähren von SELECT auf *.* gibt Zugriff auf alle Datenbanken und Tabellen. Dies ist im Allgemeinen zu weit gefasst für Anwendungsbenutzer und sollte vermieden werden, es sei denn, es ist für bestimmte administrative Aufgaben unbedingt erforderlich.

  2. Gewähren von vollem Zugriff auf eine bestimmte Datenbank für einen Anwendungsbenutzer

    Ein häufiges Szenario für einen Anwendungsbenutzer, der Daten innerhalb seiner eigenen Datenbank verwalten muss.

    CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppPassSecure!';
    GRANT SELECT, INSERT, UPDATE, DELETE ON `myapp_db`.* TO 'app_user'@'localhost';
    

    Hier kann app_user grundlegende CRUD-Operationen nur innerhalb der myapp_db-Datenbank durchführen, aber keine neuen Tabellen erstellen oder das Schema ändern.

  3. Gewähren von Nur-Lese-Zugriff auf eine bestimmte Tabelle

    Für ein Berichtstool, das nur aus einer bestimmten Tabelle lesen muss.

    CREATE USER 'report_tool'@'%' IDENTIFIED BY 'ReportSecret!';
    GRANT SELECT ON `sales_db`.`orders` TO 'report_tool'@'%';
    

    Der Host '%' erlaubt dem report_tool, sich von jedem Host zu verbinden, jedoch nur mit SELECT-Zugriff auf die Tabelle orders in sales_db.

  4. Gewähren von GRANT OPTION (mit äußerster Vorsicht verwenden)

    Wenn ein Administrator die Berechtigungsverwaltung für eine bestimmte Datenbank delegieren muss.

    CREATE USER 'db_admin'@'localhost' IDENTIFIED BY 'AdminPass#456';
    GRANT ALL PRIVILEGES ON `inventory_db`.* TO 'db_admin'@'localhost' WITH GRANT OPTION;
    

    Der db_admin kann nun beliebige Berechtigungen auf inventory_db an andere Benutzer vergeben. Dies ist eine mächtige Berechtigung, die die zentrale Kontrolle umgeht und nur verwendet werden sollte, wenn es unvermeidbar ist.

Tipps zum Erteilen von Berechtigungen

  • Prinzip der geringsten Privilegien: Gewähren Sie immer den minimalen Satz von Berechtigungen, der für einen Benutzer oder eine Anwendung erforderlich ist, um zu funktionieren. Vermeiden Sie ALL PRIVILEGES, es sei denn, es handelt sich um ein dediziertes Datenbankadministratorkonto.
  • Bestimmte Hosts: Beschränken Sie Benutzerverbindungen auf bestimmte IP-Adressen oder Hostnamen ('benutzer'@'192.168.1.10' oder 'benutzer'@'appserver.example.com') anstelle von '%', wo möglich.
  • Getrennte Benutzer: Erstellen Sie separate Benutzerkonten für verschiedene Anwendungen oder Dienste, selbst wenn sie auf dieselbe Datenbank zugreifen. Dies isoliert potenzielle Sicherheitsverletzungen.
  • Kein root für Anwendungen: Verwenden Sie niemals das root-Benutzerkonto für Ihre Anwendungen. Erstellen Sie dedizierte Benutzer mit geringsten Privilegien.

Der REVOKE-Befehl: Berechtigungen effektiv entziehen

Der REVOKE-Befehl wird verwendet, um Berechtigungen von einem MySQL-Benutzer zu entfernen. Er ist genauso wichtig wie GRANT, um eine sichere Datenbankumgebung aufrechtzuerhalten, insbesondere wenn sich Rollen ändern oder Anwendungen außer Betrieb genommen werden.

Grundlegende Syntax

Die allgemeine Syntax für den REVOKE-Befehl lautet:

REVOKE berechtigungen ON objekt FROM 'benutzer'@'host';
  • berechtigungen: Eine durch Kommas getrennte Liste von zu entziehenden Berechtigungen.
  • objekt: Der Geltungsbereich, von dem entzogen werden soll (muss mit dem Geltungsbereich übereinstimmen, in dem die Berechtigungen erteilt wurden).
  • 'benutzer'@'host': Das Benutzerkonto, dem die Berechtigungen entzogen werden sollen.

Praktische Beispiele

  1. Entziehen der DELETE-Berechtigung von einem Anwendungsbenutzer

    Wenn eine Anwendung keine Daten mehr löschen muss oder Sie ihre Berechtigungen herabsetzen möchten.

    REVOKE DELETE ON `myapp_db`.* FROM 'app_user'@'localhost';
    

    Jetzt kann app_user weiterhin SELECT, INSERT und UPDATE ausführen, aber nicht DELETE innerhalb von myapp_db.

  2. Entziehen der GRANT OPTION von einem delegierten Administrator

    Wenn db_admin nicht mehr die Berechtigungen anderer Benutzer für inventory_db verwalten muss.

    REVOKE GRANT OPTION ON `inventory_db`.* FROM 'db_admin'@'localhost';
    

    Hinweis: Um GRANT OPTION zu entziehen, müssen Sie explizit GRANT OPTION in der REVOKE-Anweisung angeben.

  3. Entziehen aller Berechtigungen auf einer bestimmten Datenbank

    Um alle Berechtigungen zu entfernen, die ein Benutzer auf einer bestimmten Datenbank hat.

    REVOKE ALL PRIVILEGES ON `old_db`.* FROM 'old_app'@'%';
    

    Warnung: REVOKE ALL PRIVILEGES auf *.* entzieht alle globalen Berechtigungen, was SUPER, CREATE USER usw. umfassen kann. Seien Sie vorsichtig bei der globalen Verwendung dieses Geltungsbereichs.

  4. Löschen eines Benutzerkontos

    Wenn ein Benutzer oder eine Anwendung nicht mehr benötigt wird, ist es am besten, den Benutzer vollständig zu entfernen.

    DROP USER 'report_tool'@'%';
    

    Dieser Befehl entfernt den Benutzer und alle seine zugehörigen Berechtigungen.

Tipps zum Entziehen von Berechtigungen

  • Geltungsbereich abgleichen: Stellen Sie beim Entziehen sicher, dass der Objektbereich (*.*, datenbank_name.* usw.) genau mit der ursprünglichen Erteilung der Berechtigung übereinstimmt. Wenn Sie SELECT auf datenbank_name.* gewährt haben, müssen Sie es von datenbank_name.* entziehen, nicht von datenbank_name.tabellen_name.
  • Überprüfen: Verwenden Sie immer SHOW GRANTS FOR 'benutzer'@'host'; nach dem Erteilen oder Entziehen von Berechtigungen, um die Änderungen zu bestätigen.
  • Überflüssige Flushes vermeiden: FLUSH PRIVILEGES wird nach GRANT, REVOKE, CREATE USER oder DROP USER nicht benötigt; MySQL wendet diese Anweisungen sofort an.
  • Kaskadeneffekte berücksichtigen: Wenn ein Benutzer mit GRANT OPTION anderen Berechtigungen erteilt hat, entzieht das Entziehen seiner GRANT OPTION nicht automatisch die von ihm erteilten Berechtigungen. Sie müssten diese separat entziehen.

Bewährte Methoden für die Verwaltung von MySQL-Benutzerberechtigungen

Die Implementierung einer robusten Berechtigungsverwaltungsstrategie ist entscheidend für die Datenbanksicherheit.

1. Prinzip der geringsten Privilegien (PoLP)

Dies ist die goldene Regel. Gewähren Sie nur die absolut minimalen Berechtigungen, die ein Benutzer oder eine Anwendung benötigt, um seine/ihre beabsichtigte Funktion auszuführen. Zum Beispiel:

  • Ein Berichtstool benötigt SELECT.
  • Eine Webanwendung benötigt typischerweise SELECT, INSERT, UPDATE, DELETE.
  • Ein ETL-Prozess benötigt möglicherweise INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE (aber nur auf bestimmten Staging-Schemas).

2. Dedizierte Benutzerkonten

  • Geteilte Konten vermeiden: Jede Anwendung, jeder Dienst oder jeder administrative Benutzer sollte sein eigenes eindeutiges MySQL-Benutzerkonto haben. Dies hilft bei der Überwachung und Nachverfolgung von Aktivitäten.
  • Kein root für Anwendungen: Konfigurieren Sie Ihre Anwendungen niemals so, dass sie sich als root-Benutzer verbinden. Der root-Benutzer hat uneingeschränkten Zugriff und sollte nur für kritische administrative Aufgaben durch menschliche Administratoren verwendet werden.

3. Starke Passwörter und Passwortrotation

  • Erzwingen Sie starke, eindeutige Passwörter für alle MySQL-Benutzerkonten. Nutzen Sie gegebenenfalls die Passwortvalidierungs-Plugins von MySQL.
  • Implementieren Sie eine regelmäßige Passwortrotationsrichtlinie, insbesondere für Konten mit hohen Berechtigungen.

4. Host-Einschränkungen

  • Beschränken Sie Benutzerverbindungen nach Möglichkeit auf bestimmte IP-Adressen oder Hostnamen. Ersetzen Sie '%' durch localhost, die IP eines Anwendungsservers oder ein Netzwerksubnetz ('benutzer'@'192.168.1.%'). Dies verhindert unbefugte Zugriffsversuche von unbekannten Orten.

5. Regelmäßige Audits und Überprüfungen

  • Überprüfen Sie regelmäßig alle Benutzerkonten und ihre zugehörigen Berechtigungen. Entfernen Sie veraltete Konten oder unnötige Berechtigungen.
  • Verwenden Sie SHOW GRANTS FOR 'benutzer'@'host';, um Berechtigungen zu überprüfen.
  • Ziehen Sie automatisierte Tools für Audits in großen Umgebungen in Betracht.

6. Berechtigungen dokumentieren

  • Führen Sie eine klare Dokumentation Ihrer Datenbankbenutzer, ihrer Rollen und der jedem gewährten Berechtigungen. Dies hilft, Konsistenz zu wahren und erleichtert Sicherheitsaudits.

7. Separate Entwicklungs-, Staging- und Produktionsumgebungen

  • Verwenden Sie niemals Produktionsanmeldeinformationen in Entwicklungs- oder Staging-Umgebungen. Jede Umgebung sollte ihren eigenen Satz unterschiedlicher Benutzer und Berechtigungen haben.

8. GRANT OPTION vermeiden, es sei denn, es ist absolut notwendig

  • Das Gewähren von WITH GRANT OPTION delegiert die Berechtigungsverwaltung an diesen Benutzer, was zentrale Sicherheitsrichtlinien umgehen kann. Reservieren Sie dies für hochvertrauenswürdige administrative Benutzer und nur auf dem restriktivsten möglichen Geltungsbereich.

Aktuelle Berechtigungen anzeigen

Um die einem Benutzer zugewiesenen Berechtigungen zu überprüfen, verwenden Sie den Befehl SHOW GRANTS:

SHOW GRANTS FOR 'benutzername'@'host';

Beispiel:

SHOW GRANTS FOR 'app_user'@'localhost';

Die Ausgabe könnte so aussehen:

+-------------------------------------------------------------+
| Grants for app_user@localhost                               |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'localhost'                |
| GRANT SELECT, INSERT, UPDATE ON `myapp_db`.* TO 'app_user'@'localhost' |
+-------------------------------------------------------------+

Die Zeile GRANT USAGE ON *.* zeigt an, dass der Benutzer keine globalen Berechtigungen hat, sondern nur die Fähigkeit, eine Verbindung herzustellen.

Fazit

Halten Sie die MySQL-Berechtigungsverwaltung eng und überprüfbar. Erstellen Sie dedizierte Konten, beschränken Sie Hosts, gewähren Sie nur die benötigten Aktionen auf dem kleinsten sinnvollen Geltungsbereich und überprüfen Sie jede Änderung mit SHOW GRANTS. Wenn eine App oder Person keinen Zugriff mehr benötigt, entziehen Sie die Berechtigung oder löschen Sie das Konto, anstatt veraltete Anmeldeinformationen zurückzulassen.