Nachdem Sie eine Verbindung hergestellt haben, wechselt der
Server zu Stufe 2 der Zugriffssteuerung. Für jede Anforderung,
die Sie über die Verbindung absetzen, ermittelt der Server,
welche Operation Sie durchführen wollen, und überprüft dann,
ob Sie die zu diesem Zweck erforderlichen Berechtigungen
besitzen. Hier nun kommen die Berechtigungsspalten in den
Grant-Tabellen ins Spiel. Diese Berechtigungen können aus den
folgenden Tabellen stammen: user
,
db
, host
,
tables_priv
, columns_priv
oder procs_priv
. (An dieser Stelle kann es
unter Umständen hilfreich sein, noch einmal
Abschnitt 5.8.2, „Wie das Berechtigungssystem funktioniert“, zu lesen. Dort sind die Spalten
aufgelistet, die in den verschiedenen Grant-Tabellen vorhanden
sind.)
Die Tabelle user
gewährt Berechtigungen, die
Ihnen auf globaler Basis zugewiesen werden und die unabhängig
von der gewählten Standarddatenbank gelten. Wenn die Tabelle
user
Ihnen beispielsweise die Berechtigung
DELETE
gewährt, können Sie Datensätze aus
allen Tabellen in allen Datenbanken auf dem Serverhost löschen!
Anders gesagt sind Berechtigungen für die Tabelle
user
Superuser-Berechtigungen. Es ist klug,
Berechtigungen in der Tabelle user
nur
Superusern wie beispielsweise Datenbankadministratoren zu
gewähren. Bei allen anderen Benutzern sollten Sie die
Berechtigungen in der Tabelle user
auf
'N'
stehen lassen und Berechtigungen nur auf
spezifischeren Ebenen gewähren. Sie können Berechtigungen für
bestimmte Datenbanken, Tabellen, Spalten und Routinen gewähren.
Die Tabellen db
und host
gewähren datenbankspezifische Berechtigungen. Werte in den
Bereichsspalten dieser Tabellen können die folgende Form
annehmen:
Die Jokerzeichen ‘%
’ und
‘_
’ können in den Spalten
Host
und Db
dieser
Tabellen verwendet werden. Sie haben die gleiche Bedeutung
wie bei Mustervergleichsoperationen, die mit dem Operator
LIKE
durchgeführt werden. Wenn Sie eines
der Zeichen beim Gewähren von Berechtigungen literal
verwenden wollen, müssen Sie es mit einem Backslash
kennzeichnen. Um beispielsweise den Unterstrich
(‘_
’) als Teil eines
Datenbanknamens zu verwenden, geben Sie ihn als
‘\_
’ in der
GRANT
-Anweisung an.
Der Wert '%'
in der Spalte
Host
der Tabelle db
bedeutet „ein beliebiger Host“. Ein leerer
Host
-Wert in der Tabelle
db
hat die Bedeutung „Weitere
Informationen der Tabelle host
entnehmen“ (dieser Vorgang wird im weiteren Verlauf
dieses Abschnitts noch beschrieben).
Der Wert '%'
oder ein leerer Wert in der
Spalte Host
der Tabelle
host
bedeutet „ein beliebiger
Host“.
Der Wert '%'
oder ein leerer Wert in der
Spalte Db
in einer dieser Tabellen
bedeutet „eine beliebige Datenbank“.
Ein leerer User
-Wert in einer der
Tabellen führt zur Übereinstimmung mit dem anonymen
Benutzer.
Der Server liest die Tabellen db
und
host
in den Speicher ein und sortiert sie,
während er gleichzeitig die Tabelle user
einliest. Der Server sortiert die Tabelle db
nach den Bereichsspalten Host
,
Db
und User
und die
Tabelle host
nach den Bereichsspalten
Host
und Db
. Wie bei der
Sortierung der Tabelle user
werden auch hier
die spezifischeren Werte an den Anfang und die weniger
spezifischen an das Ende der Tabelle gesetzt, und auch hier
verwendet der Server bei der Suche nach Übereinstimmungen das
erste passende Ergebnis.
Die Tabellen tables_priv
columns_priv
und proc_priv
gewähren tabellenspezifische, spaltenspezifische und
routinenspezifische Berechtigungen. Werte in den Bereichsspalten
dieser Tabellen können die folgende Form annehmen:
Die Jokerzeichen ‘%
’ und
‘_
’ können in der Spalte
Host
verwendet werden. Sie haben die
gleiche Bedeutung wie bei Mustervergleichsoperationen, die
mit dem Operator LIKE
durchgeführt
werden.
Der Wert '%'
oder ein leerer Wert in der
Spalte Host
bedeutet „ein
beliebiger Host“.
Die Spalten Db
,
Table_name
und
Column_name
dürfen weder Jokerzeichen
enthalten noch leer sein.
Der Server sortiert die Tabellen tables_priv
,
columns_priv
und
procs_priv
nach den Spalten
Host
, Db
und
User
. Dies ähnelt der Sortierung der Tabelle
db
, ist aber einfacher, da nur die Spalte
Host
Jokerzeichen enthalten darf.
Der Server verwendet die sortierten Tabellen zur Verifizierung
aller empfangenen Anforderungen. Bei Anforderungen, die
administrative Berechtigungen voraussetzen (z. B.
SHUTDOWN
oder RELOAD
),
überprüft der Server nur den Datensatz in der Tabelle
user
, weil dies die einzige Tabelle ist, die
administrative Berechtigungen angibt. Der Server gewährt den
Zugriff, wenn der Datensatz die angeforderte Operation
gestattet; andernfalls wird der Zugriff abgewiesen. Wenn Sie
also beispielsweise mysqladmin shutdown
ausführen wollen, aber Ihr Datensatz in der Tabelle
user
Ihnen die Berechtigung
SHUTDOWN
nicht gewährt, dann verweigert der
Server Ihnen den Zugriff, ohne die Tabellen
db
oder host
auch nur
abgefragt zu haben. (Da diese Tabellen keine
Shutdown_priv
-Spalte enthalten, ist dies
ohnehin unnötig.)
Bei datenbankbezogenen Anforderungen (INSERT
,
UPDATE
usw.) überprüft der Server zuerst
die globalen Berechtigungen (Superuser-Berechtigungen), indem er
den Datensatz in der Tabelle user
abfragt.
Gestattet der Datensatz die angeforderte Operation, dann wird
der Zugriff gewährt. Wenn die globalen Berechtigungen in der
Tabelle user
nicht ausreichend sind,
ermittelt der Server die datenbankspezifischen Berechtigungen,
indem er die Tabellen db
und
host
überprüft:
Der Server sucht in der Tabelle db
nach
einer Übereinstimmung der Spalten Host
,
Db
und User
. Die
Spalten Host
und User
werden auf Übereinstimmung mit dem Hostnamen und dem
MySQL-Benutzernamen des Benutzers geprüft, der die
Verbindung herstellen will. Die Spalte Db
wird mit der Datenbank verglichen, auf die der Benutzer
zugreifen will. Kann kein Datensatz für
Host
und User
gefunden
werden, dann wird der Zugriff verweigert.
Ist ein übereinstimmender Datensatz in der Tabelle
db
vorhanden und ist die Spalte
Host
nicht leer, dann definiert der
Datensatz die datenbankspezifischen Berechtigungen für den
Benutzer.
Ist die Spalte Host
im übereinstimmenden
Datensatz der Tabelle db
leer, dann
bedeutet dies, dass die Tabelle host
auflistet, welche Hosts auf die Datenbank zugreifen dürfen.
In diesem Fall wird in der Tabelle host
erneut eine Übereinstimmung mit den Spalten
Host
und Db
gesucht.
Wird kein passender Datensatz in der Tabelle
host
gefunden, dann wird der Zugriff
verweigert. Wird allerdings eine Übereinstimmung gefunden,
dann werden die datenbankspezifischen Berechtigungen des
Benutzers als Schnittmenge (nicht als
Gesamtmenge!) der Berechtigungen in den Einträgen der
Tabellen db
und host
berechnet, d. h. die Berechtigungen müssen in beiden
Einträgen jeweils 'Y'
sein. (Auf diese
Weise können Sie allgemeine Berechtigungen im Datensatz der
Tabelle db
gewähren und diese dann über
die Tabelle host
auf Hostbasis selektiv
einschränken.)
Nachdem er die datenbankspezifischen Berechtigungen ermittelt
hat, die durch die Einträge in den Tabellen
db
und host
gewährt
werden, fügt der Server diese den durch die Tabelle
user
gewährten Berechtigungen hinzu.
Gestattet das Ergebnis die angeforderte Operation, dann wird der
Zugriff gewährt. Andernfalls überprüft der Server nachfolgend
die Tabellen- und Spaltenberechtigungen des Benutzers in den
Tabellen tables_priv
bzw.
columns_priv
, fügt diese den
Benutzerberechtigungen hinzu und gestattet oder verweigert auf
der Basis des Ergebnisses den Zugriff. Bei Operationen in
Zusammenhang mit gespeicherten Routinen verwendet der Server die
Tabelle procs_priv
statt
tables_priv
und
columns_priv
.
Ausgedrückt in booleschen Termini, lässt sich die vorangegangene Beschreibung der Berechnung von Benutzerberechtigungen wie folgt zusammenfassen:
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges OR routine privileges
Es ist vielleicht nicht einleuchtend, warum der Server, wenn die
globalen Berechtigungen im Datensatz der Tabelle
user
zunächst nicht als ausreichend für die
angeforderte Operation erachtet werden, diese Berechtigungen
später zu den Berechtigungen für die Datenbanken, Tabellen und
Spalten hinzufügt. Der Grund hierfür besteht darin, dass eine
Anforderung mehrere Berechtigungstypen erfordern kann. Wenn Sie
beispielsweise eine INSERT INTO ...
SELECT
-Anweisung ausführen, benötigen Sie sowohl die
Berechtigung INSERT
als auch die Berechtigung
SELECT
. Ihre Berechtigungen sehen unter
Umständen so aus, dass der Datensatz in der Tabelle
user
eine dieser Berechtigungen und der
Datensatz in der Tabelle db
die andere
Berechtigung gewährt. In diesem Fall besitzen Sie die
erforderlichen Berechtigungen, um die Anforderung
durchzuführen, aber der Server kann dies nicht mithilfe nur
einer Tabelle bestimmen; vielmehr müssen die von den Einträgen
in beiden Tabellen gewährten Berechtigungen kombiniert werden.
Die Tabelle host
wird von
GRANT
- und
REVOKE
-Anweisungen nicht beeinflusst, liegt
also in den meisten MySQL-Installationen brach. Wenn Sie sie
jedoch manuell modifizieren, können Sie sie für bestimmte
Spezialzwecke einsetzen, z. B. um eine Liste sicherer Server zu
führen. Bei TcX beispielsweise enthält die Tabelle
host
eine Liste aller Systeme im lokalen
Netzwerk. Diesen sind alle Berechtigungen gewährt.
Sie können die Tabelle host
auch verwenden,
um Hosts anzugeben, die nicht sicher sind.
Nehmen wir an, dass Sie einen Computer namens
public.your.domain
haben, der sich in einem
öffentlichen Bereich befindet, den Sie als nicht sicher
erachten. Sie können Zugriff auf alle Hosts in Ihrem Netzwerk
mit Ausnahme dieses Computers gewähren, indem Sie die Einträge
der Tabelle host
wie folgt verwenden:
+--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (all privileges set to 'N') | %.your.domain | % | ... (all privileges set to 'Y') +--------------------+----+-
Natürlich sollten Sie Ihre Änderungen an den Grant-Tabellen
immer testen (z. B. mit SHOW GRANTS
), um
sicherzustellen, dass Ihre Zugriffsberechtigungen tatsächlich
so konfiguriert sind, wie Sie es wünschen.
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.