Milvus - 基于角色的访问控制(RBAC)
本文介绍了 Milvus 中的基于角色的访问控制(RBAC)机制,详细说明了 RBAC 的关键组成部分,包括用户、角色、对象和权限之间的关系,以及如何通过角色管理资源访问权限。
1. 概念概述
在 Milvus 中实现资源访问控制时,了解 RBAC 的关键概念非常重要。这些概念包括对象类型、对象名称、用户、角色和权限。
对象类型
对象类型是指被授予权限的对象类别,主要有以下几种:
- Global:全局对象,允许用户执行影响所有集合、用户或全系统设置的操作。
- Collection:特定集合对象,允许用户在特定集合内执行创建索引、插入数据、查询等操作。
- User:与用户管理相关的对象,允许用户管理数据库用户的凭证和角色,如更新用户凭证或查看用户详细信息。
对象名称
对象名称用于指定具体的访问对象。对象名称的规则如下:
- 若对象类型为 Global,对象名称应设为通配符
*
,表示所有该类型的对象。 - 若对象类型为 Collection,对象名称为集合的具体名称。
- 若对象类型为 User,对象名称为数据库用户的名称。
用户
用户是与 Milvus 交互的个人或应用程序,需提供用户名和密码。用户无法直接获得权限,而是通过分配的角色继承权限。
权限
权限定义了可以执行的操作和可访问的资源。权限不直接授予用户,而是授予角色,由角色来分配给用户。
角色
角色是权限的集合,用于定义用户对某些对象所拥有的权限。当角色分配给用户时,该用户就继承了该角色的所有权限。
2. 实例:授予角色权限
以下是一些具体的权限授予实例,帮助更好地理解如何通过代码控制权限。
实例 1:授予用户对所有集合的查询权限
假设有一个角色 DataAnalyst
,我们希望该角色能够对所有集合执行查询操作。代码如下:
milvusClient.grant_privilege(
role_name="DataAnalyst",
object_type="Collection",
privilege="Query",
object_name="*" # 使用通配符 "*" 表示所有集合
)
实例 2:授予用户对单个集合的插入和删除权限
假设一个角色 Editor
需要对某个特定集合 UserCollection
执行插入和删除操作:
# 授予插入权限
milvusClient.grant_privilege(
role_name="Editor",
object_type="Collection",
privilege="Insert",
object_name="UserCollection"
)
# 授予删除权限
milvusClient.grant_privilege(
role_name="Editor",
object_type="Collection",
privilege="Delete",
object_name="UserCollection"
)
实例 3:授予用户对全系统的管理权限
假设一个角色 AdminManager
需要具备对所有用户和角色进行管理的权限。此时,我们可以针对全局对象设置如下权限:
# 授予创建角色权限
milvusClient.grant_privilege(
role_name="AdminManager",
object_type="Global",
privilege="CreateRole",
object_name="*"
)
# 授予删除角色权限
milvusClient.grant_privilege(
role_name="AdminManager",
object_type="Global",
privilege="DeleteRole",
object_name="*"
)
# 授予管理用户权限
milvusClient.grant_privilege(
role_name="AdminManager",
object_type="User",
privilege="UpdateUser",
object_name="*"
)
在 Milvus 的 RBAC 体系中,并没有直接的“组”的概念,但可以通过将用户与角色绑定来实现类似组的权限管理。通过将用户分配给特定角色,可以实现将用户加入“组”的效果,因为角色定义了可以访问的对象和权限。
将用户加入角色的步骤
以下是将用户加入某个角色的步骤和示例代码:
-
创建角色(如果角色尚未存在):
先创建一个角色,可以理解为创建一个“组”。该角色将包含一组权限。milvusClient.create_role(role_name="DataAnalyst")
-
授予角色权限:
为这个角色授予所需权限。可以通过grant_privilege
方法将权限赋予角色,以定义“组”的权限。milvusClient.grant_privilege( role_name="DataAnalyst", object_type="Collection", privilege="Query", object_name="*" )
-
将用户添加到角色:
将用户分配到指定角色,让用户继承该角色的权限。这相当于将用户加入“组”中。milvusClient.add_user_to_role( username="user123", role_name="DataAnalyst" )
注意事项
-
一个用户可以绑定多个角色:如果用户需要多个“组”的权限,可以将用户添加到多个角色。
-
角色的权限继承:用户加入角色后,会自动继承该角色所拥有的权限。
-
删除用户与角色的绑定:如果需要移除用户的某些权限,可以使用
remove_user_from_role
方法解除用户与角色的绑定:milvusClient.remove_user_from_role( username="user123", role_name="DataAnalyst" )
通过这些步骤,您可以灵活地将用户添加到不同的角色中,实现分组管理的效果。
3. 默认用户和角色
Milvus 默认创建了一个 root 用户,默认密码为 Milvus
。该用户拥有 admin 权限,可以访问所有资源并执行所有操作。
如果用户被分配了 public 角色,则可以获得以下权限:
- DescribeCollection
- ShowCollections
- IndexDetail
4. 对象类型和权限列表
启用 RBAC 后,可为不同对象类型指定的权限如下表所示。
对象类型 | 权限名称 | 客户端相关 API 说明 |
---|---|---|
Collection | CreateIndex | 创建索引 |
Collection | DropIndex | 删除索引 |
Collection | IndexDetail | DescribeIndex/GetIndexState/GetIndexBuildProgress |
Collection | Load | 加载集合/获取加载进度/获取加载状态 |
Collection | Insert | 插入 |
Collection | Delete | 删除 |
Collection | Search | 搜索 |
Collection | Flush | 冲洗/获取冲洗状态 |
Collection | Query | 查询 |
Collection | GetStatistics | 获取集合统计信息 |
Collection | Compact | 压缩 |
Collection | Import | 批量导入 |
Collection | BalanceLoad | 负载平衡 |
Global | All APIs | 拥有所有 API 操作权限 |
Global | CreateCollection | 创建集合 |
Global | DropCollection | 删除集合 |
Global | DescribeCollection | 描述集合 |
Global | ListCollections | 显示集合 |
Global | ClearAll | 清除所有数据 |
Global | CreateRole | 创建角色 |
Global | DeleteRole | 删除角色 |
User | UpdateUser | 更新用户凭证 |
User | SelectUser | 查询用户信息 |
**注意:**对象和权限名称区分大小写。若希望向某类对象(如集合、全局、用户)授予所有权限,可在权限名称中使用 "*"
。
5. 小结
Milvus 的 RBAC 机制通过用户、角色、对象和权限的关系,实现了灵活且高效的访问控制。RBAC 机制不仅支持对集合和全局对象的管理,还支持细化到具体的用户管理。在实践中,通过合理的角色划分和权限配置,可以确保 Milvus 资源的安全性和高效性。
通过本文,您已了解了 RBAC 的基本结构以及在 Milvus 中如何实现基于角色的权限管理。