[アップデート] Amazon RDS for MySQL でも rds_superuser_role がサポートされるようになりました

2024.04.11

いわさです。

先日のアップデートで Amazon RDS for MySQL が rds_superuser_role をサポートしたとアナウンスがありました。

私は前に別件で rds_superuser_role を触った記憶があり、「あれ、前から使えなかったっけ」と感じまして、過去バージョン含め検証してみることにしました。

RDS for MySQL でのバージョンごとに検証してみた

アナウンスやドキュメントによると RSD for MySQL のバージョン 8.0.36 以上(執筆時点の最新バージョンは 8.0.36)でこのロールが有効になっているようです。
そこで本日は次のように 8.0.35 と 8.0.36 の環境を用意して検証してみることにしました。

ロールの確認

RDS for MySQL の初期構築時に払い出されたマスターユーザーで接続し、ロールを確認してみました。
結果、8.0.35 では NONE、8.0.36 ではrds_superuser_roleが割り当てられていました。

8.0.35 での CURRETN_ROLE() 結果

% mysql -h hoge0411rds35.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -u admin -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.03 sec)

8.0.36 での CURRETN_ROLE() 結果

% mysql -h hoge0411rds36.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -u admin -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.36 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.03 sec)

権限の確認

続いて、マスターユーザーの権限の変更点があるか確認してみることにしました。

8.0.35 のマスターユーザー権限

mysql> show grants for 'admin';
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for admin@%                                                                                                                                                                                                                                                                                                              |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO `admin`@`%` WITH GRANT OPTION |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

こちらは次の公式ドキュメントに記載のとおりですね。

8.0.36 でのマスターユーザーおよび rds_superuser_role 権限

一方で、8.0.36 の場合はマスターユーザーの確認結果は次のようになりました。

mysql> mysql> show grants for 'admin';
+-----------------------------------------------+
| Grants for admin@%                            |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `admin`@`%`             |
| GRANT `rds_superuser_role`@`%` TO `admin`@`%` |
+-----------------------------------------------+
2 rows in set (0.04 sec)

rds_superuser_roleロールが付与されていますね。
では、ロールの権限も確認してみます。

mysql> show grants for 'rds_superuser_role';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for rds_superuser_role@%                                                                                                                                                                                                                                                                                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON *.* TO `rds_superuser_role`@`%` WITH GRANT OPTION |
| GRANT APPLICATION_PASSWORD_ADMIN,ROLE_ADMIN,SET_USER_ID,XA_RECOVER_ADMIN ON *.* TO `rds_superuser_role`@`%` WITH GRANT OPTION                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

8.0.35 のマスターユーザー権限と比較するとだいたい同じに見えますが、CREATE ROLEDROP ROLEROLE_ADMINなどのロール周りの権限などが追加で付与されています。

何が変わるのか

まず、MySQL 8.0 から権限の名前付きコレクションである「ロール」が使えるようになっています。

ロールの導入がしやすくなっている

そして、今回マスターユーザーのロールにいくつか権限が追加されていることでロールの導入がしやすくなっています。

8.0.35 でマスターユーザーによるロール割り当て

アップデート前の 8.0.35 までは、マスターユーザーのデフォルトではロールの割り当てが出来ない状態でした。

mysql> CREATE ROLE 'hoge_role';
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE USER 'hogeadmin'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT 'hoge_role'@`%` TO `hogeadmin`@`%`;
ERROR 1227 (42000): Access denied; you need (at least one of) the WITH ADMIN, ROLE_ADMIN, SUPER privilege(s) for this operation

割り当てに失敗しますね!
どうやら ROLE_ADMIN が不足しているようです。

8.0.36 でマスターユーザーによるロール割り当て

これが、8.0.36 だとデフォルトでそのまま割り当てまで行うことが出来ました。

mysql> CREATE ROLE 'hoge_role';
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE USER 'hogeadmin'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT 'hoge_role'@`%` TO `hogeadmin`@`%`;
Query OK, 0 rows affected (0.02 sec)

管理権限ユーザー作成時にロールを利用可能

また、従来 RDS for MySQL で管理権限ユーザーを作成したい場合は次のナレッジセンターのようにマスターユーザーの権限を取得して全て GRANT する必要がありました。

8.0.35 での管理ユーザー作成方法

mysql> CREATE USER 'hogeadmin'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.04 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO `hogeadmin`@`%` WITH GRANT OPTION;
Query OK, 0 rows affected (0.04 sec)

8.0.36 での管理ユーザー作成方法

8.0.36 以降では次のようにロールを割り当てるだけで良いです。

mysql> CREATE USER 'hogeadmin'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT USAGE ON *.* TO `hogeadmin`@`%`;
Query OK, 0 rows affected (0.04 sec)

mysql> GRANT `rds_superuser_role`@`%` TO `hogeadmin`@`%`;
Query OK, 0 rows affected (0.04 sec)

今まで rds_superuser_role が使えていたのは Aurora MySQL だった

今回調べて気がついたのですが、これまで rds_superuser_role が使えていたのは Aurora MySQL 3 でした。
おそらく私は Aurora と記憶違いしていたようです。

念の為 Aurora MySQL を作成して同じようにマスターユーザーの権限周りを確認してみました。

% mysql -h hoge0411aurora3.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -u admin -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 149
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.04 sec)

mysql> select user, host from mysql.user;
+-----------------------+-----------+
| user                  | host      |
+-----------------------+-----------+
| AWS_COMPREHEND_ACCESS | %         |
| AWS_LAMBDA_ACCESS     | %         |
| AWS_LOAD_S3_ACCESS    | %         |
| AWS_SAGEMAKER_ACCESS  | %         |
| AWS_SELECT_S3_ACCESS  | %         |
| admin                 | %         |
| rds_superuser_role    | %         |
| mysql.infoschema      | localhost |
| mysql.session         | localhost |
| mysql.sys             | localhost |
| rdsadmin              | localhost |
+-----------------------+-----------+
11 rows in set (0.03 sec)

mysql> show grants for 'rds_superuser_role';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for rds_superuser_role@%                                                                                                                                                                                                                                                                                                                                      |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE ROLE, DROP ROLE ON *.* TO `rds_superuser_role`@`%` WITH GRANT OPTION |
| GRANT APPLICATION_PASSWORD_ADMIN,CONNECTION_ADMIN,REPLICATION_APPLIER,ROLE_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,XA_RECOVER_ADMIN ON *.* TO `rds_superuser_role`@`%` WITH GRANT OPTION                                                                                                                                                              |
| GRANT `AWS_COMPREHEND_ACCESS`@`%`,`AWS_LAMBDA_ACCESS`@`%`,`AWS_LOAD_S3_ACCESS`@`%`,`AWS_SAGEMAKER_ACCESS`@`%`,`AWS_SELECT_S3_ACCESS`@`%` TO `rds_superuser_role`@`%`                                                                                                                                                                                                 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.03 sec)

Aurora MySQL のエンジンバージョンは 8.0.28 ですが、こちらは rds_superuser_role が既に使えていますね。

さいごに

本日は Amazon RDS for MySQL でも rds_superuser_role がサポートされるようになったので RDS for MySQL と Aurora MySQL で検証してみました。

RDS for MySQL 8.0.36 以上あるいは Aurora MySQL の場合は rds_superuser_role ロールを使って簡単に管理者を作成出来たり、あるいはデフォルトからロールの導入がしやすくなっています。

ぜひ使ってみてください!