Das MySQL-Berechtigungssystem stellt sicher, dass alle Benutzer nur diejenigen Operationen ausführen können, die sie auch ausführen dürfen. Wenn Sie als Benutzer eine Verbindung mit einem MySQL-Server herstellen, dann wird Ihre Identität über den Host, von dem aus Sie die Verbindung herstellen, und den angegebenen Benutzernamen bestimmt. Wenn Sie nach Herstellung der Verbindung Abfragen absetzen, gewährt das System Berechtigungen entsprechend Ihrer Identität und dem, was Sie tun wollen.
MySQL berücksichtigt bei der Identifizierung sowohl Ihren Host-
als auch Ihren Benutzernamen, da es wenig Grund zu der Annahme
gibt, dass ein bestimmter Benutzername überall im Internet
jeweils derselben Person zuzuordnen ist. So muss beispielsweise
der Benutzer joe
, der eine Verbindung von
office.example.com
aus herstellt, keineswegs
mit dem Benutzer joe
identisch sein, der
seine Verbindung von home.example.com
aus
aufbaut. MySQL löst diese Diskrepanz, indem es Ihnen gestattet,
zwischen Benutzern auf unterschiedlichen Hosts zu unterscheiden,
die zufällig den gleichen Namen haben: Sie können einen Satz
mit Berechtigungen für Verbindungen von joe
auf office.example.com
und einen anderen
Berechtigungssatz für Verbindungen von joe
auf home.example.com
gewähren.
Die MySQL-Zugriffssteuerung umfasst zwei Stufen, wenn Sie ein Clientprogramm ausführen, das eine Verbindung mit dem Server herstellt:
Stufe 1: Der Server überprüft, ob er Ihnen die Verbindungsherstellung gestattet.
Stufe 2: Sofern Sie eine Verbindung herstellen konnten,
überprüft der Server nun jede von Ihnen abgesetzte
Anweisung, um zu ermitteln, ob Sie ausreichende
Berechtigungen für deren Durchführung genießen. Versuchen
Sie beispielsweise, Datensätze aus einer Tabelle in einer
Datenbank auszuwählen oder eine Tabelle aus der Datenbank
zu löschen, dann vergewissert sich der Server, dass Sie die
Berechtigung SELECT
für die Tabelle bzw.
die Berechtigung DROP
für die Datenbank
haben.
Werden Ihre Berechtigungen (sei es von Ihnen selbst oder jemandem anderes) geändert, während Sie eine Verbindung haben, dann haben diese Änderungen nicht unbedingt sofort für die nächste abgesetzte Anweisung Gültigkeit. Weitere Informationen finden Sie in Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“.
Der Server speichert Berechtigungsinformationen in den
Grant-Tabellen der mysql
-Datenbank (d. h. in
der Datenbank namens mysql
). Der MySQL-Server
liest die Inhalte dieser Tabellen beim Start in den Speicher
ein. Unter den in Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“,
beschriebenen Umständen erfolgt zudem ein Neueinlesen der
Inhalte. Entscheidungen der Zugriffssteuerung basieren auf den
im Arbeitsspeicher vorhandenen Kopien der Grant-Tabellen.
Normalerweise manipulieren Sie die Inhalte der Grant-Tabellen
indirekt, indem Sie mit Anweisungen wie GRANT
oder REVOKE
Konten einrichten und die
Berechtigungen für jedes einzelne Konto steuern. Siehe auch
Abschnitt 13.5.1, „Anweisungen zur Benutzerkontenverwaltung“. Die nachfolgende
Beschreibung erläutert die den Grant-Tabellen zugrundeliegende
Struktur und die Frage, wie der Server die Inhalte dieser
Tabellen für die Interaktion mit Clients verwendet.
Der Server benutzt die Tabellen user
,
db
und host
in der
Datenbank mysql
für beide Stufen der
Zugriffssteuerung. Die Spalten in den Tabellen
user
und db
sind
nachfolgend aufgeführt. Die Tabelle host
ähnelt der Tabelle db
, weist aber einen
speziellen Einsatzbereich auf, der in
Abschnitt 5.8.6, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“, beschrieben wird.
Tabellenname | user | db |
Spalten für Gültigkeitsbereiche | Host |
Host |
User |
Db |
|
Password |
User |
|
Berechtigungsspalten | Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
|
Update_priv |
Update_priv |
|
Delete_priv |
Delete_priv |
|
Index_priv |
Index_priv |
|
Alter_priv |
Alter_priv |
|
Create_priv |
Create_priv |
|
Drop_priv |
Drop_priv |
|
Grant_priv |
Grant_priv |
|
Create_view_priv |
Create_view_priv |
|
Show_view_priv |
Show_view_priv |
|
Create_routine_priv |
Create_routine_priv |
|
Alter_routine_priv |
Alter_routine_priv |
|
Execute_priv |
Execute_priv |
|
Trigger_priv |
Trigger_priv |
|
Event_priv |
Event_priv |
|
Create_tmp_table_priv |
Create_tmp_table_priv |
|
Lock_tables_priv |
Lock_tables_priv |
|
References_priv |
References_priv |
|
Reload_priv |
||
Shutdown_priv |
||
Process_priv |
||
File_priv |
||
Show_db_priv |
||
Super_priv |
||
Repl_slave_priv |
||
Repl_client_priv |
||
Sicherheitsspalten | ssl_type |
|
ssl_cipher |
||
x509_issuer |
||
x509_subject |
||
Spalten zur Ressourcensteuerung | max_questions |
|
max_updates |
||
max_connections |
||
max_user_connections |
Die Spalten Event_priv
und
Trigger_priv
wurden in MySQL 5.1.6
hinzugefügt.
Während der zweiten Stufe der Zugriffssteuerung führt der
Server eine Anforderungsverifizierung durch, um sicherzustellen,
dass jeder Client über die erforderlichen Berechtigungen für
jede abgesetzt Anforderung verfügt. Neben den Grant-Tabellen
user
, db
und
host
kann der Server auch die Tabellen
tables_priv
und
columns_priv
für Anforderungen abfragen, die
Tabellen betreffen. Die Tabellen tables_priv
und columns_priv
ermöglichen eine feiner
abgestufte Berechtigungssteuerung auf der Tabellen- und
Spaltenebene. Die Tabellen haben die folgenden Spalten:
Tabellenname | tables_priv | columns_priv |
Spalten für Gültigkeitsbereiche | Host |
Host |
Db |
Db |
|
User |
User |
|
Table_name |
Table_name |
|
Column_name |
||
Berechtigungsspalten | Table_priv |
Column_priv |
Column_priv |
||
Weitere Spalten | Timestamp |
Timestamp |
Grantor |
Die Spalten Timestamp
und
Grantor
werden derzeit nicht benutzt und
sollen deswegen an dieser Stelle nicht weiter behandelt werden.
Zur Verifizierung von Anforderungen, die gespeicherte Routinen
betreffen, kann der Server auch die Tabelle
procs_priv
abfragen. Diese Tabelle weist die
folgenden Spalten auf:
Tabellenname | procs_priv |
Spalten für Gültigkeitsbereiche | Host |
Db |
|
User |
|
Routine_name |
|
Routine_type |
|
Berechtigungsspalten | Proc_priv |
Weitere Spalten | Timestamp |
Grantor |
Die Spalte Routine_type
ist eine
ENUM
-Spalte, die mit den Werten
'FUNCTION'
bzw.
'PROCEDURE'
den Typ der Routine angibt, auf
die sich der Datensatz bezieht. Diese Spalte gestattet die
separate Gewährung von Berechtigungen für eine Funktion oder
Prozedur gleichen Namens.
Die Spalten Timestamp
und
Grantor
werden derzeit nicht benutzt und
sollen deswegen an dieser Stelle nicht weiter behandelt werden.
Jede Grant-Tabelle enthält Gültigkeitsbereichs- und Berechtigungsspalten:
Bereichsspalten bestimmen den Gültigkeitsbereich aller
Datensätze in den Tabellen, d. h. den Kontext, in dem der
Datensatz gültig ist. So würde beispielsweise eine Tabelle
user
mit den Host
- und
User
-Werten
'thomas.loc.gov'
bzw.
'bob'
zur Authentifizierung von
Verbindungen verwendet, die vom Host
thomas.loc.gov
aus durch einen Client,
der den Benutzernamen bob
angibt,
hergestellt würden. Ähnlich würde ein Datensatz in der
Tabelle db
mit den Werten
'thomas.loc.gov'
,
'bob'
und 'reports'
in
den Spalten Host
, User
und Db
verwendet werden, wenn der
Benutzer bob
vom Host
thomas.loc.gov
aus auf die Datenbank
reports
zuzugreifen versucht. Die
Tabellen tables_priv
und
columns_priv
enthalten
Gültigkeitsbereichsspalten, die die Tabellen oder
Tabellenkombinationen angeben, für die der jeweilige
Datensatz gilt. Die Bereichsspalten in
procs_priv
geben die jeweilige
gespeicherte Routine an, für die der Datensatz gilt.
Berechtigungsspalten legen fest, welche Berechtigungen durch einen Datensatz gewährt werden, d. h. welche Operationen durchgeführt werden können. Der Server kombiniert die Daten in den verschiedenen Grant-Tabellen zu einer vollständigen Beschreibung der Berechtigungen eines Benutzers. Abschnitt 5.8.6, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“, beschreibt, welches Regeln hierbei zugrundegelegt werden.
Bereichsspalten enthalten Strings. Diese werden wie nachfolgend gezeigt deklariert, wobei der Vorgabewert jeweils der Leer-String ist:
Spaltenname | Typ |
Host |
CHAR(60) |
User |
CHAR(16) |
Password |
CHAR(16) |
Db |
CHAR(64) |
Table_name |
CHAR(64) |
Column_name |
CHAR(64) |
Routine_name |
CHAR(64) |
Bei der Überprüfung der Host
-Werte im Zuge
der Berechtigungsverifizierung wird keine Unterscheidung der
Groß-/Kleinschreibung vorgenommen. Die
User
-, Password
-,
Db
- und Table_name
-Werte
hingegen unterscheiden die Groß-/Kleinschreibung. Nicht
unterschieden wird sie wiederum bei
Column_name
- und
Routine_name
-Werten.
In den Tabellen user
, db
und host
wird jede Berechtigung in einer
separaten Spalte aufgeführt, die als ENUM('N','Y')
DEFAULT 'N'
deklariert ist. Anders gesagt: Jede
Berechtigung lässt sich aktivieren oder deaktivieren, wobei sie
vorgabeseitig immer deaktiviert ist.
In den Tabellen tables_priv
,
columns_priv
und
procs_priv
sind die Berechtigungsspalten als
SET
-Spalten deklariert. Werte in diesen
Spalten können eine beliebige Kombination der Berechtigungen
enthalten, die von der Tabelle gesteuert werden:
Tabellenname | Spaltenname | Mögliche Elemente des Satzes |
tables_priv |
Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
'Grant', 'References', 'Index', 'Alter', 'Create View',
'Show view', 'Trigger' |
tables_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
procs_priv |
Proc_priv |
'Execute', 'Alter Routine', 'Grant' |
Kurz gesagt verwendet der Server die Grant-Tabellen wie folgt:
Die Bereichsspalten in der Tabelle user
bestimmen, ob eingehende Verbindungen abgewiesen oder
zugelassen werden. Bei zulässigen Verbindungen geben alle
in der Tabelle user
gewährten
Berechtigungen die globalen Berechtigungen
(Superuser-Berechtigungen) des Benutzers an. Jede
Berechtigung, die in dieser Tabelle gewährt wird, gilt für
alle Datenbanken auf dem Server.
Hinweis: Da alle globalen
Berechtigungen als Berechtigungen für alle Datenbanken zu
betrachten sind, erlaubt das Vorhandensein einer beliebigen
globalen Berechtigung für einen Benutzer diesem, alle
Datenbanknamen mit SHOW DATABASES
oder
durch Untersuchen der Tabelle SCHEMATA
von INFORMATION_SCHEMA
anzuzeigen.
Die Bereichsspalten der Tabelle db
bestimmen dabei, welche Benutzer von welchen Hosts aus auf
welche Datenbanken zugreifen können. Die
Berechtigungsspalten legen hingegen fest, welche Operationen
zulässig sind. Eine auf der Datenbankebene gewährte
Berechtigung gilt für die Datenbank und alle in ihr
enthaltenen Tabellen.
Die Tabelle host
wird in Verbindung mit
der Tabelle db
benutzt, wenn ein
bestimmte Datensatz in der Tabelle db
für mehrere Hosts gelten soll. Wenn Sie beispielsweise
einem Benutzer die Verwendung einer Datenbank von
verschiedenen Hosts in Ihrem Netzwerk aus gestatten wollen,
lassen Sie den Wert Host
im Datensatz des
betreffenden Benutzers in der Tabelle db
frei und geben Sie dann einen Datensatz für jeden der
betreffenden Hosts in die Tabelle host
ein. Diese Vorgehensweise wird in
Abschnitt 5.8.6, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“, genauer beschrieben.
Hinweis: Die Tabelle
host
muss mit Anweisungen wie
INSERT
, UPDATE
und
DELETE
direkt modifiziert werden.
Anweisungen wie GRANT
und
REVOKE
, die die Grant-Tabellen indirekt
manipulieren, haben keine Auswirkungen auf diese Tabelle.
Die meisten MySQL-Installationen verwenden die Tabelle
ohnehin nicht.
Die Tabellen tables_priv
und
columns_priv
ähneln der Tabelle
db
, sind aber feiner abgestuft: Sie
werden nicht auf Datenbankebene, sondern auf der Tabellen-
und der Spaltenebene angewendet. Eine auf der Tabellenebene
gewährte Berechtigung gilt für die Tabelle und alle in ihr
enthaltenen Spalten. Eine auf der Spaltenebene gewährte
Berechtigung gilt indes nur für eine bestimmte Spalte.
Die Tabelle procs_priv
gilt für
gespeicherte Routinen. Eine auf der Routinenebene gewährte
Berechtigung gilt nur für eine bestimmte Routine.
Administrative Berechtigungen (wie etwa
RELOAD
oder SHUTDOWN
)
werden nur in der Tabelle user
festgelegt.
Der Grund hierfür besteht darin, dass administrative
Operationen auf dem Server selbst erfolgen und nicht
datenbankspezifisch sind, d. h. es gibt keinen Grund, diese
Berechtigungen in anderen Grant-Tabellen aufzuführen.
Tatsächlich muss der Server, um zu ermitteln, ob Sie eine
administrative Operation durchführen dürfen, nur die Tabelle
user
abfragen.
Die Berechtigung FILE
wird ebenfalls nur in
der Tabelle user
festgelegt. Sie ist im
Eigentlichen keine administrative Berechtigung, aber die
Fähigkeit zum Lesen oder Schreiben von Dateien auf dem
Serverhost hängt nicht von der Datenbank ab, auf die Sie
zugreifen.
Der Server mysqld liest die Inhalte der
Grant-Tabellen beim Start in den Speicher ein. Sie können ihn
mit der Anweisung FLUSH PRIVILEGES
oder durch
Ausführen der Befehle mysqladmin
flush-privileges oder mysqladmin
reload anweisen, die Tabellen neu einzulesen.
Änderungen an den Grant-Tabellen werden umgesetzt wie in
Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“, beschrieben.
Wenn Sie die Inhalte der Grant-Tabellen ändern, empfiehlt es
sich sicherzustellen, dass Ihre Änderungen die Berechtigungen
so konfigurieren, wie Sie es auch wünschen. Um die
Berechtigungen eines gegebenen Kontos zu überprüfen, verwenden
Sie die Anweisung SHOW GRANTS
. (Siehe auch
Abschnitt 13.5.4.11, „SHOW GRANTS
“.) Um also etwa die Berechtigungen
zu ermitteln, die einem Konto mit den Host
-
und User
-Werten
pc84.example.com
bzw. bob
gewährt werden, setzen Sie folgende Anweisung ab:
SHOW GRANTS FOR 'bob'@'pc84.example.com';
Weitere Hilfe zur Diagnose von Problemen in Zusammenhang mit
Berechtigungen finden Sie in Abschnitt 5.8.8, „Gründe für Access denied
-Fehler“.
Allgemeine Richtlinien zu Sicherheitsfragen finden Sie außerdem
in Abschnitt 5.7, „Absichern von MySQL gegen Angreifer“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.