web-dev-qa-db-ja.com

MySQL-管理ユーザーはスーパーユーザーのパスワードを変更できます

私は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)
1
Vaibhaw

問題は、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インスタンスを作成することを検討する必要があります。

2
Mauricio Cacho