Kurz und gut – Episode #07 Das spielt keine Rolle: Warum bekommt mein MySQL User keine Rechte über seine Rollen?
Ich werde in Seminaren, Workshops oder in Kundenprojekten in Sachen MySQL immer mal wieder mit Dingen konfrontiert, auf die ich ad hoc keine Antwort habe bzw. mit denen ich noch keine Erfahrung gesammelt habe.
Das Problem
Im Rahmen einer Übung innerhalb unseres MySQL-Seminars ist ein Kunde in das folgende Problem gelaufen. Er hat ein kleines Rollenkonzept entwickelt und einem User eine Rolle zugewiesen, über die dieser einige Rechte bekommen sollte. Nach dem Login mit dem User-Account standen diese Rechte jedoch nicht zur Verfügung.
Die Lösung
Hier ein kleines Testszenario zur Lösung des Problems. Wir nutzen als Datenbasis wie so oft die MySQL Test-Datenbank „sakila“:
mysql> create role ro_sakila; Query OK, 0 rows affected (0.01 sec) mysql> grant select on sakila.* to 'ro_sakila'; Query OK, 0 rows affected (0.01 sec) mysql> create user 'user1'@'localhost' identified by 'geheim'; Query OK, 0 rows affected (0.01 sec) mysql> grant ro_sakila to 'user1'@'localhostx Query OK, 0 rows affected (0.02 sec)
Unser Kunde erwartete, dass der User „user1“ nun lesenden Zugriff auf sämtliche Tabellen der „sakila“-DB hatte:
mysql -uuser1 -pgeheim -Dsakila ERROR 1044 (42000): Access denied for user 'user1'@'localhost' to database 'sakila'
Jedoch kommt es bereits bei der Anmeldung an dem Server und der Auswahl der DB „sakila" (hier über den Parameter „-Dsakila") zu einem Fehler.
Dies liegt daran, dass Rollen einem Anwender nicht per Default zugewiesen bzw. aktiviert werden. Der User muss sich in unserem Beispiel „neutral" (also ohne sich direkt mit einer Datenbank zu verbinden) einloggen, seine Rolle „aktiveren" und kann dann erst mit der gewünschten Datenbank interagieren:
bash-4.4# mysql -uuser1 -pgeheim mysql> set role ro_sakila; Query OK, 0 rows affected (0.00 sec) mysql> use sakila mysql> select count(*) from film; +----------+ | count(*) | +----------+ | 1000 | +----------+ 1 row in set (0.00 sec)
Alternativ kann einem User eine Rolle aber auch per Default zugewiesen werden. Dies muss dann vom DBA (oder demjenigen, der die Rechte vergibt) übernommen werden:
mysql> alter user 'user1'@'localhost' default role ro_sakila; Query OK, 0 rows affected (0.00 sec) bash-4.4# mysql -uuser1 -pgeheim -Dsakila -e"select count(*) from film" +----------+ | count(*) | +----------+ | 1000 | +----------+
Als User bekommt man wie folgt einen Überblick über die gesetzten und verfügbaren Rollen:
mysql> select user(), current_role(); +-----------------+-----------------+ | user() | current_role() | +-----------------+-----------------+ | user1@localhost | `ro_sakila`@`%` | +-----------------+-----------------+ 1 row in set (0.00 sec) mysql> set role all; Query OK, 0 rows affected (0.00 sec) mysql> select user(), current_role(); +-----------------+---------------------------------+ | user() | current_role() | +-----------------+---------------------------------+ | user1@localhost | `ro_sakila`@`%`,`rw_sakila`@`%` | +-----------------+---------------------------------+ 1 row in set (0.00 sec)
Fazit
Kein großes Problem. MySQL verhält sich hier ggf. etwas anders als andere Datenbanken. Rollen sind nicht zwangsläufig aktiv. Sofern der DBA keine Default-Rollen vergeben hat, müssen sie vom User aktiv „gesetzt“ werden.
Sie haben Fragen zu MySQL? Stellen Sie diese gerne direkt in den Kommentaren!
Seminarempfehlung
MYSQL ADMINISTRATION DB-MY-01
Zum SeminarPrincipal Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare