GRANT und REVOKE
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]
GRANT ist erst seit der Version MySQL 3.22.11 implementiert.MySQL hat ein fortschrittliches, aber vom Standard abweichendesSicherheits/Rechte-System. Was kann das Rechte-System erledigen?
Die grundlegende Funktion des MySQL-Rechte-Systems ist es,einem Usernamen auf einem Host die SELECT, INSERT, UPDATEund DELETE Rechte bzgl. einer Datenbank zu erteilen. Außerdembesteht die Möglichkeit, einem "anonymous"-User bestimmteDinge zu erlauben, und eventuell auch Statements, wie z.B.LOAD DATA INFILE auszuführen. In der neuesten Version 3.23ist auch die Vergabe von Rechten in Abhängigkeit der Hostadresse,der IP-Nummer oder der Netzwerk-Adresse möglich. Host Nummerund Userpasswort sind dabei unabhängig voneinander, wasbedeutet, daß es z.B. zwei User mit demselben Usernamengeben darf, vorausgesetzt, daß diese sich stets aus anderenNetzwerken einloggen. Es sollte beachtet werden, daß dieUsernamen für die MySQL - Datenbank nichts mit UNIX - Usernoder Microsoft Windows NT/98 Konten zu tun haben. MySQLversteht die Kombination aus einem Hostname, einer Netzwerkadresseoder einer IP-Nummer in Verbindung mit einem einem Userals eindeutige Identität. Aufgrund dieser Identität entscheidetdas GRANT System dann welche Rechte ein Client erhält. DieRechte können jederzeit mit dem Skript mysqlaccess getestetwerden.
Alle Rechte werden in drei Tabellen: user,
host und db gespeichert:
Tabellen Name user db host
Scope Felder Host Host Host
User Db Db
Password User
Privileg Felder Select_priv Select_priv Select_priv
Insert_priv Insert_priv Insert_priv
Update_priv Update_priv Update_priv
Delete_priv Delete_priv Delete_priv
Index_priv Index_priv Index_priv
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Drop_priv Drop_priv Drop_priv
Grant_priv Grant_priv Grant_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Jedes in der User-Tabelle erteilte Recht ist für alle
Datenbanken gütig, die in der db-Tabelle nicht gefunden
werden können. Deshalb sollte man einzelnen Usern (vom Supervisor
abgesehen) Rechte nur auf Datenbank-Ebene zuteilen.
Die Host-Tabelle existiert hauptsächlich, um eine Liste
"sicherer" Server zu verwalten. Bei TcX enthält
die Host-Tabelle eine Liste aller Rechner im lokalen Netzwerk.
Die Rechte des sich gerade anmeldenden Users werden nach
dem folgenden Algorithmus festgestellt:
Die Tabelle host wird nach Hosts ohne Wildcard, gefolgt
von hosts mit einer Wildcard und Einträgen mit host=""
sortiert. Innerhalb jedes hosts, wird nach den gleichen
Regeln nach dem user sortiert. Die Tabelle db wird nach
den gleichen Regeln sortiert. Bei den nachfolgenden Schritten
wird in den so sortierten Datensätzen nachgesehen und der
erste passende Datensatz verwendet.
Die Rechte des sich anmeldenden Benutzers werden aus
der Tabelle user entnommen. Dabei wird, wie bereits weiter
oben beschrieben, der erste passende Datensatz aus der vorher
sortierten Tabelle verwendet. Den so erhaltenen Satz an
Rechten nennen wir einmal PRIV. Die Rechte des sich
anmeldenden Benutzers werden aus der Tabelle db entnommen.
Auch hier wird die vorher sortierte Tabelle, und der erste
passende Datensatz verwendet.
Falls der in der db-Tabelle gefundene Datensatz den Eintrag
host="" enthält, werden die ursprünglichen Rechte
PRIV aus der user-Tabelle mit den Host-Rechten aus
der host-Tabelle logisch UND verknüpft. D.h. im Klartext:
Aus beiden Datensätzen werden alle Rechte entfernt. bei
denen nicht in in beiden Fällen ein "Y" eingetragen
ist. Falls host
"" ist , so werden die Rechte von PIV nicht
verändert. In solchen Fällen muß der host-Eintrag zumindest
teilweise mit dem Hostname des verbindenden Hosts übereinstimmen.
Deshalb kann angenommen werden, daß die in dieser Zeile
festgelegten Rechte dem Profil des sich anmeldenden hosts
entsprechen.
Die Rechte des Users aus der Tabelle user werden
anschließend mit dem PRIV Rechtesatz logisch ODER
verknüpft. (d.h. alle Y-Rechte werden hinzugefügt).
Achtung: Falls in den Rechte-Tabellen etwas verändert
wurde, muß das Kommando: mysqladmin reload durchgeführt
werden, damit die Änderungen aktiv werden.
Der sich einloggende User erhält dann die PRIV Rechte
zugewiesen. Nachfolgend ein Beispiel für das Sortieren und
Auffinden der richtigen Datensätze. Angenommen, die user-Tabelle
sieht folgendermaßen aus:
+-----------+---------+-
| Host | User | ...
+-----------+---------+-
| % | root | ...
| % | jeffrey | ...
| localhost | root | ...
| localhost | | ...
+-----------+---------+-
Die Suchreihefolge sieht dann (nach erfolgter Sortierung)
folgendermaßen aus:
localhost/root
localhost/any
any/jeffrey
any/root
Jeffrey der sich via localhost anmeldet (also
von der Arbeitsstation, auf der mysqld läuft), und
wird deshalb mit den Rechten localhost/any und nicht
mit den Rechten any/jeffrey ausgestattet, da immer
der erste passende Eintrag verwendet wird !
Falls Sie also Probleme mit den Zugriffsrechten haben,
lassen Sie sich den Inhalt der Tabelle user ausgeben, sortieren
ihn von Hand und stellen den ersten passenden Datensatz
fest.
Es folgt nun ein Beispiel um den user "custom"
hinzuzufügen der sich von den Hosts "localhost",
"server.domain" und "whitehouse.gov"
anmelden darf. Er möchte das Password "stupid"
haben. Die Datenbank "bankaccount" möchte er nur
via "localhost", die Datenbank "customer"
von allen drei hosts aus erreichen können:
shell> mysql mysql.
mysql> insert into user (host,user,password)
values('localhost','custom',password('stupid'));
mysql> insert into user (host,user,password)
values('server.domain','custom',password('stupid'));
mysql> insert into user (host,user,password)
values('whitehouse.gov','custom',password('stupid'));
mysql> insert into db
(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
values
('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> insert into db
(host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
values
('%','customers','custom','Y','Y','Y','Y','Y','Y');
Sie können selbstverständlich xmysqladmin, mysql_webadmin,
mysqladmin und xmysql oder PHPmyAdmin verwenden, um
in den Rechte-Tabellen Datensätze einzufügen oder abzuändern.
|