内置鉴权
关键概念
鉴权是指根据用户身份限制其访问和操作 Doris 资源的机制。
Doris 基于 RBAC(Role-Based Access Control)的权限管理模型进行权限控制。
权限
权限作用的对象是节点、数据目录、数据库或表。不同的权限代表不同的操作许可。
所有权限
| 权限 | 对象类型 | 描述 | 
|---|---|---|
| Admin_priv | Global | 超管权限。 | 
| Node_priv | Global | 节点变更权限。包括 FE、BE、BROKER 节点的添加、删除、下线等操作。 | 
| Grant_priv | Global,Catalog,Db,Table,Resource,Workload Group | 权限变更权限。允许执行包括授权、撤权、添加/删除/变更 用户/角色 等操作。 给其他用户/角色授权时,2.1.2 版本之前,当前用户只需要相应层级的 Grant_priv 权限,2.1.2 版本之后当前用户也要有想要授权的资源的权限。 给其他用户分配角色时,要有 Global 级别的 Grant_priv 权限。  | 
| Select_priv | Global,Catalog,Db,Table,Column | 对数据目录、数据库、表、列的只读权限。 | 
| Load_priv | Global,Catalog,Db,Table | 对数据目录、数据库、表的写权限。包括 Load、Insert、Delete 等。 | 
| Alter_priv | Global,Catalog,Db,Table | 对数据目录、数据库、表的更改权限。包括重命名 库/表、添加/删除/变更 列、添加/删除 分区等操作。 | 
| Create_priv | Global,Catalog,Db,Table | 创建数据目录、数据库、表、视图的权限。 | 
| Drop_priv | Global,Catalog,Db,Table | 删除数据目录、数据库、表、视图的权限。 | 
| Usage_priv | Resource,Workload Group | Resource 和 Workload Group 的使用权限。 | 
| Show_view_priv | Global,Catalog,Db,Table | 执行 SHOW CREATE VIEW 的权限。 | 
角色
Doris 可以创建自定义命名的角色。角色可以被看做是一组权限的集合。新创建的用户可以被赋予某一角色,则自动被赋予该角色所拥有的权限。后续对角色的权限变更,也会体现在所有属于该角色的用户权限上。
内置角色
内置角色是 Doris 默认创建的角色,并默认拥有一定的权限,包括 operator 和 admin。
- operator : 拥有 Admin_priv 和 Node_priv
 - admin: 拥有 Admin_priv
 
用户
在 Doris 中,一个 user_identity 唯一标识一个用户。user_identity 由两部分组成,user_name 和 host,其中 username 为用户名。host 标识用户端连接所在的主机地址。
鉴权机制
Doris 权限设计基于 RBAC(Role-Based Access Control)的权限管理模型,用户和角色关联,角色和权限关联,用户通过角色间接和权限关联。
当角色被删除时,用户自动失去该角色的所有权限。
当用户和角色取消关联,用户自动失去角色的所有权限。
当角色的权限被增加或删除,用户的权限也会随之变更。
┌────────┐        ┌────────┐         ┌────────┐
│  user1 ├────┬───►  role1 ├────┬────►  priv1 │
└────────┘    │   └────────┘    │    └────────┘
              │                 │
              │                 │
              │   ┌────────┐    │
              │   │  role2 ├────┤
┌────────┐    │   └────────┘    │    ┌────────┐
│  user2 ├────┘                 │  ┌─►  priv2 │
└────────┘                      │  │ └────────┘
                  ┌────────┐    │  │
           ┌──────►  role3 ├────┘  │
           │      └────────┘       │
           │                       │
           │                       │
┌────────┐ │      ┌────────┐       │ ┌────────┐
│  userN ├─┴──────►  roleN ├───────┴─►  privN │
└────────┘        └────────┘         └────────┘
如上图所示:
user1 和 user2 都是通过 role1 拥有了 priv1 的权限。
userN 通过 role3 拥有了 priv1 的权限,通过 roleN 拥有了 priv2 和 privN 的权限,因此 userN 同时拥有 priv1,priv2 和 privN 的权限。
注意事项
- 为了方便用户操作,是可以直接给用户授权的,底层实现上,是为每个用户创建了一个专属于该用户的默认角色,当给用户授权时,实际上是在给该用户的默认角色授权。
 - 默认角色不能被删除,不能被分配给其他人,删除用户时,默认角色也自动删除。
 
相关命令
- 授权/分配角色:GRANT
 - 撤权/撤销角色:REVOKE
 - 创建角色:CREATE ROLE
 - 删除角色:DROP ROLE
 - 修改角色:ALTER ROLE
 - 查看当前用户权限和角色:SHOW GRANTS
 - 查看所有用户权限和角色:SHOW ALL GRANTS
 - 查看已创建的角色:SHOW ROLES
 - 查看支持的所有权限项:SHOW PRIVILEGES
 
最佳实践
这里举例一些 Doris 权限系统的使用场景。
- 
场景一
Doris 集群的使用者分为管理员(Admin)、开发工程师(RD)和用户(Client)。其中管理员拥有整个集群的所有权限,主要负责集群的搭建、节点管理等。开发工程师负责业务建模,包括建库建表、数据的导入和修改等。用户访问不同的数据库和表来获取数据。
在这种场景下,可以为管理员赋予 ADMIN 权限或 GRANT 权限。对 RD 赋予对任意或指定数据库表的 CREATE、DROP、ALTER、LOAD、SELECT 权限。对 Client 赋予对任意或指定数据库表 SELECT 权限。同时,也可以通过创建不同的角色,来简化对多个用户的授权操作。
 - 
场景二
一个集群内有多个业务,每个业务可能使用一个或多个数据。每个业务需要管理自己的用户。在这种场景下。管理员用户可以为每个数据库创建一个拥有 DATABASE 层级 GRANT 权限的用户。该用户仅可以对用户进行指定的数据库的授权。