RDSのMariaDBでの権限付与でハマった話

D
2022-11-14
2022-11-14

おつかれさまです。Dです。

WordPressやMT(Movable Type)を新規にインストールする際等に、管理者用のDBユーザを作ることがよくあると思います。
その際にRDSのMariaDBエンジンにて「grant all」コマンドで手軽にDBの全権限を付与しようと思ったらエラーが出て萎えました。
今回はそのエラーの回避方法を説明していきます。

■RDS(MariaDBエンジン)

・RDSのMariaDBにてgrant allを実行するとエラー発生


MariaDB [(none)]> grant all privileges on test.* to MariaDBuser@'%';
ERROR 1044 (42000): Access denied for user 'admin'@'%' to database 'test'

・DBを作った際の管理者ユーザを確認すると個別に権限が付与されている


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, BINLOG MONITOR, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, SLAVE MONITOR ON *.* TO `admin`@`%` IDENTIFIED BY PASSWORD '*4160A8BDFA7A13BA8EE3042E475C8B49E4986BC7' WITH GRANT OPTION |

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 MariaDBuser@'%' with grant option;

・上記で確認した管理者ユーザの権限を個別で付与するコマンドを実行するが失敗



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 test.* to MariaDBuser@'%' with grant option;

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

・DB指定していたので、ワイルドカードでサーバ全体に付与すると成功


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 test.* to MariaDBuser@'%' with grant option;

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 MariaDBuser@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)

・権限確認すると正常に付与されている


show grants for MariaDBuser@'%'
| Grants for MariaDBuser@% |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 `MariaDBuser`@`%` IDENTIFIED BY PASSWORD '*7FB468DD87A569B883C67EE4504CDB8122329944' WITH GRANT OPTION |

管理者に付与されている権限の中にグローバル権限というDBを指定して権限付与が出来ないものが存在するためエラーとなっていた。
※上記の中だと「CREATE USER」等

権限の種類については以下を参考にしてください。リンク先の表のコンテキスト列のサーバ管理がDB指定出来ない権限となります。
https://dev.mysql.com/doc/refman/5.6/ja/privileges-provided.html

■Aurora(mysqlエンジン)

せっかくなので、Aurora(mysqlエンジン)でも試してみました。

こっちはすんなりgrant allでお手軽に権限付与が出来ました。


MySQL [(none)]> grant all privileges on test.* to Aurorauser@'%';
Query OK, 0 rows affected (0.01 sec)

権限を確認すると正常に付与されています。


show grants for Aurorauser@'%'

MySQL [(none)]> show grants for Aurorauser@'%';
+------------------------------------------------------+
| Grants for Aurorauser@% |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'Aurorauser'@'%' |
| GRANT ALL PRIVILEGES ON `test`.* TO 'Aurorauser'@'%' |
+------------------------------------------------------+

 


MySQL [(none)]> 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, LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA, INVOKE SAGEMAKER, INVOKE COMPREHEND ON *.* TO 'admin'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

どちらのデータベースのデフォルト管理者ユーザも権限にそこまで差異があるように見えないので
RDSのMariaDBの仕様なのだと思います。ちなみに公式でも個別に付与するよう記事がありました。

・Amazon公式記事
https://aws.amazon.com/jp/premiumsupport/knowledge-center/duplicate-master-user-mysql/

「all grant」コマンドが通るDBもあるので、RDSのMariaDBでDBユーザを作られる際は心に留めておいていただければと思います。