前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 案例:用户鉴权与 Host 优先级

MySQL 案例:用户鉴权与 Host 优先级

原创
作者头像
王文安@DBA
修改2020-08-28 15:13:44
2.2K0
修改2020-08-28 15:13:44
举报

前言

MySQL 鉴权的方式是 Username 和 Host 两个维度的,最近遇到了一些关于登录时到底是被 MySQL 识别为哪个账号的问题,因此简单梳理一下 MySQL 匹配账号的优先级。

简要分析

MySQL 在创建用户的时候,一般是需要指定用户名和来源 IP 的,比如:

代码语言:txt
复制
mysql> show grants for test@'%';
+----------------------------------+
| Grants for test@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO 'test'@'%' |
+----------------------------------+
1 row in set (0.00 sec)

由于 Host 这个字段支持正则匹配,因此这个字段设置为 % 的时候,则代表所有的来源 IP 都能匹配到。

因为这个特性,所以有时候创建的账号会有如下的情况出现:

代码语言:txt
复制
+------+---------------+
| user | host          |
+------+---------------+
| test | %             |
| test | 10.104.%      |
| test | 10.104.56.136 |
+------+---------------+

参考官方文档的描述:

When multiple matches are possible, the server must determine which of them to use. It resolves this issue as follows: 1.Whenever the server reads the user table into memory, it sorts the rows. 2.When a client attempts to connect, the server looks through the rows in sorted order. 3.The server uses the first row that matches the client host name and user name. The server uses sorting rules that order rows with the most-specific Host values first.

简而言之:MySQL 会按照 Host 的匹配精度,按降序排列同一个 Username 的所有账号,当 Client 端尝试登录 MySQL 的时候,会按照顺序依次这个 Username 下面所有的 Host 规则,直到匹配成功。

Host 这个字段不仅能填 IP,也能写域名,同样也能利用到正则表达式匹配:

匹配示例
匹配示例

由于域名指向的 IP 受 DNS 的影响,因此多数时候会用 IP,一般来说需要 DNS 来屏蔽一些后端细节的时候才会用域名来作为 Host 字段的值。

测试一下

使用如下操作创建三个用户,密码不做区分:

代码语言:txt
复制
mysql> create user test@'%' identified by 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> create user test@'10.104.56.136' identified by 'test';
Query OK, 0 rows affected (0.00 sec)

mysql> create user test@'10.104.%' identified by 'test';
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql>
mysql>
mysql>  select user,host from mysql.user where user='test' order by host desc;
+------+---------------+
| user | host          |
+------+---------------+
| test | 10.104.56.136 |
| test | 10.104.%      |
| test | %             |
+------+---------------+
3 rows in set (0.00 sec)

mysql>

PS:order by desc 仅为展示上的考虑。

那么从两个不同的机器上(10.104.56.136 和 10.104.43.107)尝试登录 MySQL,按照文档的描述,匹配的优先级应该是:10.104.56.136->10.104.%->%。那么有一台服务器能完整匹配到 IP,另外一台服务器匹配到的应该是10.104.%

实际操作一下看看效果:

代码语言:txt
复制
root@debian:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.104.56.136  ......(省略)

root@debian:~# mysql -h192.168.1.100 -utest -ptest
......(省略)
Server version: 5.7.18-txsql-log 20200331
......(省略)

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

mysql>

在另外一台机器上:

代码语言:txt
复制
root@VM-43-107-debian:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.104.43.107  ......(省略)

root@debian:~# mysql -h192.168.1.100 -utest -ptest
......(省略)
Server version: 5.7.18-txsql-log 20200331
......(省略)
mysql> show grants;
+-----------------------------------------+
| Grants for test@10.104.%                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'10.104.%' |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql>

换成本地的设备再试一下登录:

代码语言:txt
复制
Tomo@MacBook-Pro ~ % mysql -hgz-cdb.sql.tencentcdb.com -utest -ptest -P59888
......(省略)
Server version: 5.7.18-txsql-log 20200331
......(省略)
mysql> show grants;
+----------------------------------+
| Grants for test@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO 'test'@'%' |
+----------------------------------+
1 row in set (0.02 sec)

mysql>

可以看到本地设备的 IP 由于和前两个匹配规则不一致,所以最后匹配到了 % 的这个账号。

总结一下

作为比较保险的办法,尽量少用 Host 来区分不同的账号,直接用不同的 Username 会比较好管理和维护,如果一定需要用 Host 来区分,那么至少也要用不同的密码,防止匹配到了错误的用户,导致权限不足引起业务上的问题。

课外题

localhost 和 127.0.0.1 算是常用的两个 Host,可以作为实践内容动手试一下,体验一下匹配的规律。在 MySQL 看来,精确的域名和精确的 IP 是同等地位的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 简要分析
  • 测试一下
  • 总结一下
  • 课外题
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档