课程名称:3.8.1 TiDB 的授权与认证
学习时长:16min
课程收获:用户登陆验证的过程,权限的原理和使用
课程内容:
-
认证
-
当TiDB收到一个新连接时发生了什么
-
Server发送Handshake Packet,包含
- server能力信息
- 密码验证的seed
-
Client用Handshake Response回复
- 协商协议细节
- 可能会升级为SSL连接
-
Client返回给Server的响应还包含认证信息
- 用户名和主机
- 加密的密码
-
账户信息存在那儿
-
- 存储在mysql.user表中
- server使用这些信息进行授权
- 数据也会缓存到内存以提升性能
- 手工编辑该表,需要执行flush privileges来刷新缓存
- username + host来标识一个用户连接
-
-
密码如何加密
-
- 密码以非明文形式保存
- 密码以非明文形式传输
-
从概念上,authentication_string和raw password类似于公钥和私钥
-
TiDB使用mysql_native_password,默认使用MySQL5.7的鉴权方法
- Server发送随机值到Client
- Cilent用私钥(即raw password)加密这个随机值
- Server使用公钥(即authentication_string)验证结果
-
-
严格讲,mysql_native_password并未真正使用公钥和私钥非对称加密
-
authentication_string只是简单的对raw password进行哈希
-
真正流程如下:
-
-
-
-
授权
-
TiDB提供的权限
-
大部分和MySQL相同
-
权限存储在:mysql.user/mysql.db/mysql.tables_priv中
- mysql.user:grant xxx on . to yyy@zzz;
- mysql.db:grant xxx on db.* to yyy@zzz;
- mysql.tables_priv:grant xxx on db.table to yyy@zzz;
-
TiDB不支持列级权限
-
-
请求校验过程
- 搜索全局权限
- 搜索数据库级权限
- 搜索表级权限
-
RBAC(role based access control)
-
TiDB4.0开始支持
-
实现:
-
创建角色
- create role ‘app_developer’;
-
为角色分配权限
- grant all on db.* to ‘app_developer’;
-
创建用户
- create ‘dev1’@‘localhost’ identified by ‘dev1pass’;
-
将角色授予用户
- grant ‘app_developer’ to ‘dev1’@‘localhost’;
-
激活角色
- set default role all to ‘dev1’@‘localhost’;
-
查看用户的角色
- show grants for ‘dev1’@‘localhost’ usgin ‘app_developer’;
-
-
-