MySQL的权限排序问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL的权限排序问题 实验:因权限表具有统配符,对权限进行排序后,匹配时引来的问题。 授权表中的通配符 user表中User为空值表示匹配任意user name,也表示匿名用户。 user表中Host部分用户可以使用通配符”%”和”_”在host name或者IP地址中,这些具有和模式匹

MySQL的权限排序问题

实验:因权限表具有通配符,对权限进行排序后,匹配时引来的问题。

授权表中的通配符

  1. user表中User为空值表示匹配任意user name,也表示匿名用户。
  2. user表中Host部分用户可以使用通配符”%”和”_”在host name或者IP地址中,这些具有和模式匹配LIKE相同的意义。
  3. db表中,Host、User与user表中表示方法一致,同时Db列也可以具有通配符。
  4. tables_priv、columns_priv和procs_priv表中,只有Host列可以具有通配符。

账户登录的匹配:

由于具有通配符,这就会发生一个用户连接server可以匹配多个账户的事情发生。例如创建了账户’’@localhost和’yz’@’%’,当用户’yz’@localhost登录时两个账户都可以匹配。这样就面临着选择哪一个账户作为登录账户的问题。MySQL为解决这个问题,对user表中的记录做了排序。排序方法如下:

先按最具体的(most-specific)Host值排序。原义的host_name和IP地址算是最具体的(IP地址的具体级别specificity是不受子网掩码影响的,192.168.1.13和192.168.1.0/255.255.255.0被认为是同一具体级别)。匹配符’%’算是最不具体的级别。空字符’’也表明任意host,但排在’%’后面。有相同Host值的行首先以最具体的User值排序(空User值意味着“任何用户”并且是最不具体的)。对于具有相同具体级别的Host和User值,排序是不确定。

采用上述方法,当’yz’@localhost登录时,匹配的就是账号’’@localhost。如果用用账户’yz’@’%’的密码试图登录,可能会被告知Access denied for user 'yz'@'localhost',因为MySQL选取的登录账户是’’@localhost。

不过MySQL也比较奇怪,登录后使用select user()发现

| user()       |

| yz@localhost |

使用show grants;可以看到下面结果,账户是’’@localhost。

| Grants for @localhost            |

| GRANT USAGE ON *.* TO ''@'localhost'  |

| GRANT CREATE ON `privtest`.* TO ''@'localhost' |

问题1,同一账户不同db_name授权信息引发的问题:

账户行为还好,不会引起太大的坑。db中的排序不注意可能就会导致MySQL结果不一致,用户权限可能‘丢失’,导致用户无法正常工作,服务故障。

db表在Host、Db和User范围列上排序,也是按照具体到不具体排序,而且匹配到第一条符合的记录后,就返回。首先其排序是不稳定排序,这会导致插入一条不相关的记录,导致其他记录排序变化,权限表现变化,部分原有权限‘丢失’。即使是稳定排序,也会导致逻辑上应该有的权限没有,例如

grant select on aaa.* to yz@localhost;

grant create on `aa%` to yz@localhost;

grant insert on `aaa%` to yz@localhost;

       MySQL在做权限检查时,只会返回匹配到的第一条记录,即用户yz@localhost对aaa数据库只有select权限,不会有create和insert权限。从这个角度讲即使排序稳定,插入新的权限信息也可能会导致之前的权限‘丢失’。

相关知识:

1、mysql的权限验证有global,db,table,column多个纬度。
2、在global和db纬度中,mysql按内部权重,从大到小读取所有授权,获取第一个匹配(权重最大的)的作为内部授权验证。
3、db纬度的权重计算方法如下:
    3.1 分别按照hostname,dbname,username计算。
    3.2 单个字符串若不存在通配符权重为0x80,若存在通配符,则权重为第一个通配符出现的位置,最大为0x7F
    3.3 举例 GRANT CREATE ON `tt_`.* TO 'tt'@‘%’ 这条授权的权重为0x010380,其中’%’为0x01 ’tt_’为0x03 ’tt’为0x80
4、当前mysql内部大部分排序采用快速排序,这是一种不稳定的排序算法。

问题2 不同账户之间授权信息引发的问题:

实验:MySQL在db层验证权限时,是否会对db中所有账户权限信息都做逐一匹配。

结论:从效果上MySQL会逐一匹配db表中的信息,遇到能匹配的就返回,导致拥护show grants的权限信息可能与实际权限不一致。(table层也是这样)

MySQL排序先后为Host、Db、User,前面user表在匹配时会发生匹配多条记录,那么在db层匹配时,同时可匹配的账户是否也会在db层发生匹配。实验:

同时创建

’yz’@’%’和’yz’@localhost账号。

对’yz’@’%’赋予权限:

grant create on yzdb to 'yz'@'%';

登录yz@localhost,执行下面语句,可以看到权限信息仅Usage。这个时候试着创建database yzdb,会发现其具有创建yzdb的权限。

mysql> show grants;

| Grants for yz@localhost                |

| GRANT USAGE ON *.* TO 'yz'@'localhost' |

mysql> create database yzdb;

Query OK, 1 row affected (0.02 sec)

当撤销'yz'@'%'的创建yzdb权限,'yz'@'localhost'也会失去该权限。

在测试中,’’@localhost账户不会拥有'yz'@'%'的上述权限。在这里匹配时,’yz’不等同于’’。

上述情况也会产生权限‘丢失’问题,show grants中有的权限可能因为其他账户授权信息引发‘丢失’。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
27天前
|
网络协议 关系型数据库 MySQL
mysql8.0远程连接权限设置
mysql8.0远程连接权限设置
55 0
|
2月前
|
安全 关系型数据库 MySQL
总结MySQL 的一些知识点:MySQL 排序(上)
总结MySQL 的一些知识点:MySQL 排序
|
3月前
|
关系型数据库 MySQL
MySQL错误 -.--secure-file-priv 无导出权限
MySQL错误 -.--secure-file-priv 无导出权限
34 0
|
3月前
|
SQL 关系型数据库 MySQL
|
20天前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
1月前
|
存储 人工智能 关系型数据库
详细介绍TiDB 与 MySQL 中的常用字符集及排序规则
一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
119 6
|
6天前
|
SQL 关系型数据库 MySQL
排序与分页——“MySQL数据库”
排序与分页——“MySQL数据库”
|
15天前
|
SQL 关系型数据库 MySQL
mysql基本查询、运算符、排序和分页
mysql基本查询、运算符、排序和分页
|
26天前
|
关系型数据库 MySQL 开发工具
MySQL分组后,组内排序,然后取每组的第一条数据
MySQL分组后,组内排序,然后取每组的第一条数据
15 1
|
1月前
|
安全 关系型数据库 应用服务中间件
连接rds设置网络权限
连接阿里云RDS需关注:1) 设置白名单,允许特定IP访问;2) 选择合适网络类型,如VPC或经典网络;3) 确保VPC内路由与安全组规则正确;4) 同VPC内可使用内网地址连接;5) 可启用SSL/TLS加密增强安全性。记得遵循最小权限原则,确保数据库安全。不同服务商操作可能有差异,但基本流程相似。
23 9