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 件のコメント :
コメントを投稿