そろばんのしょ(第3版第2刷)

雑魚い見習いDBAの日々学んだことや、どーでもいいことを。基本は自分の備忘録。

いい加減MySQL8.0のRoleを理解する。その1

最近権限付与周りの依頼が来たときにMySQL8.0だった場合にROLEを理解してないのでそっと隣の人か斜め前の人にやってもらうことが多々あるのでいい加減ROLEを理解する。 たぶんその3くらいまでやる。

参考にするのはこちらの公式ドキュメント

MySQL :: MySQL 8.0 Reference Manual :: 6.3.4 Using Roles

ROLEを作成してみる

まずロールの追加、削除はCREATE,DROPでできる。当たり前だけどHOST名とかはいらない

mysql>CREATE ROLE test_role;
Query OK, 0 rows affected (0.01 sec)

mysql>DROP ROLE test_role;
Query OK, 0 rows affected (0.01 sec)

GRANTとREVOKEで権限の割当や取消ができる。 とりあえずSELECTを与えてみる。

mysql>CREATE ROLE select_role;
Query OK, 0 rows affected (0.00 sec)

mysql>GRANT SELECT on d1.* to select_role;
Query OK, 0 rows affected (0.00 sec)

なるほど。ほぼユーザー作成と権限付与をするときと一緒か。

実際に作って権限を与えてみる。

// とりあえずユーザーを作って。
mysql>CREATE USER fukamachi@localhost identified with mysql_native_password by '******';
Query OK, 0 rows affected (0.01 sec)

mysql>GRANT 'select_role' to fukamachi@localhost;
Query OK, 0 rows affected (0.00 sec)

できたっぽい。 付与されたROLEを確認するには今まで通りSHOW GRANTSで確認すればいいっぽい

mysql>SHOW GRANTS for fukamachi@localhost;
+----------------------------------------------------+
| Grants for fukamachi@localhost                     |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `fukamachi`@`localhost`      |
| GRANT `select_role`@`%` TO `fukamachi`@`localhost` |
+----------------------------------------------------+
2 rows in set (0.00 sec)

select_roleが割り当てられてる。ログインできるか確認する。

$ MYSQL_PWD='******' mysql --defaults-file=/etc/mysql/my.cnf -ufukamachi
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 76
Server version: 8.0.14 MySQL Community Server - GPL
(省略)

できた。実際にSELECTしてみる。

mysql>use d1;
ERROR 1044 (42000): Access denied for user 'fukamachi'@'localhost' to database 'd1'
mysql>SELECT * FROM d1.t1 limit 10;
ERROR 1142 (42000): SELECT command denied to user 'fukamachi'@'localhost' for table 't1'

…できない…わからない…

調べてみると、どうも権限を付与しただけはROLEが有効になるわけではない。SET ROLEが必要らしい。 とりあえずSET ROLEして有効化してみる。

(さっき作ったfukamachiユーザーでログイン)
mysql> SET ROLE select_role;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM d1.t1 limit 10;
+----+------------+
| id | value      |
+----+------------+
|  1 | C8vAt5qSyl |
|  2 | 15mtFfSGuz |
|  3 | 96ZFZ0451W |
|  4 | ZHM6qMQRXI |
|  5 | xMkqCVFgOT |
|  6 | FWBCUry1FW |
|  7 | Uoa5Y1sOPK |
|  8 | DoCkXtvZSj |
|  9 | JdiF94D1t2 |
| 10 | dwqV6ykt54 |
+----+------------+
10 rows in set (0.00 sec)

できた。

もちろんinsertはできない。

mysql> INSERT INTO d1.t1(value) VALUES ('insert_test');
ERROR 1142 (42000): INSERT command denied to user 'fukamachi'@'localhost' for table 't1'

とりあえず今日はここまで。