TiDB数据库权限管理

2023-11-01

TiDB数据库权限管理

TiDB 的权限管理系统按照 MySQL 的权限管理进行实现,TiDB 支持大部分的 MySQL 的语法和权限类型。

本文主要介绍 TiDB 权限相关操作、各项操作需要的权限以及权限系统的实现。

权限相关操作

授予权限

授予 xxx 用户对数据库 test 的读权限:

GRANT SELECT ON test.* TO 'xxx'@'%';   ##  test.*表示test数据库下所有的表

xxx 用户授予所有数据库,全部权限:

GRANT ALL PRIVILEGES ON *.* TO 'xxx'@'%';

GRANT 为一个不存在的用户授予权限时,默认并不会自动创建用户。该行为受 SQL Mode 中的 NO_AUTO_CREATE_USER 控制。 如果从 SQL Mode 中去掉 NO_AUTO_CREATE_USER,当 GRANT 的目标用户不存在时,TiDB 会自动创建用户。

mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
set @@sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected
SELECT * FROM mysql.user WHERE user='haohan';
Empty set
 GRANT ALL PRIVILEGES ON test.* TO 'haohan'@'%' IDENTIFIED BY 'haohan';
Query OK, 1 row affected
SELECT user,host,password FROM mysql.user WHERE user='haohan';
+--------+------+-------------------------------------------+
| user   | host | password                                  |
+--------+------+-------------------------------------------+
| haohan | %    | *DC593F27E34ADDEEBEBDF4B9FAC887373B642336 |
+--------+------+-------------------------------------------+
1 row in set

上述示例中,haohan@% 即自动添加的用户。

GRANT 对于数据库或者表的授权,不检查数据库或表是否存在。

SELECT * FROM test.xxxx;
1146 - Table 'test.xxxx' doesn't exist
GRANT ALL PRIVILEGES ON test.xxxx TO haohan;
Query OK, 0 rows affected
SELECT user,host FROM mysql.tables_priv WHERE user='haohan';
+--------+------+
| user   | host |
+--------+------+
| haohan | %    |
+--------+------+
1 row in set

GRANT 可以模糊匹配地授予数据库和表:

GRANT ALL PRIVILEGES ON `samp%`.* TO haohan;
Query OK, 0 rows affected
SELECT user,host,db FROM mysql.db WHERE user='haohan';
+--------+------+-------+
| user   | host | db    |
+--------+------+-------+
| haohan | %    | samp% |  ##刚刚添加进去的
| haohan | %    | test  |
+--------+------+-------+
2 rows in set

这个例子中通过 % 模糊匹配,所有 samp 开头的数据库,都被授予了权限。

收回权限

REVOKE 语句与 GRANT 对应:

REVOKE ALL PRIVILEGES ON `test`.* FROM 'haohan'@'%';

注意:

REVOKE 收回权限时只做精确匹配,若找不到记录则报错。而 GRANT 授予权限时可以使用模糊匹配。

REVOKE ALL PRIVILEGES ON `samp`.* FROM 'haohan'@'%';
1105 - There is no such grant defined for user 'haohan' on host '%' on database samp

关于模糊匹配和转义,字符串和 identifier:

GRANT ALL PRIVILEGES ON `samp\%`.* TO 'haohan'@'%';
Query OK, 0 rows affected

上述例子是精确匹配名为 samp%</.code> 的数据库,注意使用 \ 转义字符。

以单引号包含的部分,是一个字符串。以反引号包含的部分,是一个 identifier。注意下面的区别:

GRANT ALL PRIVILEGES ON 'test'.* TO 'haohan'@'%';
1064 - You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 30 near "'test'.* TO 'haohan'@'%';"
GRANT ALL PRIVILEGES ON `test`.* TO 'haohan'@'%';
Query OK, 0 rows affected

如果想将一些特殊的关键字做为表名,可以用反引号包含起来。比如:

 CREATE TABLE `select` (id int);
Query OK, 0 rows affected

查看为用户分配的权限

SHOW GRANTS 语句可以查看为用户分配了哪些权限。例如:

查看当前用户的权限:

SHOW GRANTS;
+-------------------------------------------------------------+
| Grants for User                                             |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set

查看某个特定用户的权限:

SHOW GRANTS for 'haohan'@'%';
+---------------------------------------------------+
| Grants for haohan@%                               |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO 'haohan'@'%'                |
| GRANT ALL PRIVILEGES ON samp\%.* TO 'haohan'@'%'  |
| GRANT ALL PRIVILEGES ON test.* TO 'haohan'@'%'    |
| GRANT ALL PRIVILEGES ON test.xxxx TO 'haohan'@'%' |
+---------------------------------------------------+
4 rows in set

更精确的方式,可以通过直接查看授权表的数据实现。比如想知道,名为 hanhan@% 的用户是否拥有对 number_pool.userInsert 权限:

  1. 先查看该用户是否拥有全局 Insert 权限:
SELECT Insert_priv FROM mysql.user WHERE user='haohan' AND host='%';
  1. 如果没有,再查看该用户是否拥有 number_pool 数据库级别的 Insert 权限:
SELECT Insert_priv FROM mysql.db WHERE user='haohan' AND host='%';
  1. 如果仍然没有,则继续判断是否拥有 number_pool.user这张表的 Insert 权限:
SELECT table_priv FROM mysql.tables_priv WHERE user='haohan' AND host='%' AND db='number_pool';

TiDB 各操作需要的权限

TiDB 用户目前拥有的权限可以在 INFORMATION_SCHEMA.USER_PRIVILEGES 表中查找到。

权限类型 权限变量名 权限简述
ALL AllPriv 所有权限
Drop DropPriv 删除 schema/table
Index IndexPriv 创建/删除 index
Alter AlterPriv 执行 ALTER 语句
Super SuperPriv 所有权限
Grant GrantPriv 授予其他用户权限
Create CreatePriv 创建 schema/table
Select SelectPriv 读取表内容
Insert InsertPriv 插入数据到表
Update UpdatePriv 更新表中数据
Delete DeletePriv 删除表中数据
Trigger TriggerPriv 尚未使用
Process ProcessPriv 显示正在运行的任务
Execute ExecutePriv 执行 execute 语句
Drop Role DropRolePriv 执行 drop role
Show View ShowViewPriv 执行 show create view
References ReferencesPriv 尚未使用
Create View CreateViewPriv 创建视图
Create User CreateUserPriv 创建用户
Create Role CreateRolePriv 执行 create role
Show Databases ShowDBPriv 显示 database 内的表情况

ALTER

  • 对于所有的 ALTER 语句,均需要用户对所操作的表拥有 ALTER 权限。
  • ALTER...DROPALTER...RENAME TO 外,均需要对所操作表拥有 INSERTCREATE 权限。
  • 对于 ALTER...DROP 语句,需要对表拥有 DROP 权限。
  • 对于 ALTER...RENAME TO 语句,需要对重命名前的表拥有 DROP 权限,对重命名后的表拥有 CREATEINSERT 权限。

注意:

根据 MySQL 5.7 文档中的说明,对表进行 ALTER 操作需要 INSERTCREATE 权限,但在 MySQL 5.7.25 版本实际情况中,该操作仅需要 ALTER 权限。目前,TiDB 中的 ALTER 权限与 MySQL 实际行为保持一致。

### CREATE DATABASE 需要对数据库拥有 CREATE 权限。

CREATE INDEX

需要对所操作的表拥有 INDEX 权限。

CREATE TABLE

需要对所操作的表拥有 CREATE 权限;若使用 CREATE TABLE…LIKE… 需要对相关的表拥有 SELECT 权限。

CREATE VIEW

需要拥有 CREATE VIEW 权限。

注意:

如果当前登录用户与创建视图的用户不同,除需要 CREATE VIEW 权限外,还需要 SUPER 权限。

DROP DATABASE

需要对数据库拥有 DROP 权限。

DROP INDEX

需要对所操作的表拥有 INDEX 权限。

DROP TABLES

需要对所操作的表拥有 DROP 权限。

TRUNCATE TABLE

需要对所操作的表拥有 DROP 权限。

RENAME TABLE

需要对重命名前的表拥有 ALTERDROP 权限,对重命名后的表拥有 CREATEINSERT 权限。

ANALYZE TABLE

需要对所操作的表拥有 INSERTSELECT 权限。

SHOW

SHOW CREATE TABLE 需要任意一种权限。

SHOW CREATE VIEW 需要 SHOW VIEW 权限。

CREATE ROLE/USER

CREATE ROLE 需要 CREATE ROLE 权限。

CREATE USER 需要 CREATE USER 权限

DROP ROLE/USER

DROP ROLE 需要 DROPROLE 权限。

DROP USER 需要 CREATEUSER 权限

ALTER USER

ALTER USER 需要 CREATEUSER 权限。

GRANT

GRANT 需要 GRANT 权限并且拥有 GRANT 所赋予的权限。

REVOKE

REVOKE 需要 SUPER 权限。

权限系统的实现

授权表

以下几张系统表是非常特殊的表,权限相关的数据全部存储在这几张表内。

  • mysql.user:用户账户,全局权限
  • mysql.db:数据库级别的权限
  • mysql.tables_priv:表级别的权限
  • mysql.columns_priv:列级别的权限,当前暂不支持

这几张表包含了数据的生效范围和权限信息。例如,mysql.user 表的部分数据:

SELECT User,Host,Select_priv,Insert_priv FROM mysql.user LIMIT 1;
+------+------+-------------+-------------+
| User | Host | Select_priv | Insert_priv |
+------+------+-------------+-------------+
| root | %    |             |             |
+------+------+-------------+-------------+
1 row in set

这条记录中,HostUser 决定了 root 用户从任意主机 (%) 发送过来的连接请求可以被接受,而 Select_privInsert_priv 表示用户拥有全局的 SelectInsert 权限。mysql.user 这张表里面的生效范围是全局的。

mysql.db 表里面包含的 HostUser 决定了用户可以访问哪些数据库,权限列的生效范围是数据库。

理论上,所有权限管理相关的操作,都可以通过直接对授权表的 CRUD 操作完成。

实现层面其实也只是包装了一层语法糖。例如删除用户会执行:

DELETE FROM mysql.user WHERE user='haohan';

但是,不推荐手动修改授权表,建议使用 DROP USER 语句:

DROP USER 'heohan';   #这种可以删除允许所有号段的IP地址登陆的用户

或:

 DROP USER 'haohan'@'192.168.100.%';  #这种可以删除固定IP地址或者一个范围的IP地址的用户

连接验证

当客户端发送连接请求时,TiDB 服务器会对登录操作进行验证。验证过程先检查 mysql.user 表,当某条记录的 UserHost 和连接请求匹配上了,再去验证 Password。用户身份基于两部分信息,发起连接的客户端的 Host ,以及用户名 User 。如果 User 不为空,则用户名必须精确匹配。

User+Host 可能会匹配 user 表里面多行,为了处理这种情况, user 表的行是排序过的,客户端连接时会依次去匹配,并使用首次匹配到的那一行做权限验证。排序是按 Host 在前, User 在后。

请求验证

连接成功之后,请求验证会检测执行操作是否拥有足够的权限。

对于数据库相关请求 (INSERTUPDATE),先检查 mysql.user 表里面的用户全局权限,如果权限够,则直接可以访问。如果全局权限不足,则再检查 mysql.db 表。

user 表的权限是全局的,并且不管默认数据库是哪一个。比如 user 里面有 DELETE 权限,任何一行,任何的表,任何的数据库。

db表里面,User 为空是匹配匿名用户,User 里面不能有通配符。Host 和 Db 列里面可以有 % _,可以模式匹配。

user db 读到内存也是排序的。

tables_privcolumns_priv 中使用 % 是类似的,但是在Db, Table_name, Column_name 这些列不能包含 %。加载进来时排序也是类似的。

生效时机

TiDB 启动时,将一些权限检查的表加载到内存,之后使用缓存的数据来验证权限。系统会周期性的将授权表从数据库同步到缓存,生效则是由同步的周期决定,目前这个值设定的是 5 分钟。

修改了授权表,如果需要立即生效,可以手动调用:

FLUSH PRIVILEGES;

限制和约束

一些使用频率偏低的权限当前版本的实现中还未做检查,比如FILE/USAGE/SHUTDOWN/EXECUTE/PROCESS/INDEX 等等,未来会陆续完善。

现阶段对权限的支持还没有做到 column 级别。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TiDB数据库权限管理 的相关文章

  • 视频86免费影院-视频电影网聚平台

    这两年在互联网来讲 视频行业是比较火热的 各大视频分享网站 融资 风投 欢乐声一片 这表明中国的互联网用户随着网络带宽的加大对在线视频 电影还是比较喜欢的 正好在网上看到一个不错的网站程序 修改过后自己也来做一个视频网站 不过内容都是采集的

随机推荐

  • 建立Tahi IPv6测试环境

    首先说一下TAHI测试的相关术语 Tester Node TN 测试平台 A tester node for the conformance tests Node Under Test NUT 待测试机 A testee node for
  • oracle查看服务器名字,查看oracle数据库服务器的名字

    查看oracle数据库服务器的名字 windows 中 1 select name from v database 直接运行就可以查看了 2 查看tnsnames ora 的连接 有个SID SID就是服务名了 1 查看oracle的安装目
  • java 面向对象编程——简介

    目录 第一章 对象和类 一 面向对象的程序设计 1 抽象的数据类型 2 什么是类 3 总结 二 定义一个类 1 定义类的成员变量 2 定义类的成员的方法 3 类的成员变量和方法总结 4 创建并使用对象 第二章 方法 一 方法的重载 1 方法
  • Spring Cloud Alibaba版本选型

    Spring Cloud Alibaba版本选型 版本说明 https github com alibaba spring cloud alibaba wiki E7 89 88 E6 9C AC E8 AF B4 E6 98 8E
  • javac不是内部命令或外部命令

    JAVAC 不是内部或外部命令 也不是可运行的程序或批处理文件 今天在运行JAVA的时候突然出了这个错误 这可怎么办 刚接触JAVA的新手可能就不知道怎么解决 JAVAC 不是内部命令或外部命令 下面我就来说说 解决 JAVAC 不是内部命
  • Sed 介绍和教程

    Sed 介绍和教程 作者 Bruce Barnett 译者 Koala 原文地址 http www grymoire com Unix Sed html 注 译者不懂sed Sed 介绍 如果你想写一个程序对一个文件做一些改动 那就sed就
  • B站狂神说--ElasticSearch笔记

    课程 免费 网址 https www bilibili com video BV17a4y1x7zq spm id from 333 999 0 0 笔记来源 https www kuangstudy com bbs 14427364812
  • 知识图谱在金融领域的分析与应用

    本文首发于个人博客 www bobinsun cn 前言 知识图谱因其自身的图展示 图挖掘 图模型计算优势 可帮助金融从业人员进行业务场景的分析与决策 有利于建立客户画像 进行精准营销获客 发现信用卡套现 资金挪用等行为 更好的表达 分析金
  • 车规级MCU知识介绍

    一辆传统燃油车需要大约500到600颗芯片 轻混汽车大约需要1000颗 插电混动和纯电动汽车则需要至少2000颗芯片 这就意味着在智能电动汽车快速发展的过程中 不仅对先进制程芯片需求不断增加 而且对传统芯片需求也会持续增加 MCU就是这样
  • PXE装机报错汇总

    报错1 PXE E53 No boot filename received CLIENT MAC ADDR 88 0C 29 0D 88 3C GUID 564D6429 2E4A 0B83 6161 AE0A050D803C PXE MB
  • 【持续集成CI/持续部署CD】二、Docker安装Maven私服Nexus

    本文是关于通过 Docker 进行安装部署 Nexus3 私服的快速入门和简单使用案例 一 安装 1 通过 docker 获取最新版本的 nexus3 镜像 docker pull sonatype nexus3创建 docker 镜像到宿
  • Pytorch中交叉熵损失函数 nn.CrossEntropyLoss()计算过程

    pytorch的交叉熵损失函数是如何计算outputs和 labels之间的损失的 对于一个分类问题的CNN模型 最后一层的代码一般如下 nn Linear 2048 num classes 然后计算一次迭代损失的代码一般如下 loss f
  • 国教 2019级 算法设计与分析 作业集锦(期末作业)

    7 1 寻找第k小的数 20 分 给定若干整数 请设计一个高效的算法 确定第k小的数 输入格式 测试数据有多组 处理到文件尾 每组测试数据的第1行输入2个整数n k 1 k n 1000000 第2行输入n个整数 每个数据的取值范围在0到1
  • Linux内核的配置和编译

    文章目录 前言 1 内核介绍 2 linux内核源码目录结构 3 内核配置和编译实验 4 内核的配置原理 5 menuconfig 6 Kconfig文件详解 7 menuconfig的实验 前言 以下内容基于2 6 35 7版本内核 文件
  • MyBatis和Hibernate相比,优势在哪里

    看到现在好多Web项目用了MyBatis 没感觉MyBatis好到哪里了 从开发效率上讲 不管是Hibernate的反向工程 还是自动建表 关联映射都比MyBatis方便得多 难道仅仅是因为运行速度 Hibernate也有缓存啊 或者 二者
  • 生成带有目录的Markdown格式文档

    什么是Markdown Markdown 是一种轻量级的 标记语言 它的优点很多 目前也被越来越多的写作爱好者 撰稿者广泛使用 使用 Markdown 的优点 专注你的文字内容而不是排版样式 轻松的导出 HTML PDF 和本身的 md 文
  • 性能测试出现:java.net.NoRouteToHostException: Can‘t assign requested address (Address not available)解决方案

    前言 在性能测试中会常常遇到java net NoRouteToHostException Can t assign requested address Address not available 这个问题 什么原因导致的呢 这个原因不一定
  • 全网最全Log配置教程及框架性能比较,看这篇就够了!

    每天早上七点三十 准时推送干货 一 摘要 不管是使用何种编程语言 何种框架 日志输出几乎无处不再 也是任何商业软件中必不可少的一部分 总结起来 日志的用途大致可以归纳成以下三种 问题追踪 通过日志不仅仅包括我们程序的一些bug 也可以在安装
  • VS堆栈溢出异常

    总是会遇到报堆栈溢出异常未处理错误 解决过几次 但是下次还是忘记怎么处理 所以写在博客上做个笔记 错误如图 解决方法 项目解决方案里右键项目 选择属性 在堆栈保留处输入40000000 4G64位电脑经验值 8G内存就要输入80000000
  • TiDB数据库权限管理

    TiDB数据库权限管理 TiDB 的权限管理系统按照 MySQL 的权限管理进行实现 TiDB 支持大部分的 MySQL 的语法和权限类型 本文主要介绍 TiDB 权限相关操作 各项操作需要的权限以及权限系统的实现 权限相关操作 授予权限