MySQL[5.7-8.0] proxy user代理用户配置详解


其实MySQL版本发展到8.0,已经完全没有必要使用 proxy 用户这个功能了,可以用角色完美替代。
auth_test_plugin.so 是 MySQL 5.5 的插件,仅限于测试环境,不推荐线上使用,仅限功能演示。之后的一系列大版本安装包里都不包含这个插件,所以使用方法有些差异。


下面我对 proxy 用户在 MySQL 8.0 下如何使用做下简单演示,此方法也同样适合MySQL 5.7的版本。
我在下面示例中使用插件 mysql_native_password ,这个插件自带 proxy 用户功能,所以需要在配置文件里开启对应的开关,并重启 MySQL 实例:(如果使用 sha256_password , 应该把参数 sha256_password_proxy_users=ON 也加到配置文件里。)


[mysqld]
check_proxy_users=ON
mysql_native_password_proxy_users=ON
plugin_load_add=mysql_no_login.so


使用 proxy 用户功能之前,需要安装 mysql_no_login 插件,阻止隐藏在 proxy 用户下的真实用户登录 MySQL 。


mysql:(none)>install plugin mysql_no_login soname 'mysql_no_login.so';
Query OK, 0 rows affected (0.10 sec)


创建一个 proxy 用户 rsc_proxy ,使用认证插件 mysql_native_password :
mysql:(none)>create user rsc_proxy identified with mysql_native_password by 'Rscpass123.';
Query OK, 0 rows affected (0.32 sec)


创建真实用户,并且认证插件使用 mysql_no_login ,禁止此用户登录 MySQL ,并且赋予他操作数据库rsc的所有权限。
mysql:(none)>create database rsc;
mysql:(none)>create user rsc_real identified with mysql_no_login by 'Rscpass123.';
Query OK, 0 rows affected (0.02 sec)


mysql:(none)>grant all on rsc.* to rsc_real;
Query OK, 0 rows affected (0.16 sec)


授权 proxy 用户权限。
mysql:(none)>grant proxy on rsc_real to rsc_proxy;
Query OK, 0 rows affected (0.08 sec)


使用 Proxy 用户登录 MySQL :
[root@node10 mysql]# mysql -ursc_proxy -p'Rscpass123.'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL


确认下变量 proxy_user 的值是不是 rsc_proxy :


mysql:rsc>select @@proxy_user;
+----------------+
| @@proxy_user   |
+----------------+
| 'rsc_proxy'@'%' |
+----------------+
1 row in set (0.00 sec)


使用 proxy 用户登录后,查看当前登录用户信息:用户实际上是 rsc_real 。
mysql> select user(),current_user(),@@proxy_user;
+---------------------+----------------+-----------------+
| user()               | current_user() | @@proxy_user    |
+---------------------+----------------+-----------------+
| rsc_proxy@localhost | rsc_real@%     | 'rsc_proxy'@'%' |
+---------------------+----------------+-----------------+
1 row in set (0.00 sec)


确认下代理用户的权限:具有真实用户的所有权限。
mysql> show grants for rsc_proxy@'%';
+--------------------------------------------------+
| Grants for rsc_proxy@%                           |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO `rsc_proxy`@`%`            |
| GRANT PROXY ON 'rsc_real'@'%' TO 'rsc_proxy'@'%' |
+--------------------------------------------------+
2 rows in set (0.00 sec)


用 proxy 用户创建表、插入记录、查询、销毁表:
mysql:ytt>create table rscpass( id int primary key);
Query OK, 0 rows affected (0.23 sec)


mysql:ytt>insert rscpass select 1;
Query OK, 1 row affected (0.28 sec)
Records: 1  Duplicates: 0  Warnings: 0


mysql> select * from rscpass;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)


mysql:ytt>drop table rscpass;
Query OK, 0 rows affected (0.29 sec)


由于真实用户 rsc_real 使用认证插件 mysql_no_login ,MySQL 不允许此用户登录:

[root@node10 mysql]# mysql -ursc_read -p'Rscpass123.'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'rsc_read'@'localhost' (using password: YES)


可以多个不同的代理用户可以对应同一个真实的用户:
例如:
创建另一个代理用户gmy_proxy:
mysql> create user gmy_proxy identified with mysql_native_password by 'Rscpass123.';
Query OK, 0 rows affected (0.00 sec)


mysql> show grants for gmy_proxy@'%';
+---------------------------------------+
| Grants for gmy_proxy@%                |
+---------------------------------------+
| GRANT USAGE ON *.* TO `gmy_proxy`@`%` |
+---------------------------------------+
1 row in set (0.00 sec)


mysql> grant proxy on rsc_real to gmy_proxy;
Query OK, 0 rows affected (0.00 sec)


mysql> show grants for gmy_proxy@'%';
+--------------------------------------------------+
| Grants for gmy_proxy@%                           |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO `gmy_proxy`@`%`            |
| GRANT PROXY ON 'rsc_real'@'%' TO 'gmy_proxy'@'%' |
+--------------------------------------------------+
2 rows in set (0.01 sec)
通过gmy_proxy用户也可以登录系统,权限与rsc_real的权限一样
[root@node10 ~]# mysql -ugmy_proxy -p'Rscpass123.'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.18 MySQL Community Server - GPL


Copyright (c) 2000, 2019, 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.


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| rsc                |
+--------------------+
2 rows in set (0.00 sec)


PROXY用户的特点:
隐藏在 proxy 用户后面的真实用户不能是匿名用户、也不能给用户赋予一个匿名 PROXY 用户。MySQL 这种场景只通过语法检测,不实际应用。
多个用户可以共用一个 proxy 用户,但是不推荐!




分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS