Aurora 3.x(MySQL 8.x)で新設されたロールベースの権限付与は、便利だが一点ハマりポイントがあるので共有。
最初に結論
ロールをアクティベートすることを忘れないこと。
権限ベースの時と違って、GRANTだけでは権限が有効にならない。
設定方法
大きく分けて、4種類ある。詳しくは本家の公式ドキュメントを参照。
ちなみにAuroraの公式ドキュメントにも、ちょっぴりだけ記載がある。もうちょっと丁寧に書いといてくれるとハマらずに済むのだが。。。
To simplify managing permissions for many users or applications, you can use the CREATE ROLE statement to create a role that has a set of permissions. Then you can use the GRANT and SET ROLE statements and the current_role function to assign roles to users or applications, switch the current role, and check which roles are in effect.
方法1) SET ROLEで一時的にセット
当該セッションでのみアクティベートされる。
SET ROLE rds_superuser_role;
方法2) SET DEFAULT ROLEで恒久的にセット
そのユーザーについては恒久的にアクティベートされる。
SET DEFAULT ROLE 'rds_superuser_role' TO <ユーザー名>;
方法3) パラメーターグループでセット
activate_all_roles_on_login
を1にセットすると、クラスター内の全てのユーザーに対して、既定でアクティベートされる。おそらくこれが一番楽。
ちなみにDBパラメーターグループの方にあり、デフォルト値は0
(Aurora MySQL 3.03.1の頃に新規作成したDBパラメーターグループで確認)。
設定例
よい設定例
GRANT rds_superuser_role TO 'aurora_dba_user'@'%';
SET DEFAULT ROLE 'rds_superuser_role' TO 'aurora_dba_user'@'%';
悪い設定例
GRANT rds_superuser_role TO 'aurora_dba_user'@'%';
確認方法
SELECT current_role();
を使って、ロールがアクティベートされているかを確認できる。
結果がNONE
だとアクティベートされてません。
SELECT current_role();
+--------------------------+
| current_role() |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
ちなみにSHOW GRANTS
だけでは全く見分けが付かないので注意。
- マスターユーザーと同じ権限割り当てなのに...
-
SHOW GRANTS FOR rds_superuser_role
見ても内容同じだし...
という感じで、しばらく悩んだ。
まとめ
デフォルトのマスターユーザーを使うことは推奨されていないので、同権限のDBAユーザーを作ることになると思うが、その際の要注意ポイントのひとつ。
また、マルチユーザー戦略のシークレットローテーションを使う場合のローテーションユーザーでも、同じく注意が必要。