前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >故障分析 | 当 USAGE 碰到 GRANT OPTION

故障分析 | 当 USAGE 碰到 GRANT OPTION

作者头像
爱可生开源社区
发布2023-08-18 20:25:18
1461
发布2023-08-18 20:25:18
举报

作者:佟宇航

爱可生南区交付服务部 DBA 团队成员,主要负责 MySQL 故障处理以及平台技术支持。

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


1背景

近期客户反映数据库有些诡异,原本应该有部分库表访问权限的 MySQL 用户,现在可以看到权限外的一些库表信息。

猜测可能是权限设置有冲突,先了解一下客户环境的权限:

代码语言:javascript
复制
mysql> show grants;
+------------------------------------------------------------------------+
| Grants for ttt@%                                                       |
+------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ttt'@'%'                                        |
| GRANT USAGE ON `austin`.* TO 'ttt'@'%' WITH GRANT OPTION               |
| GRANT USAGE ON `file`.* TO 'ttt'@'%' WITH GRANT OPTION                 |
| GRANT ALL PRIVILEGES ON `redmoonoa9`.* TO 'ttt'@'%' WITH GRANT OPTION  |
| GRANT ALL PRIVILEGES ON `nacos`.* TO 'ttt'@'%' WITH GRANT OPTION       |
| GRANT ALL PRIVILEGES ON `data_center`.* TO 'ttt'@'%' WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `xxl_job`.* TO 'ttt'@'%' WITH GRANT OPTION     |
+------------------------------------------------------------------------+
7 rows in set (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| austin             |
| data_center        |
| file               |
| nacos              |
| redmoonoa9         |
| xxl_job            |
+--------------------+
7 rows in set (0.00 sec)

在分析问题之前,先简单介绍一下 MySQL 权限相关的知识点。

2权限介绍

众所周知,MySQL 的权限有很多种,权限又可以分为全局权限(即整个数据库)和特定权限(即特定库表),并且同一用户可以具备多种权限,部分常用权限如下表:

权限

说明

ALL

代表 所有 权限(与 USAGE 相反)

ALTER

代表允许使用 ALTER TABLE 来改变表结构,ALTER TABLE 同时也需要有 CREATE 和 INSERT 权限

CREATE

代表允许创建新的数据库和表

DROP

代表允许删除数据库、表、视图

SELECT

代表允许从数据库中查询表数据

INSERT

代表允许向数据库中插入表数据

UPDATE

代表允许更新数据库中的表数据

DELETE

代表允许删除数据库中的表数据

GRANT OPTION

代表允许向其他用户授权或移除权限

USAGE

代表 没有任何权限(相反于 ALL)

查看客户环境权限后,初步判断大概率是因为该用户对一个数据库同时具备 USAGE 和 GRANT OPTION 权限导致。

3本地测试

当用户同时拥有 UASGE 和 GRANT OPTION 权限时会发生什么?

准备环境

创建一个用户对 test 库下所有表具有查询权限。

代码语言:javascript
复制
mysql> show grants;
+---------------------------------------------------------+
| Grants for hjm@%                                        |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO 'hjm'@'%'                         |
| GRANT SELECT ON `test`.* TO 'hjm'@'%' WITH GRANT OPTION |
+---------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
| t2             |
| t3             |
| y1             |
+----------------+
4 rows in set (0.00 sec)

mysql> select * from y1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+
2 rows in set (0.00 sec)

如上测试可以证明:

  • 当用户只对库拥有 UASGE 权限时,对该权限下数据库没有任何权限,也无法查看,符合预期。
  • 当用户只对库拥有 GRANT OPTION 权限时,结果表明也是一切正常,符合预期。

修改权限

对该用户新增权限,对 test 库既有 UASGE 权限也有 GRANT OPTION 权限。

先撤回 SELECT 权限。

代码语言:javascript
复制
mysql> revoke SELECT ON `test`.* from 'hjm'@'%' ;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for hjm;
+--------------------------------------------------------+
| Grants for hjm@%                                       |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'hjm'@'%'                        |
| GRANT USAGE ON `test`.* TO 'hjm'@'%' WITH GRANT OPTION |
+--------------------------------------------------------+
2 rows in set (0.00 sec)

登录 hjm 用户查看。

代码语言:javascript
复制
mysql> show grants;
+--------------------------------------------------------+
| Grants for hjm@%                                       |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'hjm'@'%'                        |
| GRANT USAGE ON `test`.* TO 'hjm'@'%' WITH GRANT OPTION |
+--------------------------------------------------------+
2 rows in set (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)

mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

mysql> show create table t1;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                       |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from t1;
ERROR 1142 (42000): SELECT command denied to user 'hjm'@'10.186.62.91' for table 't1'

无法查看表数据。

4总结

当用户对同一数据库同时具备 USAGEGRANT OPTION 两种权限时,就会出现冲突。此时便可以查看到该数据库以及库下所有表的信息,但无法查看表内具体数据。

注意:在通过 REVOKE 回收权限时,若该用户同时具备 WITH GRANT OPTION 权限,一定要记得通过 REVOKE GRANT OPTION 语句进行收回,这样权限才能回收地干净彻底。

本文关键字:#MySQL# #权限#

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

本文分享自 爱可生开源社区 微信公众号,前往查看

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

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

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