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 sindSUPER,PROCESS,RELOAD,CREATE USER. - Datenbankberechtigungen (
datenbank_name.*): Gelten für alle Tabellen und Objekte innerhalb einer bestimmten Datenbank. Beispiele sindSELECT,INSERT,UPDATE,DELETE,CREATE,DROP. - Tabellenberechtigungen (
datenbank_name.tabellen_name): Gelten für alle Spalten innerhalb einer bestimmten Tabelle. Beispiele sindSELECT,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 steuernEXECUTEundALTER 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. Derhostkann eine IP-Adresse, ein Hostname oder ein Platzhalter sein (%für jeden Host,localhostfü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.
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
SELECTauf*.*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.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_usergrundlegende CRUD-Operationen nur innerhalb dermyapp_db-Datenbank durchführen, aber keine neuen Tabellen erstellen oder das Schema ändern.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 demreport_tool, sich von jedem Host zu verbinden, jedoch nur mitSELECT-Zugriff auf die Tabelleordersinsales_db.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_adminkann nun beliebige Berechtigungen aufinventory_dban 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
rootfür Anwendungen: Verwenden Sie niemals dasroot-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
Entziehen der
DELETE-Berechtigung von einem AnwendungsbenutzerWenn 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_userweiterhinSELECT,INSERTundUPDATEausführen, aber nichtDELETEinnerhalb vonmyapp_db.Entziehen der
GRANT OPTIONvon einem delegierten AdministratorWenn
db_adminnicht mehr die Berechtigungen anderer Benutzer fürinventory_dbverwalten muss.REVOKE GRANT OPTION ON `inventory_db`.* FROM 'db_admin'@'localhost';Hinweis: Um
GRANT OPTIONzu entziehen, müssen Sie explizitGRANT OPTIONin derREVOKE-Anweisung angeben.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 PRIVILEGESauf*.*entzieht alle globalen Berechtigungen, wasSUPER,CREATE USERusw. umfassen kann. Seien Sie vorsichtig bei der globalen Verwendung dieses Geltungsbereichs.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 SieSELECTaufdatenbank_name.*gewährt haben, müssen Sie es vondatenbank_name.*entziehen, nicht vondatenbank_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 PRIVILEGESwird nachGRANT,REVOKE,CREATE USERoderDROP USERnicht benötigt; MySQL wendet diese Anweisungen sofort an. - Kaskadeneffekte berücksichtigen: Wenn ein Benutzer mit
GRANT OPTIONanderen Berechtigungen erteilt hat, entzieht das Entziehen seinerGRANT OPTIONnicht 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
rootfür Anwendungen: Konfigurieren Sie Ihre Anwendungen niemals so, dass sie sich alsroot-Benutzer verbinden. Derroot-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
'%'durchlocalhost, 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 OPTIONdelegiert 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.