Post

Milvus 权限管理实战(二):RBAC 核心机制与权限授予

深入介绍 Milvus RBAC 四要素模型、56 种细粒度权限、9 个内置权限组及 grant_privilege_v2() API 使用

Milvus 权限管理实战(二):RBAC 核心机制与权限授予

面向对象:已部署 Milvus Standalone (Docker Compose)、具备传统 RDBMS RBAC 经验的 Python 开发者

基于 Milvus 2.6+ / PyMilvus

2.1 权限模型四要素

Milvus RBAC 模型由四个核心要素构成1

1
2
3
4
5
6
7
8
9
10
11
12
┌─────────────────────────────────────────────────────────┐
│                        User                             │
│                          │                              │
│                          ▼                              │
│                        Role                             │
│                       ╱    ╲                            │
│                      ▼      ▼                           │
│              Privilege    Resource                      │
│                  │                                      │
│                  ▼                                      │
│           Privilege Group                               │
└─────────────────────────────────────────────────────────┘

Resource(资源)

资源是权限控制的目标对象。Milvus 定义了三个资源级别:

级别说明示例
Instance整个 Milvus 实例集群级别操作
Database特定数据库db_name="default"
Collection特定集合collection_name="my_collection"

Privilege(权限)

权限定义了对资源可执行的具体操作。Milvus 2.5+ 提供了 56 种细粒度权限,按功能分为以下类别:

Database 权限(5 种)

权限说明对应 API
ListDatabases查看实例中所有数据库list_databases()
DescribeDatabase查看数据库详情describe_database()
CreateDatabase创建数据库create_database()
DropDatabase删除数据库drop_database()
AlterDatabase修改数据库属性alter_database()

Collection 权限(18 种)

权限说明对应 API
GetFlushState检查集合 flush 状态get_flush_state()
GetLoadState检查集合加载状态get_load_state()
GetLoadingProgress检查加载进度get_loading_progress()
ShowCollections查看所有集合list_collections()
ListAliases查看集合别名list_aliases()
DescribeCollection查看集合详情describe_collection()
DescribeAlias查看别名详情describe_alias()
GetStatistics获取集合统计信息get_collection_statistics()
CreateCollection创建集合create_collection()
DropCollection删除集合drop_collection()
Load加载集合load_collection()
Release释放集合release_collection()
Flush持久化数据flush()
Compaction手动触发压缩compact()
RenameCollection重命名集合rename_collection()
CreateAlias创建别名create_alias()
DropAlias删除别名drop_alias()
FlushAllflush 数据库所有集合flush_all()

Partition 权限(4 种)

权限说明对应 API
HasPartition检查分区是否存在has_partition()
ShowPartitions查看所有分区list_partitions()
CreatePartition创建分区create_partition()
DropPartition删除分区drop_partition()

Index 权限(3 种)

权限说明对应 API
IndexDetail查看索引详情describe_index()
CreateIndex创建索引create_index()
DropIndex删除索引drop_index()

Entity 权限(6 种)

权限说明对应 API
Query执行查询query()
Search执行搜索search()
Insert插入数据insert()
Delete删除数据delete()
Upsert更新或插入数据upsert()
Import批量导入数据bulk_insert()

Resource Management 权限(10 种)

权限说明
LoadBalance负载均衡
CreateResourceGroup创建资源组
DropResourceGroup删除资源组
UpdateResourceGroups更新资源组
DescribeResourceGroup查看资源组详情
ListResourceGroups列出所有资源组
TransferNode在资源组间转移节点
TransferReplica在资源组间转移副本
BackupRBAC备份 RBAC 配置
RestoreRBAC恢复 RBAC 配置

RBAC 权限(10 种)

权限说明对应 API
CreateOwnership创建用户或角色create_user() / create_role()
UpdateUser更新用户密码update_password()
DropOwnership删除用户或角色drop_user() / drop_role()
SelectOwnership查看角色授权describe_role()
ManageOwnership管理用户/角色/授权grant_role() / grant_privilege()
SelectUser查看用户角色describe_user()
CreatePrivilegeGroup创建权限组create_privilege_group()
DropPrivilegeGroup删除权限组drop_privilege_group()
ListPrivilegeGroups列出所有权限组list_privilege_groups()
OperatePrivilegeGroup操作权限组add_privileges_to_group()

Privilege Group(权限组)

权限组是多个权限的集合,用于简化批量授权操作2

不使用权限组时:授予 3 个权限需要执行 3 次授权操作。

使用权限组时:创建 1 个权限组,添加 3 个权限,然后 1 次授权即可。

权限组示意图 权限组简化授权操作示意图

Role(角色)

角色是权限和资源的组合体,定义了可执行的操作类型及其作用范围。角色是连接用户与权限的桥梁。

2.2 内置权限组

Milvus 提供 9 个内置权限组,覆盖 Collection、Database、Cluster 三个级别2

Collection 级别权限组

CollectionReadOnly (COLL_RO)

只读权限,适用于数据分析师等只需查询数据的角色。

权限包含
Query✔️
Search✔️
IndexDetail✔️
GetFlushState✔️
GetLoadState✔️
GetLoadingProgress✔️
HasPartition✔️
ShowPartitions✔️
ListAliases✔️
DescribeCollection✔️
DescribeAlias✔️
GetStatistics✔️

CollectionReadWrite (COLL_RW)

读写权限,适用于应用开发者等需要读写数据的角色。

在 COLL_RO 基础上增加:

权限包含
CreateIndex✔️
DropIndex✔️
CreatePartition✔️
DropPartition✔️
Load✔️
Release✔️
Insert✔️
Delete✔️
Upsert✔️
Import✔️
Flush✔️
Compaction✔️
LoadBalance✔️

CollectionAdmin (COLL_ADMIN)

管理权限,适用于集合管理员。

在 COLL_RW 基础上增加:

权限包含
CreateAlias✔️
DropAlias✔️

Database 级别权限组

DatabaseReadOnly (DB_RO)

权限包含
ShowCollections✔️
DescribeDatabase✔️
CreateCollection✔️

DatabaseReadWrite (DB_RW)

在 DB_RO 基础上增加:

权限包含
AlterDatabase✔️

DatabaseAdmin (DB_Admin)

在 DB_RW 基础上增加:

权限包含
DropCollection✔️

Cluster 级别权限组

ClusterReadOnly (Cluster_RO)

权限包含
ListDatabases✔️
SelectOwnership✔️
SelectUser✔️
DescribeResourceGroup✔️
ListResourceGroups✔️

ClusterReadWrite (Cluster_RW)

在 Cluster_RO 基础上增加:

权限包含
UpdateResourceGroups✔️
TransferNode✔️
TransferReplica✔️
FlushAll✔️

ClusterAdmin (Cluster_Admin)

在 Cluster_RW 基础上增加:

权限包含
RenameCollection✔️
CreateOwnership✔️
UpdateUser✔️
DropOwnership✔️
ManageOwnership✔️
BackupRBAC✔️
RestoreRBAC✔️
CreateResourceGroup✔️
DropResourceGroup✔️
CreateDatabase✔️
DropDatabase✔️
CreatePrivilegeGroup✔️
DropPrivilegeGroup✔️
ListPrivilegeGroups✔️
OperatePrivilegeGroup✔️

内置权限组速查表

权限组简称级别定位
CollectionReadOnlyCOLL_ROCollection只读查询
CollectionReadWriteCOLL_RWCollection读写操作
CollectionAdminCOLL_ADMINCollection集合管理
DatabaseReadOnlyDB_RODatabase数据库只读
DatabaseReadWriteDB_RWDatabase数据库读写
DatabaseAdminDB_AdminDatabase数据库管理
ClusterReadOnlyCluster_ROCluster集群只读
ClusterReadWriteCluster_RWCluster集群读写
ClusterAdminCluster_AdminCluster集群管理

2.3 权限授予实战

grant_privilege_v2() API

Milvus 2.5 引入了 grant_privilege_v2() API,简化了授权操作,无需再查找 object type3

API 参数说明:

参数说明
role_name目标角色名称
privilege权限名称或权限组名称
collection_name目标集合名称,* 表示所有集合
db_name目标数据库名称,* 表示所有数据库

资源粒度控制

授予特定集合权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

# 授予 role_a 对 default 数据库中 collection_01 的 Search 权限
client.grant_privilege_v2(
    role_name="role_a",
    privilege="Search",
    collection_name="collection_01",
    db_name="default"
)

授予特定数据库下所有集合权限

1
2
3
4
5
6
7
# 授予 role_a 对 default 数据库中所有集合的 Search 权限
client.grant_privilege_v2(
    role_name="role_a",
    privilege="Search",
    collection_name="*",
    db_name="default"
)

授予所有数据库所有集合权限

1
2
3
4
5
6
7
# 授予 role_a 对所有数据库所有集合的 Search 权限
client.grant_privilege_v2(
    role_name="role_a",
    privilege="Search",
    collection_name="*",
    db_name="*"
)

授予内置权限组

1
2
3
4
5
6
7
# 授予 role_a 集群只读权限组
client.grant_privilege_v2(
    role_name="role_a",
    privilege="ClusterReadOnly",
    collection_name="*",
    db_name="*"
)

资源粒度对照表

级别collection_namedb_name说明
Collection"collection_01""default"特定数据库的特定集合
Database 下所有集合"*""default"特定数据库的所有集合
Instance"*""*"所有数据库的所有集合

自定义权限组

当内置权限组无法满足需求时,可以创建自定义权限组。

创建权限组

1
2
# 创建名为 search_and_query 的权限组
client.create_privilege_group(group_name="search_and_query")

添加权限到权限组

1
2
3
4
5
# 向权限组添加 Search 和 Query 权限
client.add_privileges_to_group(
    group_name="search_and_query",
    privileges=["Search", "Query"]
)

查看权限组列表

1
2
3
print(client.list_privilege_groups())
# 输出示例:
# PrivilegeGroupItem: <privilege_group:search_and_query>, <privileges:('Search', 'Query')>

从权限组移除权限

1
2
3
4
5
# 从权限组移除 Query 权限
client.remove_privileges_from_group(
    group_name="search_and_query",
    privileges=["Query"]
)

授予自定义权限组

1
2
3
4
5
6
7
# 将自定义权限组授予角色
client.grant_privilege_v2(
    role_name="role_a",
    privilege="search_and_query",
    collection_name="collection_01",
    db_name="default"
)

删除权限组

1
client.drop_privilege_group(group_name="search_and_query")

权限审计

查看角色权限

1
2
3
# 查看 role_a 的所有权限
result = client.describe_role(role_name="role_a")
print(result)

输出示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "role": "role_a",
    "privileges": [
        {
            "collection_name": "collection_01",
            "db_name": "default",
            "role_name": "role_a",
            "privilege": "Search",
            "grantor_name": "root"
        },
        {
            "collection_name": "*",
            "db_name": "*",
            "role_name": "role_a",
            "privilege": "ClusterReadOnly",
            "grantor_name": "root"
        }
    ]
}

输出字段说明:

字段说明
collection_name权限作用的集合
db_name权限作用的数据库
role_name角色名称
privilege权限或权限组名称
grantor_name授权者

2.4 权限撤销与角色管理

撤销权限

使用 revoke_privilege_v2() 撤销已授予的权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 撤销 role_a 对 collection_01 的 Search 权限
client.revoke_privilege_v2(
    role_name="role_a",
    privilege="Search",
    collection_name="collection_01",
    db_name="default"
)

# 撤销 role_a 的 ClusterReadOnly 权限组
client.revoke_privilege_v2(
    role_name="role_a",
    privilege="ClusterReadOnly",
    collection_name="*",
    db_name="*"
)

撤销权限时,参数必须与授予时完全匹配(role_name、privilege、collection_name、db_name)。

撤销用户角色

1
2
3
4
5
6
7
8
9
# 撤销 user_1 的 role_a 角色
client.revoke_role(
    user_name="user_1",
    role_name="role_a"
)

# 验证撤销结果
print(client.describe_user(user_name="user_1"))
# 输出: {'user_name': 'user_1', 'roles': ()}

角色删除

删除角色前,需要先清理该角色的所有权限和用户绑定关系。

完整的角色删除流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
role_name = "role_to_delete"

# 1. 查看角色当前权限
role_info = client.describe_role(role_name=role_name)
print(f"当前权限: {role_info}")

# 2. 撤销所有权限
for priv in role_info.get("privileges", []):
    client.revoke_privilege_v2(
        role_name=role_name,
        privilege=priv["privilege"],
        collection_name=priv["collection_name"],
        db_name=priv["db_name"]
    )

# 3. 查看绑定该角色的用户
users = client.list_users()
for user in users:
    user_info = client.describe_user(user_name=user)
    if role_name in user_info.get("roles", ()):
        # 4. 撤销用户的角色绑定
        client.revoke_role(user_name=user, role_name=role_name)

# 5. 删除角色
client.drop_role(role_name=role_name)

权限操作对照表

操作API说明
授予权限grant_privilege_v2()向角色授予权限或权限组
撤销权限revoke_privilege_v2()撤销角色的权限或权限组
授予角色grant_role()将角色绑定到用户
撤销角色revoke_role()解除用户与角色的绑定
查看角色权限describe_role()审计角色的所有权限
删除角色drop_role()删除角色(需先清理权限)

小结

本文介绍了 Milvus RBAC 的核心机制:

  1. 四要素模型:Resource、Privilege、Privilege Group、Role 构成完整的权限控制体系
  2. 56 种细粒度权限:覆盖 Database、Collection、Partition、Index、Entity、RBAC 六大类操作
  3. 9 个内置权限组:COLL_RO/RW/ADMIN、DB_RO/RW/Admin、Cluster_RO/RW/Admin 满足常见场景
  4. grant_privilege_v2() API:Milvus 2.5+ 推荐的授权方式,支持灵活的资源粒度控制
  5. 自定义权限组:当内置权限组不满足需求时,可组合任意权限

下一篇将介绍生产环境中的多租户权限设计、资源组隔离策略,以及权限备份恢复等运维实践。

参考来源

This post is licensed under CC BY 4.0 by the author.