MySQL的权限排序问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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中有的权限可能因为其他账户授权信息引发‘丢失’。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
自然语言处理 关系型数据库 MySQL
如何在mysql数据库里进行文本的相似度排序?
【8月更文挑战第28天】如何在mysql数据库里进行文本的相似度排序?
420 62
|
2月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
2月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
290 1
|
2月前
|
SQL NoSQL 关系型数据库
|
3月前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
|
3月前
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
本文详细解析了MySQL中`ORDER BY`的实现原理及优化方法。通过解析与优化、执行及多种优化技术,如索引利用、内存排序、外部排序等,帮助你提升排序性能。了解其背后的机制,可显著优化查询效率。
144 4
|
3月前
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
在实际开发中,我们经常会使用 MySQL 的 `ORDER BY`进行排序,那么,`ORDER BY`是如何实现的排序的?我们该如何优化 `ORDER BY`的排序性能?这篇文章,我们来聊一聊。
47 3
|
4月前
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
|
4月前
|
安全 关系型数据库 MySQL
Navicat工具设置MySQL权限的操作指南
通过上述步骤,您可以使用Navicat有效地为MySQL数据库设置和管理用户权限,确保数据库的安全性和高效管理。这个过程简化了数据库权限管理,使其既直观又易于操作。
502 4
|
4月前
|
自然语言处理 关系型数据库 MySQL
match如何在mysql数据库里进行文本的相似度排序?
【9月更文挑战第1天】match如何在mysql数据库里进行文本的相似度排序?
139 1