TL;DR
- デフォルトロールはログイン時に有効化
- mandatory_rolesはログイン時に有効化されない、全ユーザーから- SET ROLEできるロール
- ロールのホスト部は意味を持たないような気がする( role@127.0.0.1は192.168.0.0なアカウントにも割り当てができる)
- activate_all_roles_on_login = ONにすると、デフォルトロールも割り当てたロールも- mandatory_rolesも全部いっぺんにログイン時に有効になる
| ロールの有効化 | ロールの作成 | ロールの割り当て | 割り当ての解除 | |
|---|---|---|---|---|
| ロール | SET ROLE | CREATE ROLE | GRANT | REVOKE | 
| デフォルトロール | ログイン時 | CREATE ROLE | CREATE USER .. DEFAULT ROLE または GRANT | REVOKE | 
| 必須ロール | SET ROLE | CREATE ROLE | mandatory_rolesを設定した時に自動で | mandatory_rolesからなくなった時に自動で | 
デフォルトロールとか必須ロールとかごちゃごちゃしてきたのでメモ。
- フツーに CREATE ROLEしてCREATE USER ..&&GRANT <role_name>で与える場合、GRANTしたタイミングでmysql.role_edgesにINSERTされる
- CREATE ROLEして- CREATE USER .. DEFAULT ROLE ..した場合、- CREATE USERのタイミングで- mysql.role_edgesに入る
- SET GLOBAL mandatory_roles ..の場合は- mysql.role_edgesには入らない
存在しないロールを 
SET GLOBAL mandatory_roles で指定すると↓のエラーになる(ただしステートメントはエラーにならず、エラーログにピヨッと現れるだけ)2018-10-29T02:23:39.444341Z 108 [Warning] [MY-010968] [Server] Can't set mandatory_role: There's no such authorization ID role@localhost.
mandatory_roles を REVOKE したり DROP ROLE しようとしたりすると怒られる。mysql80 120> REVOKE role@localhost FROM yoku0825;
ERROR 3628 (HY000): The role `role`@`localhost` is a mandatory role and can't be revoked or dropped. The restriction can be lifted by excluding the role identifier from the global variable mandatory_roles.
mandatory_roles はコンマ区切りで複数指定可能。ただし、ロールのホスト部でフィルタリングがかけられるわけではない。
mysql80 127> SET GLOBAL mandatory_roles = 'role@1.2.3.4,role@localhost';
Query OK, 0 rows affected (0.02 sec)
$ mysql80 -uyoku0825
mysql80 130> SHOW GRANTS;
+---------------------------------------------------------------------+
| Grants for yoku0825@localhost                                       |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `yoku0825`@`localhost`                        |
| GRANT `role`@`1.2.3.4`,`role`@`localhost` TO `yoku0825`@`localhost` |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql80 130> SET ROLE role@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql80 130> SET ROLE role@1.2.3.4; <-- localhost != 1.2.3.4 だけど判定されないSET ROLEできる
Query OK, 0 rows affected (0.00 sec)
とするとアレかね、
- GRANT SELECT ON d1.* TO read_only_role
- SET GLOBAL mandatory_roles = read_only_role
- GRANT ALL ON d1.* TO read_write_role
- CREATE USER apuser DEFAULT ROLE read_write_role
- CREATE USER dev1 IDENTIFIED BY ..
とかやると、 
apuser はデフォルトで読み書き可能、新規追加するアカウント(たとえば dev1 の次に dev2 とか)はデフォルトで読み取りのみ可能(なロールに SET ROLE できる)、とかの表現になるのか。
あるいは、 
activate_all_roles_on_login = ON しておくと SET ROLE read_only_role とかしなくてもデフォルトで読み取りだけ可能とかになる、と。 
0 件のコメント :
コメントを投稿