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.
