Post

Milvus 权限管理实战(一):从 RDBMS RBAC 到 Milvus

面向具备传统 RDBMS RBAC 经验的 Python 开发者,介绍 Milvus RBAC 基础概念、认证配置和用户角色管理

Milvus 权限管理实战(一):从 RDBMS RBAC 到 Milvus

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

基于 Milvus 2.6+ / PyMilvus

1.1 概念映射:Milvus vs 传统数据库权限模型

RBAC 模型对比

传统关系型数据库(如 MySQL、PostgreSQL)的 RBAC 模型通常围绕 Database → Schema → Table 三层结构展开。Milvus 作为向量数据库,采用了类似但有所区别的权限体系。

概念传统 RDBMSMilvus
最高层级Instance/ClusterInstance (Cluster)
中间层级DatabaseDatabase
数据层级Table/ViewCollection
权限载体RoleRole
权限单元PrivilegePrivilege / Privilege Group

Milvus RBAC 模型包含四个核心组件1

  • Resource(资源):可访问的资源实体,Milvus 中有三个级别——Instance、Database 和 Collection
  • Privilege(权限):对 Milvus 资源执行特定操作的许可(如创建集合、插入数据等)
  • Privilege Group(权限组):多个权限的组合
  • Role(角色):由权限和资源两部分组成,定义了角色可以执行的操作类型

RBAC 模型示意图 Milvus RBAC 模型示意图

四层资源体系

Milvus 的资源层次结构为:

1
2
3
4
Instance (Cluster)
    └── Database
            └── Collection
                    └── Partition

各层级含义

层级说明限制
Instance (Cluster)整个 Milvus 部署实例,包含所有 Database顶层资源,权限作用于全局
Database数据库,包含多个 Collection,通过 db_name 参数指定逻辑隔离单元
Collection集合,类似关系型数据库中的表,由固定列数和可变行数的二维表组成每个 Collection 最多支持 64 个 Partition
Partition分区,Collection 的子集,与父 Collection 共享相同的数据结构每个 Collection 最多 1,024 个 Partition

Collection 中每列对应一个字段(Field),每行代表一个实体(Entity)。创建 Collection 时,Milvus 会自动创建名为 _default 的默认分区。

这种层级结构的设计目的:

  • 数据隔离:通过 Database 和 Collection 实现逻辑隔离
  • 搜索优化:通过 Partition 缩小搜索范围,提高查询效率

权限粒度选择

级别资源范围典型场景
Instance整个 Milvus 实例集群管理员、DBA
Database特定数据库业务线负责人
Collection特定集合应用开发者

无级联设计:关键差异点

与部分传统数据库不同,Milvus 的三个级别内置权限组之间没有级联关系2

这意味着:

  • 在 Instance 级别设置权限组不会自动为该实例下的所有 Database 和 Collection 设置权限
  • Database 和 Collection 级别的权限需要手动设置

这种设计的考量包括:

  1. 精细化控制:允许管理员在不同层级独立设置权限,避免过度授权
  2. 安全性:防止高层级权限自动传播到低层级资源
  3. 灵活性:支持针对特定资源的权限管理,而不影响其他层级

示例场景

假设需要授予用户 analystdb_prod 数据库的只读权限,同时对 db_prod.collection_sensitive 集合完全禁止访问。在级联模型下,这种需求难以实现;而 Milvus 的无级联设计可以精确控制每个层级的权限。

1.2 启用认证(Docker Standalone)

配置文件修改

Milvus 默认不启用认证。对于 Docker Compose 部署的 Standalone 模式,需要在配置文件中显式开启。

在当前目录创建或编辑 user.yaml 文件3

1
2
3
common:
  security:
    authorizationEnabled: true

容器重启

配置修改后,重启 Milvus 服务使配置生效:

1
bash standalone_embed.sh restart

或使用 Docker Compose:

1
2
docker-compose down
docker-compose up -d

root 用户首次连接

启用认证后,Milvus 会自动创建默认的 root 用户3

  • 用户名root
  • 默认密码Milvus

使用 PyMilvus MilvusClient 进行认证连接:

1
2
3
4
5
6
from pymilvus import MilvusClient

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

token 参数格式为 username:password

生产环境中应立即修改 root 用户密码,避免使用默认凭据。

认证失败处理

如果连接时未提供有效的 token,或者 token 格式错误,Milvus 会返回 gRPC 错误。

1.3 用户与角色基础操作

创建用户

用户名和密码需遵循以下规则4

  • 用户名:必须以字母开头,只能包含大小写字母、数字和下划线
  • 密码:长度 8-64 字符,必须包含以下四类中的三类:大写字母、小写字母、数字、特殊字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pymilvus import MilvusClient

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

# 创建新用户
client.create_user(
    user_name="user_1",
    password="P@ssw0rd"
)

# 验证用户创建成功
print(client.describe_user("user_1"))
# 输出: {'user_name': 'user_1', 'roles': ()}

创建角色

角色名称规则4

  • 必须以字母开头,只能包含大小写字母、数字和下划线
1
2
3
4
5
6
# 创建自定义角色
client.create_role(role_name="role_a")

# 查看所有角色
print(client.list_roles())
# 输出: ['admin', 'role_a']

Milvus 内置了 admin 角色,该角色拥有所有资源的访问权限。

角色绑定用户

将角色授予用户,使用户获得该角色定义的权限:

1
2
3
4
5
6
7
8
9
# 将 role_a 授予 user_1
client.grant_role(
    user_name="user_1",
    role_name="role_a"
)

# 验证角色绑定
print(client.describe_user(user_name="user_1"))
# 输出: {'user_name': 'user_1', 'roles': ('role_a',)}

一个用户可以被授予多个角色,用户的最终权限是所有角色权限的并集。

撤销角色绑定

1
2
3
4
5
# 撤销 user_1 的 role_a 角色
client.revoke_role(
    user_name='user_1',
    role_name='role_a'
)

密码管理

修改密码

1
2
3
4
5
client.update_password(
    user_name="user_1",
    old_password="P@ssw0rd",
    new_password="NewP@ssw0rd123"
)

新密码同样需要满足 8-64 字符长度,且包含三类字符的要求。

超级用户配置

如果忘记旧密码,可以通过配置超级用户来重置密码3。在 Milvus 配置文件中添加:

1
2
3
common:
  security:
    superUsers: root, admin_backup

超级用户在重置密码时无需提供旧密码。默认情况下,common.security.superUsers 字段为空,所有用户重置密码时都必须提供旧密码。

删除用户

1
client.drop_user(user_name="user_1")

不能删除当前登录的用户,否则会返回错误。

查看所有用户

1
2
print(client.list_users())
# 输出: ['root', 'user_1', 'user_2']

用户名限制

用户名长度限制3

  • 不能为空
  • 最大长度 32 字符
  • 必须以字母开头
  • 只能包含下划线、字母或数字

小结

本文介绍了 Milvus RBAC 的基础概念和入门操作:

操作API
创建用户client.create_user()
创建角色client.create_role()
角色绑定用户client.grant_role()
撤销角色client.revoke_role()
修改密码client.update_password()
删除用户client.drop_user()
查看用户client.list_users() / client.describe_user()
查看角色client.list_roles()

此时创建的角色尚未关联任何权限,仅是一个空的权限容器。下一篇将深入介绍 Milvus 的 56 种细粒度权限、9 个内置权限组,以及如何使用 grant_privilege_v2() API 进行权限授予。

参考来源

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