MySQL 权限问题:当 USAGE 碰到 GRANT OPTION

本文分享的是 MySQL 中权限搭配使用不当时可能引发的问题。

作者:佟宇航

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

本文来源:原创投稿

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

背景

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

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

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 权限相关的知识点。

权限介绍

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

权限说明
ALL代表 所有 权限(相反与 USAGE)
ALTER代表允许使用 ALTER TABLE 来改变表结构,ALTER TABLE 同时也需要有 CREATE 和 INSERT 权限
CREATE代表允许创建新的数据库和表
DROP代表允许删除数据库、表、视图
SELECT代表允许从数据库中查询表数据
INSERT代表允许向数据库中插入表数据
UPDATE代表允许更新数据库中的表数据
DELETE代表允许删除数据库中的表数据
GRANT OPTION代表允许向其他用户授权或移除权限
USAGE代表 没有任何权限(相反于 ALL)

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

本地测试

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

准备环境

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

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 -ADatabase 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 权限。

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 用户查看。

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'

无法查看表数据。

总结

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

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

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【八股】【计算机网络】

这里写目录标题 OSI 的七层模型TCP/IP模型HTTP 是什么?HTTP状态码HTTP 常见字段GET 和 POST 有什么区别?GET 和 POST 方法都是安全和幂等的吗?HTTP 缓存HTTP 优缺点HTTP 性能HTTP 与 HTTPSHTTPSHTTPS连接过程与一定可靠吗HTTP演进版本HTTP/1.…

湖大CG满分教程:作业训练三编程题15. 公交系统

【问题描述】 城市公交系统有一个记录仪,用于记录每个站点的乘客人数的变化情况,例如:x表示到站前公交车上的乘客人数,y表示离站时公交车上的乘客人数,则该记录仪记录的该站的数字为y-x。 对于一辆公交车和n个车站&…

解决R语言读取数据自动置换符号问题,例如把TCGA样本中的-读取为·

解决方案 在使用R语言read.csv()函数读取csv文件时&#xff0c;会自动把TCGA样本中的-替换为.&#xff0c;为后续数据处理带来不便。 解决方法&#xff1a;在函数中添加check.namesFALSE data <- read.csv("file.csv",check.namesFALSE)具体解释 check.names是…

C# List 详解二

目录 5.Clear() 6.Contains(T) 7.ConvertAll(Converter) ,toutput> 8.CopyTo(Int32, T[], Int32, Int32) 9.CopyTo(T[]) 10.CopyTo(T[], Int32) C# List 详解一 1.Add(T)&#xff0c;2.AddRange(IEnumerable)&#xff0c;3.AsReadOnly()&…

pytorch创建和操作tensor

import torch import numpy as np### 1. 由函数创建 x torch.zeros(5, 3, dtypetorch.int64) # 指定数据类型 print(x.dtype) x torch.zeros(5, 3) # 默认数据类型为torch.float32 print(x.dtype)x torch.rand(5, 3)x torch.torch.ones(10,2,3) x torch.empty(5, 3)# Re…

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

【JavaEE】Spring中注解的方式去获取Bean对象

【JavaEE】Spring的开发要点总结&#xff08;3&#xff09; 文章目录 【JavaEE】Spring的开发要点总结&#xff08;3&#xff09;1. 属性注入1.1 Autowired注解1.2 依赖查找 VS 依赖注入1.3 配合Qualifier 筛选Bean对象1.4 属性注入的优缺点 2. Setter注入2.1 Autowired注解2.2…

21matlab数据分析牛顿插值(matlab程序)

1.简述 一、牛顿插值法原理 1.牛顿插值多项式   定义牛顿插值多项式为&#xff1a; N n ( x ) a 0 a 1 ( x − x 0 ) a 2 ( x − x 0 ) ( x − x 1 ) ⋯ a n ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 1 ) N_n\left(x\right)a_0a_1\left(x-x_0\right)a_2\left(x-x_0\…

NLP masked_tokens[]、token_masks[]是什么?

1、masked_tokens[]、token_masks[]介绍 masked_tokens和token_masks两个列表用于存储mask处理后的token&#xff08;分词&#xff09;结果和对应的mask标志。 masked_tokens列表存储经过mask处理后的分词结果。 token_masks列表存储与每个分词结果对应的mask标志。 2、示例…

Electron运行时报错:浏览器报错Uncaught ReferenceError: require is not defined

这个错误通常发生在浏览器环境中使用了Node.js的模块化语法。由于浏览器不支持直接使用require关键字&#xff0c;所以会报错。 解决这个问题的一种方法是使用Webpack等工具将你的代码打包成浏览器可执行的文件。这样可以将require语法转换为浏览器可识别的语法。 另外&#…

SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试

SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试 在开发 SpringBoot 应用程序时&#xff0c;我们通常需要与数据库进行交互。为了确保我们的应用程序在生产环境中可以正常工作&#xff0c;我们需要进行数据库集成测试&#xff0c;以测试我们的应用程序是否能…

剑指offer61.扑克牌中的顺子

我的想法非常简单&#xff0c;就是先给数组排序&#xff0c;然后统计里面有几个0&#xff0c;然后遍历数组&#xff0c;如果是0或者比后面一个数小1就直接进入下一次循环&#xff0c;如果比后面一个数小2&#xff0c;就用掉一个0&#xff0c;0的数量减1&#xff0c;如果比后面的…

Pycharm----导入库文件夹不在py文件的目录下

问题描述&#xff1a; 想在不同目录下导入根目录的包&#xff0c;直接写会报错。如下边object_detect.py在function文件夹下&#xff0c;导入包默认在这个文件下&#xff0c;但我想导入根目录models和utils下的包 解决方法&#xff1a; 将根目录设置为源代码根目录&#xff0…

【OC总结 面向对象 + 内存管理 + runtime】

文章目录 前言面向对象1.1 一个NSObject对象占用多少内存&#xff1f;1.2 iOS的继承链 & 对象的指针指向了哪里&#xff1f;1.3 OC的类的信息存放在哪里&#xff1f;-isa指针1.4 isMemberOfClass & isKindOfClass Runtime1.4 讲一下OC的消息机制1.5 消息转发机制流程1.…

【指针和数组笔试题(1)】详解指针、数组笔试题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言整型数组字符数组第一组题第二组题第三组题 总结 前言 在计算之前要了解基本概念&#xff1a; 数组名的理解 数组名是数组首元素的地址 有两个例外 1.sizeof(…

Linux网络基础 — 数据链路层

目录 数据链路层 认识以太网 局域网转发的原理 认识以太网的MAC报头 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 基于MAC帧协议再次谈一谈局域网转发的原理 认识MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对于TCP协议的影响 ARP协议 ARP协议的作用 …

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-15/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org visonOS …

SpringBoot整合SpringCloudStream3.1+版本的Kafka死信队列

SpringBoot整合SpringCloudStream3.1版本的Kafka死信队列 上一篇直通车 SpringBoot整合SpringCloudStream3.1版本Kafka 实现死信队列步骤 添加死信队列配置文件&#xff0c;添加对应channel通道绑定配置对应的channel位置添加重试配置 结果 配置文件 Kafka基本配置&#…

C++ deque/queue/stack的底层原理

deque容器的存储结构 和 vector 容器采用连续的线性空间不同&#xff0c;deque 容器存储数据的空间是由一段一段等长的连续空间构成&#xff0c;各段空间之间并不一定是连续的&#xff0c;可以位于在内存的不同区域。 deque采用一块所谓的map数组&#xff08;注意&#xff0c…

LeetCode 0874. 模拟行走机器人:哈希表模拟

【LetMeFly】874.模拟行走机器人&#xff1a;哈希表模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/walking-robot-simulation/ 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以接收以下三种类…