前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL8.0特性之partial_revokes

MySQL8.0特性之partial_revokes

作者头像
AsiaYe
发布2022-07-27 15:56:06
5380
发布2022-07-27 15:56:06
举报
文章被收录于专栏:DBA随笔DBA随笔

MySQL8.0特性之partial_revokes

01

MySQL8.0特性之partial_revokes

在MySQL8.0中,开始支持权限的部分撤销,今天我们看看这个特性。

简单理解,就是:如果你有一个全局权限的账号,那么MySQL支持你在这个账号的基础上,回收其中针对某些库表的部分权限。听起来比较拗口,我们看看对比就知道了。

MySQL 5.7 版本

代码语言:javascript
复制
mysql> create user t1 identified by '123456';   
Query OK,  rows affected (0.00 sec)

mysql> grant select,insert,update,delete on *.* to t1;
Query OK,  rows affected (0.00 sec)

mysql> 
mysql> revoke select on mysql.* from t1;
ERROR  (): There is no such grant defined for user 't1' on host '%'

来看看t1的权限:

代码语言:javascript
复制
mysql> show grants for t1;
+---------------------------------------------------------+
| Grants for t1@%                                         |
+---------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 't1'@'%' |
+---------------------------------------------------------+
 row in set (0.00 sec)

MySQL5.7中,不支持对部分库回收部分权限。会产生报错:There is no such grant defined for user 't1' on host '%'

MySQL 8.0 版本

代码语言:javascript
复制
show variables like '%parti%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| partial_revokes | OFF   |
+-----------------+-------+
1 row in set (0.00 sec)

set global partial_revokes=on;
Query OK, 0 rows affected (0.00 sec)

show variables like '%parti%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| partial_revokes | ON    |
+-----------------+-------+
1 row in set (0.01 sec)

create user t1 identified by '123456';  
Query OK, 0 rows affected (0.01 sec)

grant select,insert,update,delete on *.* to t1;
Query OK, 0 rows affected (0.00 sec)

revoke select on mysql.* from t1;
Query OK, 0 rows affected (0.00 sec)

来看看t1的权限:

代码语言:javascript
复制
show grants for t1;
+---------------------------------------------------------+
| Grants for t1@%                                         |
+---------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `t1`@`%` |
| REVOKE SELECT ON `mysql`.* FROM `t1`@`%`                |
+---------------------------------------------------------+
 rows in set (0.00 sec)

尝试登陆这个mysql,并且访问mysql.user表:

代码语言:javascript
复制
select * from mysql.user;
ERROR  (): SELECT command denied to user 't1'@'10.13.3.129' for table 'user'

从上述细节中不难联想到:

1、开启了partial_revokes部分撤销权限之后,可以很方便的利用所有权限进行反向授权。

2、反向回收权限,可以应用在mysql系统表上,让业务的账号权限不能访问元数据信息,保证mysql元数据安全性。

像这种,开启了全局*.*权限之后,又反向收走了一部分权限的账号,我们姑且称之为partial_revokes账号。

限制场景

实际上,MySQL8.0的partial_revokes功能,也存在以下限制:

  • 可以将partial_revokes的功能使用在一张不存在的表里面。前提是当前账号有全局所有库表的权限,也就是*.*,否则会报错。
  • 不能将partial_revokes的功能使用在全局权限上,例如file等权限。只能使用在某个特定的数据库上。
  • 在部分场景下,partial_revokes功能可能会导致某些通配符被解释为字符,例如_被解释为下划线,%被解释为百分号,从而失去通配符的效果。(这个有点硬伤,可能会让线上账号可读性变差)

关于第二点,这里我还举了个小的案例:

代码语言:javascript
复制
revoke file on mysql.* from t1;                  
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

02

一些特殊情况

一、利用partial_revokes的账号,对其他账号授权。

接上面的例子:

1、首先我们看t1这个账号,是个partial_revokes账号:

代码语言:javascript
复制
show grants for t1;              
+---------------------------------------------------------------------------+
| Grants for t1@%                                                           |
+---------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `t1`@`%` WITH GRANT OPTION |
| REVOKE SELECT ON `mysql`.* FROM `t1`@`%`                                  |
+---------------------------------------------------------------------------+
 rows in set (0.00 sec)

2、再创建2个账号,u1和u2,其中u1什么权限都没有,u2有所有库表的读权限:

代码语言:javascript
复制
CREATE USER u1, u2;
Query OK, 0 rows affected (0.01 sec)

GRANT SELECT ON *.* TO u2;
Query OK, 0 rows affected (0.01 sec)

3、现在我们利用账号t1分别给u1和u2授予所有库表的读权限:

代码语言:javascript
复制
GRANT SELECT ON *.* TO u1;

GRANT SELECT ON *.* TO u2;

4、分别查看此时u1和u2的账号权限

代码语言:javascript
复制
SHOW GRANTS FOR u1;
+------------------------------------------+
| Grants for u1@%                          |
+------------------------------------------+
| GRANT SELECT ON *.* TO `u1`@`%`          |
| REVOKE SELECT ON `mysql`.* FROM `u1`@`%` |
+------------------------------------------+

SHOW GRANTS FOR u2;
+---------------------------------+
| Grants for u2@%                 |
+---------------------------------+
| GRANT SELECT ON *.* TO `u2`@`%` |
+---------------------------------+

通过上述例子不难发现:

a、如果一个partial_revokes账号给其他账号授予自己的所有权限,那么revoke中包含的权限也会被授予。

b、如果一个partial_revokes账号给其他账号授予自己的所有权限,最终的权限是partial_revokes账号和其他账号的权限和。

二、如何关闭partial revokes特性?

如果mysql实例中,包含partial revokes账号,则需要先将这些账号删除或者重新授权后,才可以关闭partial revokes特性,否则会出现如下报错:

代码语言:javascript
复制
set global partial_revokes=off;
ERROR 3896 (HY000): At least one partial revoke exists on a database. The system variable '@@partial_revokes' must be set to ON.

关闭partial_revokes特性的办法就是关闭全局参数即可。

三、mysql.user表中关于partial revokes账号的特殊字段

使用下面的语句,可以观察到当前MySQL实例中的partial revokes账号:

代码语言:javascript
复制
SELECT User, Host, User_attributes from mysql.user;

+------------------+--------------+---------------------------------------------------------------------+
| User             | Host         | User_attributes                                                     |
+------------------+--------------+---------------------------------------------------------------------+
| root             | %            | NULL                                                                |
| t1               | %            | {"Restrictions": [{"Database": "mysql", "Privileges": ["SELECT"]}]} |                                                           |

可以看到,用户属性user_attribute字段限制它在mysql库进行select查询。

03

总结

partial revokes账号表示使用了部分授权功能的账号,这种账号通常被用来进行反向授权,从而保证mysql等系统表的安全性;

不能将partial_revokes的功能使用在全局权限上,例如file等权限。只能使用在某个特定的数据库上,回收特定的数据库级别的权限。

这个特点,目前在线上环境开的不多,但是如果你的DB特别多,你只需要对部分DB做过滤,这个反向授权的方法,可以让你的账号权限看起来比较简洁。

关于这个功能,还有一些细节,参考官方文档即可:

https://dev.mysql.com/doc/refman/8.0/en/partial-revokes.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL8.0特性之partial_revokes
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档