多用户与RBAC权限管理机制
概述
百度智能云VectorDB作为一款企业级数据库产品,与当今大多数企业级数据库一样,也支持了完善的多用户(User)机制,以及RBAC权限管理体系。RBAC的全称是Role-based Access Control,即基于角色的访问控制,是数据库领域最为通行的权限管理体系。该权限管理体系从1.3版本开始支持,若您的实例尚不支持,请联系我们来升级。
在RBAC权限体系中,至少包括主体、客体和权限这三类概念,通过其三元组关系来表达“某个主体对某个/些客体具备何种/多种权限”的语义。被授予的权限关系信息持久化在数据库内部,当用户对数据库发起操作时,数据库会先基于授权信息执行鉴权,鉴权失败则拒绝访问。在VectorDB中,主体包括用户(User)和角色(Role),客体包括数据库管理系统(System)、库(Database)、表(Table)等类别。根据客体的类别,所有的权限相应地也分为系统级权限、库级权限和表级权限。此外,还提供了一个特殊的用户级别权限,用于控制用户的所有权限是否生效。
客体
在主流数据库中,对于库和表这两类客体,一般都支持通过通配符,即*
来代表任意对应类别的客体。通过通配符,库表两级客体关系通常可以表达成如下4种:
客体表示 | 说明 |
---|---|
*.* |
所有库的所有表 |
A.* |
库A下的所有表 |
A.T |
库A下的表T |
*.T |
所有库下的表T |
在VectorDB中,我们去掉了对*.T
这类客体表示的支持。原因在于,我们认为不同库之间的同名表,不一定存在逻辑上的对等关系,很可能是出于巧合,让不同库的同名表具备相同的权限,可能在无意中导致信息泄露。其余三种客体表示从高到底可以构成一个层次:*.*
、A.*
、A.T
。
此外,在授予系统级权限的时候,用*.*
来代表目标客体。
主体
主体包括用户和角色,均能够被数据库用户感知和操作。VectorDB支持多个用户和多个角色。支持将一个或多个角色授权给指定的用户,也支持将指定的角色授权给多个用户。当一个用户被授予了某个角色时,自动获得了该角色的所有权限。除了通过角色来获得权限,用户也能够具备独立权限,即,可以将权限或权限组直接授予给指定的用户。可以看出,一个用户拥有的所有权限是各个权限来源的并集。
在VectorDB中,一个用户针对某个客体的权限可能来自于多个来源,即重复权限。重复权限在实现上是分别记录的,这更加便于跟踪审计权限的来源。重复权限在被回收时,回收操作仅能够回收相应来源的权限,其它来源的重复权限无法被该命令回收。也就是说,若某用户对某个客体,被独立授予了权限P,角色R1和角色R2,且R1和R2本身对该客体也具备了权限P,那么该用户从3个来源获得了对该客体的权限P,若仅R1被回收,那么该用户仍然能够从剩下2个来源获得对该客体的权限P。只有R1、R2和独立授权P均被回收时,该用户才会失去对该客体的权限P。简而言之,VectorDB的用户,其不同权限来源之间互不干扰。
在VectorDB的用户和用户、用户和角色之间,我们引入了父子关系的概念。父子关系的概念很简单,总结起来为2条:
- 用户与用户的父子关系:若用户U1创建了用户U2,那么U1是U2的父亲;
- 用户与角色的父子关系:若用户U1创建了角色R1,那么U1是R1的父亲。
通过父子关系链,整个数据库的用户和角色构成了一个完整的血缘关系树。基于这个血缘关系树,我们可以实现如下几个核心约束:
- 约束1:用户在授权时,仅能够将自身已经具备的客体-权限关系授予其它用户或角色,无法将其不具备的客体-权限关系授予出去,回收客体-权限关系时同理;
- 约束2:用户在授权时,仅能够将客体-权限关系授予给它的子孙用户或角色,无法对其它用户或角色进行授权,也不能授予自己,回收客体-权限关系时同理;
- 约束3:作为约束2的一个特例,用户在对其它用户授予角色或者从其它用户回收角色时,该角色要么是自身已经被授予的,要么是自己的子孙角色,否则无法执行该操作;
- 约束4:用户在删除用户或者角色时,仅能够删除它的子孙用户或角色,无法删除其它用户或角色,也不能删除自己;
- 约束5:用户在删除其它用户时,除了满足约束4,还要求被删用户的全部子孙用户和角色已经被先行删除,也就是说,不能级联删除血缘关系树,也不能改变血缘关系树的严格父子关系(即孙子角色或用户不可以变为儿子角色或用户)。
约束1~约束4的目的在于严格控制客体-权限关系的操作范畴,避免各类权限漏洞。约束5的目的是简化用户和角色管理的规则,减少误操作的可能性,同样也能够提升安全性。
在VectorDB实例初始化时,内建了一个默认的管理员角色ADMIN
,它具备对所有客体的所有权限,同时内建了一个管理员用户root
,且默认被授予了ADMIN
角色,root
用户是ADMIN
角色的父亲,也是未来所有用户和角色的祖先。内建用户和角色均无法被删除。
权限
VectorDB除了提供一系列细粒度的独立权限(Privilege),同时为了方便用户使用,也提供了几种内置的权限组(Privilege Group)。下面给出所有的权限和权限组的定义、行为和影响面。
独立权限
所有的独立权限定义及详细描述如下表所示:
类别 | 权限 | 详细说明 | 鉴权客体层次 | 影响的接口 |
---|---|---|---|---|
用户级 | USAGE |
登录及使用数据库的权限,每个用户默认具备。 作为前置检查, USAGE 权限影响所有的操作。若某个用户失去USAGE 权限,则其发送过来的所有操作都将被拒绝。该权限可用于DBA临时封禁异常用户,相比于回收该用户的所有权限,仅需要回收该用户的USAGE 权限,保留该用户的其它权限,便于追踪和审计。注: root 用户是内置用户,其USAGE 权限无法被回收。 |
*.* |
所有下述接口 |
系统级 | CREATE_USER |
创建用户 | *.* |
CreateUser |
系统级 | DROP_USER |
删除用户 | *.* |
DropUser |
系统级 | PASSWORD |
修改用户密码(API_KEY)。密码修改规则如下:PASSWORD 权限时,则可以修改; |
*.* |
ChangePassword |
系统级 | CREATE_ROLE |
创建角色 | *.* |
CreateRole |
系统级 | DROP_ROLE |
删除角色 | *.* |
DropRole |
系统级 | GRANT_REVOKE |
对用户或者角色进行授权或者回收权限 | *.* |
GrantUserRoles、RevokeUserRoles、GrantUserPrivileges、RevokeUserPrivileges、GrantRolePrivileges、RevokeRolePrivileges |
系统级 | SHOW_USER |
展示用户信息,以及根据权限条件筛选用户 | *.* |
ShowUser、ShowUserPrivileges |
系统级 | SHOW_ROLE |
展示角色信息,以及根据权限条件筛选角色 | *.* |
ShowRole、ShowRolePrivileges |
系统级 | CREATE_DATABASE |
创建新库 | *.* |
CreateDatabase |
库级 | DROP_DATABASE |
删除库 | A.* |
DropDatabase |
库级 | SHOW_DATABASE |
列出所有的库,以及展示库的信息 | *.* 或 A.* |
*.* 时:ListDatabase A.* 时:ShowDatabase |
库级 | CREATE_TABLE |
创建新表 | A.* |
CreateTable |
表级 | DROP_TABLE |
删除表 | A.* |
DropTable |
表级 | SHOW_TABLE |
列出某库下面的所有表,以及展示表的详细信息 | A.* 或 A.T |
A.* 时:ListTable A.T 时:ShowTableStats、DescribeTable、DescribeIndex |
表级 | QUERY |
查询记录 | A.T |
Query |
表级 | SELECT |
筛选记录 | A.T |
Select |
表级 | SEARCH |
检索记录 | A.T |
Search、BatchSearch、HybridSearch、MultiVectorSearch |
表级 | INSERT |
插入记录 | A.T |
Insert |
表级 | UPSERT |
覆盖型插入记录 | A.T |
Upsert |
表级 | UPDATE |
更新记录 | A.T |
Update |
表级 | DELETE |
删除记录 | A.T |
Delete |
表级 | ALTER_TABLE |
更新表的Schema | A.T |
AddField、CreateIndex、DropIndex |
表级 | CONFIG_INDEX |
配置索引属性 | A.T |
ModifyIndex |
表级 | BUILD_INDEX |
构建向量索引 | A.T |
RebuildIndex |
表级 | ALIAS |
对表取别名或者取消别名 | A.T |
AliasTable、UnaliasTable |
实际上,除了上述权限,VectorDB还支持更多的独立权限,由于对应的功能尚未上线,故暂不展示出来。
权限组
如上所述,权限组可以极大提升权限管理的效率,降低误操作的风险。VectorDB内置了几种权限组,其定义和详细描述如下:
权限组 | 说明 | 包含的独立权限 |
---|---|---|
ALL |
除USAGE 之外的所有权限 |
略 |
SYSTEM_ALL |
所有系统级权限 | CREATE_USER 、DROP_USER 、PASSWORD 、CREATE_ROLE 、DROP_ROLE 、GRANT_REVOKE 、SHOW_USER 、SHOW_ROLE 、CREATE_DATABASE |
TABLE_ALL |
所有表级权限 | CREATE_TABLE 、DROP_TABLE 、SHOW_TABLE 、QUERY 、SELECT 、SEARCH 、INSERT 、UPSERT 、UPDATE 、DELETE 、SET_TTL 、ALTER_TABLE 、CONFIG_INDEX 、BUILD_INDEX 、ALIAS |
TABLE_CONTROL |
所有表级权限中的控制类权限 | CREATE_TABLE 、DROP_TABLE 、SHOW_TABLE 、ALTER_TABLE 、CONFIG_INDEX 、BUILD_INDEX 、ALIAS |
TABLE_READONLY |
所有表权限中的只读类权限 | QUERY 、SELECT 、SEARCH |
TABLE_READWRITE |
所有表权限中的可读可写权限 | QUERY 、SELECT 、SEARCH 、INSERT 、UPSERT 、UPDATE 、DELETE |