GA

2018/10/29

MySQLのロール周りのあれこれ

TL;DR

  • デフォルトロールはログイン時に有効化
  • mandatory_roles はログイン時に有効化されない、全ユーザーから SET ROLE できるロール
  • ロールのホスト部は意味を持たないような気がする( role@127.0.0.1192.168.0.0 なアカウントにも割り当てができる)
  • activate_all_roles_on_login = ON にすると、デフォルトロールも割り当てたロールも mandatory_roles も全部いっぺんにログイン時に有効になる
ロールの有効化 ロールの作成 ロールの割り当て 割り当ての解除
ロール SET ROLE CREATE ROLE GRANT REVOKE
デフォルトロール ログイン時 CREATE ROLE CREATE USER .. DEFAULT ROLE または GRANT && ALTER USER .. DEFAULT ROLE REVOKE
必須ロール SET ROLE CREATE ROLE mandatory_roles を設定した時に自動で mandatory_roles からなくなった時に自動で

デフォルトロールとか必須ロールとかごちゃごちゃしてきたのでメモ。
  • フツーに CREATE ROLE して CREATE USER .. && GRANT <role_name> で与える場合、 GRANT したタイミングで mysql.role_edgesINSERT される
  • 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_rolesREVOKE したり 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 件のコメント :

コメントを投稿