乐趣区

关于mysql:技术分享-MySQL-80-代理用户使用

作者:杨涛涛

资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


背景

某天有人问了我一个无关 MySQL PROXY 用户该如何应用的问题。

原问题是这样的:MySQL 版本从 5.5 降级到 8.0 后,proxy 用户怎么无奈应用了?我之前是依照你博客上写的办法应用的,然而在降级后,装置插件提醒如下谬误:

mysql:(none)>install plugin test_plugin_server soname 'auth_test_plugin.so';
ERROR 1126 (HY000): Can't open shared library'auth_test_plugin.so' (errno: 0 API version for AUTHENTICATION plugin is too different)

这个咋回事?

我给了一个大家都很厌恶的答案:去看 MySQL8.0 官网手册吧。

注释

其实 MySQL 版本倒退到 8.0,曾经齐全没有必要应用 proxy 用户这个性能了,能够用角色完满代替。

auth_test_plugin.so 是 MySQL 5.5 的插件,仅限于测试环境,不举荐线上应用,仅限性能演示。之后的一系列大版本安装包里都不蕴含这个插件,所以应用办法有些差别。

上面我对 proxy 用户在 MySQL 8.0 下如何应用做下简略演示。

我在上面示例中应用插件 mysql_native_password,这个插件自带 proxy 用户性能,所以须要在配置文件里开启对应的开关,并重启 MySQL 实例:(如果应用 sha256_password,应该把参数 sha256_password_proxy_users=ON 也加到配置文件里。)

[mysqld] 
check_proxy_users=ON 
mysql_native_password_proxy_users=ON 

应用 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 用户 ytt_fake,应用认证插件 mysql_native_password:

mysql:(none)>create user ytt_fake identified with mysql_native_password by 'ytt';
Query OK, 0 rows affected (0.32 sec)
创立实在用户,并且认证插件应用 mysql_no_login,禁止此用户登录 MySQL,并且赋予他操作数据库 ytt 的所有权限。
mysql:(none)>create user ytt_real identified with mysql_no_login by 'ytt';
Query OK, 0 rows affected (0.02 sec)

mysql:(none)>grant all on ytt.* to ytt_real;
Query OK, 0 rows affected (0.16 sec)
受权 proxy 用户。
mysql:(none)>grant proxy on ytt_real to ytt_fake;
Query OK, 0 rows affected (0.08 sec)

应用 Proxy 用户登录 MySQL:

root@ytt-ubuntu:~# mysql -u ytt_fake -pytt -hytt-ubuntu
...

Your MySQL connection id is 10
Server version: 8.0.26 MySQL Community Server - GPL

...

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

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

应用 proxy 用户登录后,查看以后登录用户信息:用户实际上是 ytt_real。

mysql:(none)>select user(),current_user();
+---------------------+----------------+
| user()              | current_user() |
+---------------------+----------------+
| ytt_fake@ytt-ubuntu | ytt_real@%     |
+---------------------+----------------+
1 row in set (0.00 sec)

确认下权限:具备实在用户的所有权限。

mysql:(none)>show grants;
+---------------------------------------------------+
| Grants for ytt_real@%                             |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `ytt_real`@`%`              |
| GRANT ALL PRIVILEGES ON `ytt`.* TO `ytt_real`@`%` |
+---------------------------------------------------+
2 rows in set (0.00 sec)

用 proxy 用户创立表、插入记录、查问、销毁表:

mysql:ytt>create table fake1(id int primary key);
Query OK, 0 rows affected (0.23 sec)

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

mysql:ytt>table fake1;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

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

因为实在用户 ytt_real 应用认证插件 mysql_no_login,MySQL 不容许此用户登录:

root@ytt-ubuntu:~# mysql -uytt_real -pytt -h ytt-ubuntu
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'ytt_real'@'ytt-ubuntu' (using password: NO)
PROXY 用户有以下两个限度:
  1. 暗藏在 proxy 用户前面的实在用户不能是匿名用户、也不能给用户赋予一个匿名 PROXY 用户。MySQL 这种场景只通过语法检测,不理论利用。
  2. 多个用户能够共用一个 proxy 用户,然而不举荐!多个用户共用一个 proxy 用户,后果和料想有很大差别,也就是后果有不确定性特色。比方用户 ytt_real 应用 proxy 用户 ytt_fake,用户 ytt_real_other 也想应用 ytt_fake,此时用户 ytt_fake 连贯 MySQL 后,实在用户仍然是 ytt_real,直到用户 ytt_real 被删除,才会轮到第二个用户。
退出移动版