Toddさんのブログにも書いてありますが、MySQL5.7.7からMySQL Proxy Userを利用する事により、
特定のアクセス権限を纏めて、管理する事が出来るようになりました。
複数ユーザー権限をまとめて管理出来るような、ROLEの様な機能になります。
Emulating roles with expanded proxy user
主なメリットとしては、Proxy User(Role)に権限を纏めて付与して、
それぞれの個人アカウントにProxy Userの権限を付与する事により、個別のアカウントに権限を付与しなくても、
まとめて権限管理が出来るので権限付与漏れが無くなる、個別権限付与の手間が省ける、それぞれが個別にアカウントを
継続利用可能なので、共通アカウントを利用しなくても良いのでセキュリティ上管理し易いと言った事が考えられます。
反対に、もし間違えてProxyユーザーから権限を削除してしまったり、余計に権限を付与してしまうと全体に影響が出るので注意が必要です。
検証バージョン
root@localhost [mysql]>select @@version; +--------------+ | @@version | +--------------+ | 5.7.7-rc-log | +--------------+ 1 row in set (0.00 sec) root@localhost [mysql]>
GRANT PROXY ON 代表ユーザー to 対象ユーザー; で権限を付与
ここでは、proxy_base@localhostが持っている権限をadmin_1@localhostとadmin_2@localhostに付与しています。
root@localhost [mysql]> CREATE USER proxy_base@localhost; Query OK, 0 rows affected (0.00 sec) root@localhost [mysql]> CREATE USER admin_1@localhost; Query OK, 0 rows affected (0.00 sec) root@localhost [mysql]> CREATE USER admin_2@localhost; Query OK, 0 rows affected (0.00 sec) root@localhost [mysql]> GRANT PROXY ON proxy_base@localhost TO admin_1@localhost; Query OK, 0 rows affected (0.07 sec) root@localhost [mysql]> GRANT PROXY ON proxy_base@localhost TO admin_2@localhost; Query OK, 0 rows affected (0.00 sec) root@localhost [mysql]> GRANT SELECT ON USER01.* TO proxy_base@localhost; Query OK, 0 rows affected (0.00 sec) root@localhost [mysql]> GRANT DELETE ON USER01.* TO proxy_base@localhost; Query OK, 0 rows affected (0.00 sec) root@localhost [USER01]>
admin_1がproxy_baseユーザーの持っている権限を実行する事が可能。
[root@misc01 admin]# /usr/local/mysql/bin/mysql -u admin_1 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.7-rc-log MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. 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. admin_1@localhost [(none)]> SELECT USER(), CURRENT_USER(), @@session.proxy_user; +-------------------+----------------------+-----------------------+ | USER() | CURRENT_USER() | @@session.proxy_user | +-------------------+----------------------+-----------------------+ | admin_1@localhost | proxy_base@localhost | 'admin_1'@'localhost' | +-------------------+----------------------+-----------------------+ 1 row in set (0.00 sec) admin_1@localhost [(none)]> show variables like '%proxy%'; +-----------------------------------+-----------------------+ | Variable_name | Value | +-----------------------------------+-----------------------+ | check_proxy_users | ON | | mysql_native_password_proxy_users | ON | | proxy_user | 'admin_1'@'localhost' | | sha256_password_proxy_users | OFF | +-----------------------------------+-----------------------+ 4 rows in set (0.00 sec) admin_1@localhost [(none)]> SHOW GRANTS; +----------------------------------------------------------------+ | Grants for proxy_base@localhost | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'proxy_base'@'localhost' | | GRANT SELECT, DELETE ON `USER01`.* TO 'proxy_base'@'localhost' | +----------------------------------------------------------------+ 2 rows in set (0.00 sec) admin_1@localhost [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | USER01 | +--------------------+ 2 rows in set (0.00 sec) admin_1@localhost [(none)]> admin_1@localhost [(none)]> select * from USER01.T_ONLINE_DDL; +----+-----------------+ | id | text | +----+-----------------+ | 1 | Group by Test A | | 2 | Group by Test A | | 3 | Group by Test A | | 4 | Group by Test B | | 5 | Group by Test B | | 6 | Group by Test B | | 7 | Group by Test C | | 8 | Group by Test C | | 9 | Group by Test C | +----+-----------------+ 9 rows in set (0.00 sec) admin_1@localhost [(none)]> admin_1@localhost [(none)]> delete from USER01.T_CSV01 where id = 1; Query OK, 1 row affected (0.00 sec) admin_1@localhost [(none)]>
他の、商用DBには以前から実装されているROLE権限ですが、
MySQL5.7RCではMySQL Proxyという方法で同様の権限管理が出来るようになりました。