私はMySQL管理に不慣れなため、この質問-スーパーユーザーではないMySQL管理ユーザーを作成したいと思いました。私は、Amazon RDS MySQLコミュニティサーバーが適切なテンプレートになると思いました。したがって、RDSとまったく同じ権限を持つMySQL「admin」ユーザーを作成しました。これは、他の開発者がこの管理者ユーザーがスーパー特権を持つユーザーのパスワードを変更できることに気づくまでうまくいきました。ただし、Amazon RDSでまったく同じ権限を持つ管理者ユーザーはこれを行うことができません。
私が何を間違えているのか、そして管理ユーザーがシステムの完全な引き継ぎを行わずにほとんどのデータベースタスクを実行できるように、管理者ユーザーにとって適切な特権セットを理解したかったのです。
Amazon RDS MySQLの管理ユーザーの許可は次のとおりです-
> select * from mysql.user where user='admin'\G;
*************************** 1. row ***************************
Host: %
User: admin
Password: *C58D6BEE46C829269E211EB77AA2005DECC89CF1
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: N
Process_priv: Y
File_priv: N
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: N
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string:
password_expired: N
これは、私の展開で作成したユーザーの許可です-
> select * from mysql.user where user='admin'\G;
*************************** 1. row ***************************
Host: %
User: admin
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: N
Process_priv: Y
File_priv: N
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: N
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *9E88C5A2B9C165CCF2599545998EDA0B3704AE53
password_expired: N
password_last_changed: 2018-05-18 13:52:35
password_lifetime: NULL
account_locked: N
どちらのユーザーもrootユーザーを作成できません-
Amazon RDS:
> GRANT ALL PRIVILEGES ON *.* TO 'randomroot'@'localhost' IDENTIFIED BY '<pwd>' WITH GRANT OPTION;
ERROR: 1045 (28000): Access denied for user 'admin'@'%' (using password: YES)
私のMySQLデプロイメント:
> GRANT ALL PRIVILEGES ON *.* TO 'randomroot'@'localhost' IDENTIFIED BY '<pwd>' WITH GRANT OPTION;
ERROR: 1045 (28000): Access denied for user 'admin'@'%' (using password: YES)
ただし、私のユーザーはrootユーザーのpwdを変更できますが、AWS adminユーザーは変更できません。
Amazon RDS:
> select * from mysql.user where user = 'rdsadmin'\G;
*************************** 1. row ***************************
Host: localhost
User: rdsadmin
Password: *0679641C78FA0E03C1E8F152B87FA2F8CC8F72E7
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string:
password_expired: N
スーパーユーザーのパスワード変更の試み:
SET PASSWORD FOR 'rdsadmin'@'localhost' = PASSWORD('<pwd>');
ERROR: 1396 (HY000): Operation SET PASSWORD failed for rdsadmin@localhost
私のMySQLデプロイメント:
> select * from mysql.user where user = 'randomroot'\G;
*************************** 1. row ***************************
Host: localhost
User: randomroot
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *C2AD957A98109BD742F98E4D97E69634578C82E0
password_expired: N
password_last_changed: 2018-05-28 14:21:59
password_lifetime: NULL
account_locked: N
スーパーユーザーのパスワード変更の試み:
> SET PASSWORD FOR 'randomroot'@'localhost' = '<newpwd>';
Query OK, 0 rows affected (0.2871 sec)
編集-どちらの場合も管理者ユーザーの権限を追加
Amazon RDS
> SHOW GRANTS FOR admin\G;
*************************** 1. row ***************************
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'@'%' IDENTIFIED BY PASSWORD <secret> WITH GRANT OPTION
1 row in set (0.2238 sec)
私のMySQLデプロイメントの場合:
> SHOW GRANTS for admin\G;
*************************** 1. row ***************************
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.2538 sec)
問題は、Amazon RDSで問題を「複製」しようとするときです。まったく同じではないので。 Amazon RDSでは、SUPER権限はありません
https://aws.Amazon.com/es/premiumsupport/knowledge-center/rds-mysql-functions/ から:
「... MySQLのSUPER権限。これはRDS MySQL DBインスタンスに対して制限されています。」
したがって、「WITH GRANT OPTION」を付与すると、次のようになります。
https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_grant-option から:
GRANT OPTION特権を使用すると、自分が所有している特権を他のユーザーに与えたり、他のユーザーから削除したりできます。
結論として、同じ環境で問題を再現できるように、テスト目的で別のMySQLインスタンスを作成することを検討する必要があります。