|

Passwort setzen für
den User root
Rechte für einzelne User festlegen
Aufbau der grant tables
Logische Verknüpfungen der grant tables
Zugriff nur auf bestimmte Spalten einer Tabelle
erlauben
Rechte erweitern
Rechte entziehen
| Passwort
setzen für den User root |
|
Bisher hatten wir nur einen einzigen User,
nämlich den User root, der ohne Angabe eines Passwortes
auf die Datenbank zugreifen konnte. Wie jeder weiss, ist dies
weder eine typische noch eine sinnvolle Konstellation. Wer
einen Account bei einem Provider mit mysql Datenbank hat,
der weiss, dass er die mysql Datenbank nur unter Angabe seines
Passwortes, seines Usernamens und unter Angabe der Datenbank,
die er ansteuern will, nutzen kann. Die meisten Provider erlauben
dann auch nur den Zugriff auf die Datenbank, von einem bestimmten
Rechner aus, meistens von dem Rechner, wo die Skripte, die
die mysql Datenbank ansteuern, gehostet sind, was man aber
ändern kann. Dieser Teil basiert auf mysql 3.23.28. Mi
der Version 4.0.9 gab es Probleme. Der Zugriff wurde für
den Root verweigert, war aber für den "normalen
User" möglich. Wir gehen mal davon aus, dass hier
ein kleiner bug vorliegt. Das Verfahren ist aber prinzipiell
auch für 4.0.9 das gleiche. Die Konstellation, die im
Moment, bevor wir dem User root ein Passwort vergeben haben
und bevor wir einen User eingerichtet haben, können wir
uns anschauen. Wir finden die User gelistet in der Tabelle
user in der Datenbank mysql
(c:\mysql\data\mysql). Schauen wir uns an, was dort bis jetzt
vorliegt.
C:\mysql\bin>mysql mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.9-gamma-max-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer.
mysql> select user,password,host from
user;
 |
 |
 |
 |
 |
 |
 |
 |
user |
 |
password |
 |
host |
 |
 |
 |
 |
 |
 |
 |
 |
 |
root |
 |
|
 |
localhost |
 |
 |
root |
 |
|
 |
% |
 |
 |
|
 |
|
 |
localhost |
 |
 |
|
 |
|
 |
% |
 |
 |
 |
 |
 |
 |
 |
 |
4 rows in set (0.06 sec)
mysql>
Das heisst, die Default Einstellungen
von mysql sieht etwas ungünstig. User root kann ohne
Passwort von jedem x-beliebigen Rechner (%) wie auch von localhost
zugreifen. Weiter haben wir noch zwei leere Einträge,
die bewirken, dass jeder x-beliebige User von jedem x-beliebigen
Rechner zugreifen kann. In dieser Konstellation würde
es wenig nützen, dem User root ein Password zuzweisen,
da ja jeder x-beliebige User weiterhin zugreifen kann. Wir
veranschaulichen dies an einem Beispiel.
C:\mysql\bin>mysqladmin -u root
password geheim
Anschliessend fahren wir den mysql Server
runter und wieder hoch. So sind wir sicher, dass mit den aktuellen
Einträgen gearbeitet wird. Dann schauen wir uns an, ob
die Tabelle user aktualisiert wurde.
C:\mysql\bin>mysqladmin shutdown
C:\mysql\bin>mysqld
C:\mysql\bin>mysql mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql> select user,password,host from
user;
 |
 |
 |
 |
 |
 |
 |
 |
user |
 |
password |
 |
host |
 |
 |
 |
 |
 |
 |
 |
 |
 |
root |
 |
58982d15048734ee |
 |
localhost |
 |
 |
|
 |
|
 |
% |
 |
 |
|
 |
|
 |
localhost |
 |
 |
root |
 |
|
 |
% |
 |
 |
 |
 |
 |
 |
 |
 |
4 rows in set (0.00 sec)
mysql>
Wir hätten erwartet, dass wir nach
dem der Server heruntergefahren und neu gestartet wurde, uns
mit mysql gar nicht mehr einloggen können. Dies ist aber
nicht der Fall. Wir können uns einlogen und sogar in
die sensible Datenbank user eindringen. Wir müssen also
die User, die kein Password haben, löschen.
mysql> quit
Bye
C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use mysql
Database changed
mysql> delete from user where user="";
Query OK, 2 rows affected (0.11 sec)
mysql>
Nun haben wir die anonymen User gelöscht.
Versuchen wir jetzt ohne Angabe eines Passwords die Datenbank
anzusteuern, passiert folgendes.
C:\mysql\bin>mysqladmin shutdown
C:\mysql\bin>mysqld
C:\mysql\bin>mysql
ERROR 1045: Access denied for user: 'ODBC@localhost' (Using
password: NO)
C:\mysql\bin>
Das heisst, dass ein Betreten der Datenbank
nur noch unter Angabe des Usernamens und des Passwortes möglich
ist.
C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql>
Das funktionniert.
Neue User hinzufügen
Wir wollen nun eine neue Datenbank einrichten, auf die der
User Maria zugreifen kann.
C:\mysql\bin>mysqladmin -u root
-p create Marias_Datenbank
Enter password: ******
C:\mysql\bin>
Das -p brauchen wir hier nur um anzuzeigen,
dass wir erwarten, dass mysql uns zur Eingabe eines Passworts
auffordert. Nachdem die Datenbank eingerichtet ist, können
wir dem User Maria die Datenbank Marias_Datenbank zuordnen.
| Rechte
für einzelne User festlegen |
|
mysql> grant all on Marias_Datenbank.*
to Maria@localhost identified by "mary";
Query OK, 0 rows affected (0.05 sec)
mysql>
Das heisst, der user Maria hat alle Rechte
an dieser Datenbank in allen Tabellen. Auf andere Datenbaken
kann sie nicht zugreifen. Er identifiziert sich durch
das Passwort "mary".
C:\mysql\bin>mysql -u Maria -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use user;
ERROR 1044: Access denied for user: 'Maria@localhost' to database
'user'
mysql> use Marias_Datenbank;
Database changed
mysql>
Sie kann aber auf die ihr zugeordnete
Datenbank zugreifen und dort Tabellen einrichten.
C:\mysql\bin>mysql -u Maria -p
Marias_Datenbank
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> create table tochter(Freunde char(50),Geburtstag
date,Telefon char(30));
Query OK, 0 rows affected (0.05 sec)
mysql>
Was Maria in der Datenbank darf, nämlich
alles, das wissen wir schon. Man kann es sich auch in der
Tabelle db anschauen.
mysql> select user,host,db,select_priv,insert_priv from
db;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
user |
 |
host |
 |
db |
 |
select_priv |
 |
insert_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
% |
 |
test% |
 |
Y |
 |
Y |
 |
 |
Maria |
 |
localhost
|
 |
Marias_Datenbank |
 |
Y |
 |
Y |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
2 rows in set (0.00 sec)
mysql>
Das Schema dürfte klar sein. Alle
anderen Optionen (alter, delete, update, index, drop,create)
funktionnieren nach dem gleichen Schema. Da wir all eingegeben
haben, darf Maria in der Datenbank Marias_Datenbank alles.
Der Root darf übrigens auch alles machen mit dieser Datenbank.
Wir richten nun noch eine Datenbank Sohn ein.
C:\mysql\bin>mysql -u Maria -p
Marias_Datenbank
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> create table sohn(Freunde char(50),Geburtstag date,Telefon
char(50));
Query OK, 0 rows affected (0.00 sec)
mysql>
Nun kann der User root zwei neue User
einrichten, nämlich Marias_Tochter und Marias_Sohn. Diese
dürfen natürlich nur auf die Tabelle Tochter bzw.
auf die Tabelle Sohn zugreifen.
mysql> grant all on Marias_Datenbank.tochter
to tocher@localhost identified
-> by "mary_tochter";
Query OK, 0 rows affected (0.82 sec)
mysql> grant all on Marias_Datenbank.sohn
to sohn@localhost identified
-> by "mary_sohn";
Query OK, 0 rows affected (0.00 sec)
mysql>
Mit grant richten wir einen neuen user
ein, nachdem wir mit mysql den mysql Client angewählt
haben. Leider funktionniert das nicht, weder der user sohn
noch der user tochter kann die Datenbank betreten. Versucht
sich der User tochter einzuwählen, passiert folgendes.
C:\mysql\bin>mysql -u tochter -p
Enter password: ************
ERROR 1045: Access denied for user: 'tochter@localhost' (Using
password: YES)
C:\mysql\bin>
Um dieses Problem zu beheben, müssen wir
nun zwei Dinge verstehen. Erstens müssen wir verstehen,
was in die Tabellen user,db,host,tables_priv und columns_priv
in der Datenbank mysql (wir meinen die Datenbank mysql in
c:\mysql\data\mysql und nicht den mysql Server) eingetragen
wurde und zweitens, wie in mysql die Rechte verwaltet werden.
Fangen wir mit dem ersten an.
Was wurde in die grant tables (user,db,host,tables_priv
und columns_prviv) eingetragen
Erinnern wir uns. Wir haben den usern tochter
und sohn Rechte mit folgendem Befehl zugewiesen.
grant all on Marias_Datenbank.sohn to sohn@localhost identified
by "mary_sohn
Uns beschäftigt nun die Frage, was in die
grant tables eingetragen wurde. Die grant tables haben folgenden
Aufbau.
| die
Tabelle user |
| User |
| Password |
| Select_priv |
| Insert_priv |
| Update_priv |
| Delete_priv |
| Index_priv |
| Alter_priv |
| Create_priv |
| Drop_priv |
| Grant_priv |
| References_priv |
| Reload_priv |
| Shutdown_priv |
| Process_priv |
| File_priv |
|
| die Tabelle
db |
| Db |
| User |
| Select_priv |
| Insert_priv |
| Update_priv |
| Delete_priv |
| Index_priv |
| Alter_priv |
| Create_priv |
| Drop_priv |
| Grant_priv |
|
| die Tabelle
tables_priv |
| Host |
| Db |
| User |
| Table_name |
| Grantor |
| Timestamp |
| Table_priv |
| Column_priv |
|
| die Tabelle
columns_priv |
| Host |
| Db |
| User |
| Table_name |
| Column_name |
| Column_priv |
| Timestamp |
|
Schauen wir uns an, was in den verschiedenen
Tabellen drin steht, nachdem wir die User Maria, tochter und
Sohn eingerichtet haben.
Die Tabelle user
mysql> select user,host,select_priv,shutdown_priv
from user;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
user
|
 |
host |
 |
select_priv
|
 |
shutdown_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
root |
 |
localhost
|
 |
Y |
 |
Y |
 |
 |
tocher |
 |
localhost
|
 |
N |
 |
N |
 |
 |
Maria |
 |
localhost
|
 |
N |
 |
N |
 |
 |
root |
 |
% |
 |
Y |
 |
Y |
 |
 |
sohn |
 |
localhost
|
 |
N |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
5 rows in set (0.00 sec)
mysql>
Für alle anderen Werte hätte
sich das gleiche Bild ergeben. Ausser für den User root
sind alle Spalten auf N wie no gesetzt. Die Tabelle db
mysql> select user,db,select_priv
from db;
 |
 |
 |
 |
 |
 |
 |
 |
user |
 |
db |
 |
select_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
test% |
 |
Y |
 |
 |
Maria |
 |
Marias_Datenbank
|
 |
Y |
 |
 |
 |
 |
 |
 |
 |
 |
2 rows in set (0.00 sec)
mysql>
Wir sehen, dass nur Maria als user für
diese Datenbank gelistet ist, nicht aber sohn und tochter,
obwohl diese ja eigentlich auch zugreifen sollen. Den Eintrag
test können wir vernachlässigen, den richtet mysql
automatisch ein, allerdings hat er von vorneherein keinen
Zugang zum mysql Server, so dass er unproblematisch ist. Wir
müssen uns nachher die genauen Zusammenhänge verdeutlichen,
aber hier scheint ein Problem vorzuliegen, dies könnte
der Grund sein, warum sohn und tochter nicht mal auf den mysql
Server zugreifen können. Schauen wir uns die dritte Tabelle
an.
Die Tabelle tables_priv
mysql> select db, user,table_name,column_priv
from tables_priv;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
db |
 |
user |
 |
table_name |
 |
column_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
Marias_Datenbank |
 |
tocher |
 |
tocher |
 |
|
 |
 |
Marias_Datenbank |
 |
sohn |
 |
sohn |
 |
|
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
2 rows in set (0.00 sec)
mysql>
Wir sehen also, dass in der Tabelle tables_priv
wiederum die user tochter und sohn gelistet sind zusammen
mit den Tabellen, auf die sie Zugriff haben. Weil es im folgenden
wichtig sein wird, schauen wir uns auch noch die Spalte tables_priv
an. Das heisst, das der User sohn und tochter alle
Rechte an ihren Tabellen haben.
mysql> select user, table_priv
from tables_priv;
 |
 |
 |
 |
 |
 |
user |
 |
table_priv |
 |
 |
 |
 |
 |
 |
 |
tocher |
 |
Select,Insert,Update,Delete,Create,Drop,References,Index,Alter
|
 |
 |
sohn |
 |
Select,Insert,Update,Delete,Create,Drop,References,Index,Alter |
 |
 |
 |
 |
 |
 |
2 rows in set (0.06 sec)
mysql>
Wir sehen, dass hier gelistet ist, was
der einzelne User in der Tabelle tun darf.
Betrachten wir zu guter letzt noch die Tabelle columns_priv.
mysql> select db,user,table_name,column_name
from columns_priv;
Empty set (0.06 sec)
mysql>
| Logische
Verknüpfungen der grant tables |
|
Diese Tabelle hat also gar keinen Eintrag,
weil dieser nicht nötig ist, da niemand ausschliesslich
Rechte auf Spaltenebene hat. Wir wissen nun also, wie die
Tabellen aufgebaut sind. Wüßten wir jetzt noch,
wie diese Tabellen zusammenhängen, dann könnten
wir den Fehler, die Tatsache, dass weder der User sohn noch
der User Tochter auf die Datenbank zugreifen kann, sicher
korrigieren. Machen wir uns also klar, wie die Verwaltung
der Benutzerrechte bei mysql funktionniert. Anschliessend
werden wir den Fehler, die Tatsache, dass sohn und tochter
nichtmal auf den mysql Server zugreifen können, sicher
korrigieren können. Zuerst einmal müssen wir uns
folgendes klar machen. Es gibt zwei Typen von Rechten. Rechte,
die die Administration des mysql Servers als solchen betreffen
(shutdown, grant etc. ) und solche, die die Administration
einer bestimmten Datenbank betreffen (alter, insert, delete,
select, drop). Der erste Typ ist völlig unproblematisch
und einfach einzusehen. Alle Rechte, die die Administration
des mysql Servers als solchen betreffen, stehen in der Tabelle
user. Wenn ein User in dieser Tabelle die entsprechenden Rechte
nicht hat, dann kann er diese administrativen Aufgaben eben
nicht wahrnehmen. Komplizierter ist es bei den Rechten, die
das Verwalten einer bestimmten Datenbank ermöglichen.
Wir stellen mit Verblüffung fest, dass sowohl in der
Tabelle user wie auch in der Tabelle db die gleichen Spalten
select_priv, insert_priv etc. etc. vorhanden sind. Wozu soll
das gut sein. Die Antwort hierauf ist einfach. Die Tabellen
haben eine Hierarchie. Wird in der Tabelle user festgestellt,
dass der entsprechende User select, insert, update etc. Rechte
hat, dann gilt dass für alle Datenbanken auf dem Server.
Folglich braucht auch gar nicht weiter geprüft werden.
Dies ist beim user root der Fall. Wird festgestellt, dass
er diese Rechte nicht hat, wird zur Tabelle db maschiert und
geschaut, ob er dort die entsprechenden Rechte hat, hat er
sie, wird die Tabelle tables_priv gar nicht aufgerufen. Hat
er sie dort nicht, wird weiter maschiert zu der Tabelle tables_priv
und geschaut, ob dort irgendwelche Rechte definiert sind,
wird dort was gefunden, darf er das, was dort definiert ist,
wenn nicht, wird weiter maschiert zur Tabelle columns_priv
und geschaut, ob dort etwas definiert ist. Unter diesem Gesichtspunkt
erscheinen uns die Tabellen nun auch logisch. Der user root
ist nur in der Tabelle user vorhanden. Da er hier sowieso
alle Rechte erhält, gibt es keine Notwendigkeit, ihn
in irgendeine der Folgetabellen einzutragen, sie werden in
seinem Fall eh nie durchsucht. Anders verhält es sich
mit dem user Maria. Sie hat in der Tabelle user keinerlei
Rechte zugewiesen bekommen, folglich wird ein zweiter Versuch
gestartet in der Tabelle db. Dort hat der User Maria die entsprechenden
Rechte und wird folglich durchgelassen. In der Tabelle tables_priv
erscheint sie nicht mehr, da diese eh nie nach dem User Maria
durchsucht wird, zumindest nicht im Zusammenhang mit der Datenbank
Marias_Datenbank, den für die Datenbank Marias_Datenbank
hat sie alle Rechte. Klar ist also, dass die Rechte immer
nur auf der Ebenen gelten, wo sie zugeordnet sind. Create
auf user Ebenen heisst, der user kann überall Tabellen
anlegen, create auf db Ebenen heisst, er kann Tabellen nur
auf der entsprechenden Datenbank anlegen usw.. Das Problem,
dass wir nun mit unseren usern sohn und tochter haben besteht
darin, dass mysql den Durchlauf abbricht, wenn der user in
einer Datenbank gar nicht auftaucht. Wir müssen also
die user sohn und tochter in die Tabelle db und user eintragen,
allerdings vergeben wir ihnen keine Rechte, den diese erhalten
sie erst in der Tabelle tables_priv. Wir melden also diese
beiden user in der Tabelle db an.
mysql> grant usage on Marias_Datenbank.* to sohn@localhost;
Query OK, 0 rows affected (0.16 sec)
mysql>
Das gleiche kann man mit dem user Tochter
wiederholen. Nun ist ein Zugriff auf den Server möglich.
C:\mysql\bin>mysql -u sohn -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
Wenn wir uns jetzt die Tabelle db nochmal
anschauen, sehen wir, dass der user sohn eingetragen wurde,
allerdings ohne irgendwelche Rechte auf dieser Ebene.
mysql> use mysql
Database changed
mysql> select user,host,select_priv,shutdown_priv from
user;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
user
|
 |
host |
 |
select_priv
|
 |
shutdown_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
root |
 |
localhost
|
 |
Y |
 |
Y |
 |
 |
tocher |
 |
localhost
|
 |
N |
 |
N |
 |
 |
Maria |
 |
localhost
|
 |
N |
 |
N |
 |
 |
root |
 |
% |
 |
Y |
 |
Y |
 |
 |
sohn |
 |
localhost
|
 |
N |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
5 rows in set (0.00 sec)
mysql>
Rekapitulieren wir nochmal
| 1. |
Melden wir einen User mit grant
all on Marias_Datenbank.* to Maria@localhost identified
by "mary"; an, wird Maria ohne Rechte
in die Tabelle user eingetragen. In der Tabelle db wird
registriert, dass sie für die Tabelle Marias_Datenbank
alle Rechte hat. In der Tabelle tables_priv und columns_priv
wird sie aber nicht eingetragen, da diese Tabellen in
dieser Konstellation ohnehin nicht abgeprüft werden,
wenn sich der user Maria einloggt. |
| 2. |
Melden wir einen User
grant all on Marias_Datenbank.tochter to tocher@localhost
identified by mary_tochter an, dann wird tochter
zwar in die Tabelle user, nicht aber in die Tabelle db
eingetragen. Das müssen wir dann mit
grant usage on Marias_Datenbank.* to sohn@localhost;
nachholen, da sonst überhaupt kein Zugriff auf die
Datenbank möglich ist. Dass der user tochter in der
Tabelle tables_priv richtig eingetragen wird, nützt
uns also erstmal wenig. |
Prüfen wir nochmal ob es tatsächlich
funktionniert.
C:\mysql\bin>mysql -u sohn -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use Marias_Datenbank;
Database changed
mysql> insert into sohn(Freunde,Geburtstag,Telefon) values
-> ("Balduin",1978-11-23,"030-3445345");
Query OK, 1 row affected (0.00 sec)
mysql> insert into tochter(Freunde,Geburtstag,Telefon)
values
-> ("Balduin",1978-11-23,"030-3445345");
ERROR 1142: insert command denied to user: 'sohn@localhost'
for table 'tochter'
mysql>
Wie deutlich zu sehen, ist ein Eintrag in die
Tabelle sohn für den user sohn zwar möglich, nicht
aber in die Tabelle tochter. Folglich ist es so, wie wir uns
das vorgestellt hatten.
Zugriff für nur bestimmte Spalten einer Tabelle erlauben
| Zugriff
nur auf bestimmte Spalten einer Tabelle erlauben |
|
Mit mysql ist es auch möglich, nur
auf bestimmte Spalten einer Tabelle einen Zugriff zu erlauben.
Denkbar ist, dass ein bestimmter user sich in der Tabelle
Freund nur die Spalten Freund und Geburtstag, nicht aber die
Spalte Telefon anschauen kann. Wir richten ihn folglich folgendermassen
ein.
C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 33 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use mysql
Database changed
mysql> grant select (Freunde,Geburtstag),update(Geburtstag)
on
-> Marias_Datenbank.sohn to balduin@localhost;
Query OK, 0 rows affected (0.11 sec)
mysql>
Was erwarten wir nun ? Wir erwarten, dass in
der Tabelle user der neue User Balduin eingetragen ist, allerdings
ohne Rechte. Aus dem vorherigen Abschnitt wissen wir, dass
in der Tabelle db, der User Balduin nicht vorhanden ist, obwohl
er da hin muss, weil er sonst nicht mal den mysql Server ansprechen
kann. In der Tabelle tables_priv hat der User Balduin keine
Rechte, folglich muss mysql auf der nächsten Stufe suchen,
in columns_priv, wo dann tatsächlich die Rechte definiert
sind. Schauen wir uns das im einzelnen. Anschliessend werden
wir den User Balduin noch ohne Rechte in die Tabelle db eintragen.
Weiter haben wir dem User Balduin kein Password zugeteilt.
Welche Auswirkungen das hat, müssen wir dann noch untersuchen.
Die Tabelle user
mysql> select user,host,select_priv,shutdown_priv
from user;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
user
|
 |
host |
 |
select_priv
|
 |
shutdown_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
root |
 |
localhost
|
 |
Y |
 |
Y |
 |
 |
tocher |
 |
localhost
|
 |
N |
 |
N |
 |
 |
Maria |
 |
localhost
|
 |
N |
 |
N |
 |
 |
root |
 |
% |
 |
Y |
 |
Y |
 |
 |
sohn |
 |
localhost
|
 |
N |
 |
N |
 |
 |
balduin |
 |
localhost
|
 |
N |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
6 rows in set (0.00 sec)
mysql>
Die Tabelle db
mysql> select user,db,select_priv from
db;
 |
 |
 |
 |
 |
 |
 |
 |
user |
 |
db |
 |
select_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
test% |
 |
Y |
 |
 |
Maria |
 |
Marias_Datenbank
|
 |
Y |
 |
 |
sohn |
 |
Marias_Datenbank |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
3 rows in set (0.00 sec)
mysql>
Die Tabelle tables_priv
mysql> select db,user,table_name,column_priv
from tables_priv;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
db
|
 |
user |
 |
table_name
|
 |
column_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
Marias_Datenbank |
 |
tocher |
 |
tocher |
 |
|
 |
 |
Marias_Datenbank |
 |
sohn |
 |
sohn |
 |
|
 |
 |
Marias_Datenbank |
 |
balduin |
 |
sohn |
 |
Select,Update |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
3 rows in set (0.05 sec)
mysql>
Die Tabelle columns_priv
mysql> select db,user,column_name,table_name,column_priv
from columns_priv;
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
db
|
 |
user |
 |
column_name |
 |
table_name
|
 |
column_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
Marias_Datenbank |
 |
balduin |
 |
Freunde |
 |
sohn |
 |
select |
 |
 |
Marias_Datenbank |
 |
balduin |
 |
Geburtstag |
 |
sohn |
 |
select update |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
2 rows in set (0.00 sec)
mysql>
Wir sehen also, dass der User Balduin
in der Tabelle tables_priv einen Eintrag hat, der angibt,
dass er in bestimmten Tabellen select und update durchführen
darf. Wo genau steht dann in columns_priv. Der user Balduin
hat, aus den oben erwähnten Gründen, noch keine
Zugriff auf den mysql Server.Wir melden ihn also in der Tabelle
db an.
mysql> grant usage on Marias__Datenbank.*
to balduin@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql>
Nachdem wir den Server mit mysqladmin
-u root -p shutdown herungergefahren und wieder anschliessend
mit mysqld wieder hochgefahren haben sind die Änderungen
aktiv. Wir versuchen nun als User Balduin einen Zugang zum
mysql Server zu erhalten.
C:\mysql\bin>mysql -u balduin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
Und tatsächlich, wir erhalten ihn,
sogar ohne die Eingabe eines Passwortes, was wir ja tatsächlich
auch nicht eingerichtet haben. Das ist zwar nicht besonders
schlimm, da der User Balduin eh nicht viel darf, er darf ja
nur in der Tabelle sohn der Datenbank Marias_Datenbank in
den Spalten Freunde und Geburtstag suchen sowie die Spalte
Geburtstag verändern, aber das gleiche hätte uns
auch mit anderen, wichtigen Datenbanken und Tabellen passieren
können. Im Moment kann jeder, der weiss, dass es den
User Balduin gibt, mit Balduin den mysql Server betreten.
Prüfen wir kurz, ob alles ordnungsgemäss funktionniert
und setzen dann für den User Balduin nachträglich
ein Passwort.
C:\mysql\bin>mysql -u balduin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql> use Marias_Datenbank;
Database changed
mysql> select Freunde,Geburtstag from sohn;
 |
 |
 |
 |
 |
 |
Freunde |
 |
Geburtstag |
 |
 |
 |
 |
 |
 |
 |
Balduin |
 |
0000-00-00 |
 |
 |
 |
 |
 |
 |
1 row in set (0.00 sec)
mysql> update sohn set Geburtstag="19791123";
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select telefon from sohn;
ERROR 1143: select command denied to user: 'balduin@localhost'
for column 'telef
on' in table 'sohn'
mysql>
Wie deutlich zu erkennen, kann select
und update mit den angegebenen Spalten durchgeführt werden.
Für die Spalte Telefon jedoch wurden keine Rechte vergeben
und folglich kann der User Balduin auf diese Spalte auch nicht
zugreifen. Setzen wir zum Abschluss noch ein Passwort für
den User Balduin.
C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> set password for balduin@localhost=password('Hunnenkoenig');
Query OK, 0 rows affected (0.00 sec)
mysql>
Nachdem wir diese Änderung durchgeführt
haben, muss sich auch der User Balduin durch ein Password
authentifizieren.
C:\mysql\bin>mysql -u balduin -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
Wollen wir dem User tochter alle Rechte an der Datenbank Marias_Datenbank
geben, führen wir einfach den grant Befehl entsprechen
aus.
C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use mysql
Database changed
mysql> grant all on Marias_Datenbank to tochter@localhost";
Query OK, 0 rows affected (0.00 sec)
mysql>
Danach kann der User tochter auf jede
Tabelle der Datenbank Marias_Datenbank zugreifen.
C:\mysql\bin>mysql -u tochter -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use Marias_Datenbank
Database changed
mysql> select * from sohn;
 |
 |
 |
 |
 |
 |
 |
 |
Freunde |
 |
Geburtstag |
 |
Telefon |
 |
 |
 |
 |
 |
 |
 |
 |
 |
Balduin |
 |
1979-11-23 |
 |
030-3445345 |
 |
 |
 |
 |
 |
 |
 |
 |
1 row in set (0.33 sec)
mysql> insert into sohn values ("Hans","1976-08-07","3847444");
Query OK, 1 row affected (0.06 sec)
Nehmen wir mal an, das war zuviel des
Guten. Der User tochter soll die Tabelle sohn in Marias Datenbank
zwar lesen, aber nicht verändern dürfen, weder update
noch insert. Folglich müssen wir dem User tochter wieder
Rechte entziehen. Damit der User Maria aber das Recht hat,
die Benutzerrechte an der Datenbank Marias_Datenbank zu ändern,
wir haben alle grant Befehle bis jetzt als User root ausgeführt,
muss der User root aber Maria erstmal das Recht geben, die
Rechte zu ändern. Bis jetzt hat sie dieses Recht noch
nicht.
C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use mysql
Database changed
mysql> select db,user,Grant_priv from db;
 |
 |
 |
 |
 |
 |
 |
 |
db |
 |
user |
 |
Grant_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
test% |
 |
|
 |
N |
 |
 |
Marias_Datenbank |
 |
Maria |
 |
N |
 |
 |
Marias_Datenbank |
 |
sohn |
 |
N |
 |
 |
Marias_Datenbank |
 |
balduin |
 |
N |
 |
 |
Marias_Datenbank |
 |
tochter |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
5 rows in set (0.05 sec)
mysql>
Wenn wir Maria also das Recht zuweisen
wollen, anderen Usern Rechte an Ihrer Datenbank zu entziehen,
dann müssen wir sowas in der Art machen. Natürlich
müssen wir uns hierfür erstmal als User root einloggen.
mysql> grant grant option on Marias_Datenbank.*
to Maria@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> use mysql
Database changed
mysql> select db,user,Grant_priv from db;
 |
 |
 |
 |
 |
 |
 |
 |
db |
 |
user |
 |
Grant_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
test% |
 |
|
 |
N |
 |
 |
Marias_Datenbank |
 |
Maria |
 |
Y |
 |
 |
Marias_Datenbank |
 |
sohn |
 |
N |
 |
 |
Marias_Datenbank |
 |
balduin |
 |
N |
 |
 |
Marias_Datenbank |
 |
tochter |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
5 rows in set (0.00 sec)
mysql>
Wie deutlich zu sehen, hat Maria jetzt
das Recht, selber grant Rechte zu vergeben, bzw. zu entziehen.
Nun kann der User Maria dem user tochter die Rechte für
update und insert entziehen.
mysql> revoke all on Marias_Datenbank.*
from tochter@localhost;
Query OK, 0 rows affected (0.05 sec)
Nachdem die globalen
Rechte in der Tabelle db entzogen sind, was wir gleich noch
kontrollieren, können wir im zweiten Schritt die entsprechenden
Rechte Rechte wieder zuweisen.
mysql> select db,user,select_priv from db;
 |
 |
 |
 |
 |
 |
 |
 |
db |
 |
user |
 |
Grant_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
test% |
 |
|
 |
Y |
 |
 |
Marias_Datenbank |
 |
Maria |
 |
Y |
 |
 |
Marias_Datenbank |
 |
sohn |
 |
N |
 |
 |
Marias_Datenbank |
 |
balduin |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
4 rows in set (0.00 sec)
mysql>
Wie deutlich zu sehen, war das zuviel
des Guten. Nun ist der tochter user in der Tabelle db gar
nicht mehr enthalten, das heisst, er kann die Datenbank gar
nicht mehr betreten. Wir richten ihn also ohne Rechte wieder
ein. Revoke funktionniert nur so. Rechte müssen
erstmal komplett entzogen und dann wieder zugewiesen werden.
mysql> grant usage on Marias_Datenbank.*
to tochter@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql>
Jetzt ist er als user
wieder vorhanden, wenn auch ohne Rechte.
mysql> select db,user,select_priv from db;
 |
 |
 |
 |
 |
 |
 |
 |
db |
 |
user |
 |
Grant_priv |
 |
 |
 |
 |
 |
 |
 |
 |
 |
test% |
 |
|
 |
Y |
 |
 |
Marias_Datenbank |
 |
Maria |
 |
Y |
 |
 |
Marias_Datenbank |
 |
sohn |
 |
N |
 |
 |
Marias_Datenbank |
 |
balduin |
 |
N |
 |
 |
Marias_Datenbank |
 |
tochter |
 |
N |
 |
 |
 |
 |
 |
 |
 |
 |
5 rows in set (0.00 sec)
mysql>
Nebenbemerkung:
Der Befehl
grant update(Freunde,Geburtstag),insert(Freunde,Geburtstag)
on Marias_Datenbank.sohn to tochter@localhost
macht einen Eintrag in die Tabelle tables_priv,
aber keinen in die Tabelle Marias_Datenbank. Der Befehl
grant update(Freunde,Geburtstag),insert(Freunde,Geburtstag)
on Marias_Datenbank.* to tochter@localhost
macht eine Eintrag in die Tabelle db.
Das gleiche gilt leider auch für revoke. Will man einem
user, der alle Rechte an der Datenbank hat nur noch Rechte
an einer Tabelle zuweisen, dann muss man zuerst, den Eintrag
in der Tabelle db revidieren und ihm dann in der Tabelle tables_priv
die Rechte wieder zuweisen. mysql erkennt die logischen Strukturen
im Moment noch nicht alleine. Soll der user in der Tabelle
sohn als jetzt Rechte eingeräumt bekommen, können
wir sie ihm jetzt, nachdem wir ihm die globalen Rechte in
der Tabelle db entzogen haben, wieder zuweisen.
mysql> grant update(Freunde,Geburtstag),
insert(Freunde,Geburtstag),
-> select (Freunde,Geburtstag) on Marias_Datenbank.sohn
to
-> tochter@localhost;
Query OK, 0 rows affected (0.05 sec)
mysql>
Jetzt kann der user Tochter auch in der
Tabelle sohn Datensätze eintragen.
C:\mysql\bin>mysql -u tochter -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.28-gamma-debug
Type 'help;' or '\h' for help. Type '\c'
to clear the buffer
mysql>
mysql> use Marias_Datenbank;
Database changed
mysql> insert into sohn (Freunde,Geburtstag) values
-> ("Helmut Kohl","1944-02-11");
Query OK, 1 row affected (0.05 sec)
mysql>
|