Amazon RDS for MariaDB ではデータベースレベルのGRANT ALL PRIVILEGESが許可されていないので個別に指定すると良い

2022.04.12

いわさです。

Amazon RDSを構築しユーザー作成などなどしていたのですが、RDS for MariaDBでは管理ユーザーによるGRANT ALL PRIVILEGESが出来ないことを知りました。
本日はその対処方法と、色々試したことなどを共有します。

失敗する

やりたいこととしては、データベース用の管理者ユーザーを追加しようとしました。

mysql> create user 'user_name'@'10.0.0.156' identified by 'hogehoge';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all  on hogedb.* to 'user_name'@'10.0.0.156' with grant option;
ERROR 1044 (42000): Access denied for user 'admin'@'%' to database 'hogedb'

ちなみにRDS for MaridDBのバージョンは10.6.7です。

対処方法

RDSが初期作成する管理ユーザーはALL PRIVILEGESが指定されていないです。
管理者ユーザーを作成したい場合は、以下のナレッジセンターのように現在のマスターユーザーからアクセス許可のリストを取得しコピーする必要があります。

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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, BINLOG MONITOR, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, SLAVE MONITOR ON *.* TO `admin`@`%` IDENTIFIED BY PASSWORD 'hogehoge' WITH GRANT OPTION |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

サーバー全体に対してであれば同じ権限をつければ、RDS管理者と同様の権限になります。

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

他の環境

他の環境はどうなのだろうかと思い、試してみました。
結論としてはRDS for MySQLはALL PRIVILEGESが出来ます。非RDSなMariaDBはRDSと同じ権限の管理ユーザーの場合は同じ挙動となりました。

非RDSなMariaDB

初期作成されるrootユーザーの権限は以下のようになっています。

+-----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost|
+-----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING 'invalid' OR unix_socket WITH GRANT OPTION|
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION|
+-----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)

ここで、RDS for MariaDB相当のユーザーを作ってみます。

MariaDB [(none)]> create user 'admin'@'localhost' identified by 'hogehoge';
Query OK, 0 rows affected (0.004 sec)

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES,LOCK TABLES, EXECUTE, REPLICATION SLAVE, BINLOG MONITOR, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, SLAVE MONITOR ON *.* TO `admin`@`localhost` WITH GRANT OPTION;
Query OK, 0 rows affected (0.001 sec)

では、作成した管理者用のユーザーを使ってhogedb用の管理ユーザーを作成してみましょう。

MariaDB [(none)]> create user 'user_name'@'10.0.0.156' identified by 'password';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant all on hogedb.* to 'user_name'@'10.0.0.156' with grant option;
ERROR 1044 (42000): Access denied for user 'admin'@'localhost' to database 'hogedb'

RDSと同様に失敗しました。
先程作成した管理ユーザーへALL PRIVILEGESを指定してみるとどうでしょうか。

+-----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for admin@localhost|
+-----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `admin`@`localhost` IDENTIFIED BY PASSWORD 'hogehoge' WITH GRANT OPTION|
+-----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)

MariaDB [(none)]> grant all on hogedb.* to 'user_name'@'10.0.0.156' with grant option;
Query OK, 0 rows affected (0.001 sec)

今度は成功しましたね。
RDSはALL PRIVILEGESが指定されていないので失敗しているという感じです。

RDS for MySQLだと出来る

RDS for MariaDBと同じことをRDS for MySQLでも行ってみます。
まずは初期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 |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

若干違う項目が1〜2個あるのですが、概ね同じです。
では、ユーザーを追加してみます。

mysql> create user 'user_name'@'10.0.0.54' identified by 'hogehoge';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all on hogedb.* to 'user_name'@'10.0.0.54' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants;
+---------------------------------------------------------------------------------+
| Grants for user_name@10.0.0.54                                                  |
+---------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user_name`@`10.0.0.54`                                   |
| GRANT ALL PRIVILEGES ON `hogedb`.* TO `user_name`@`10.0.0.54` WITH GRANT OPTION |
+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

こちらはALL PRIVILEGESを使うことができました。
hogedbに対してはALL PRIVILEGESが指定されていますね。

さいごに

本日はRDS for MariaDBで個別にユーザーを作成した際に、GRANT ALL PRIVILEGESが出来ない問題を少し調べてみました。
今回の事象はRDSにおける管理ユーザーの権限と、MySQLとMariaDBの挙動の違いから起きる事象のようです。
RDSにおけるユーザー権限の制限はわからなくもなかったのですが、MySQLとMariaDBで挙動が違うのは知らなかったです。覚えておきたいと思います。