随着向量数据库在生产环境中的广泛应用,数据安全和多租户隔离成为AI基础设施的关键需求。Milvus 2.x通过内置的基于角色的访问控制(RBAC)机制,提供了强大的身份验证和权限管理能力。
本文将详细指导您如何在Milvus中启用认证,并利用PyMilvus客户端进行用户、角色和权限的配置。
Contents
1. 启用授权(Authorization)
Milvus默认情况下禁用权限认证。要启用它,您需要修改Milvus的配置文件 milvus.yaml。
找到 authorization 部分,将其中的 enabled 字段设置为 true。
1
2
3
4
5
6
7
8
9
10
11 # milvus.yaml 核心配置片段
# ... 其他配置
authorization:
enabled: true
# 初始管理员用户的用户名和密码。建议在生产环境中更改默认值。
initial_username: root
initial_password: Milvus
# ... 其他配置
操作步骤:
- 修改配置: 确保您修改了正在运行的Milvus实例所使用的 milvus.yaml。
- 重启服务: 重启Milvus服务以使配置生效。如果您使用Docker Compose部署,可以运行 docker-compose restart。
注意: 一旦启用授权,所有未提供用户名和密码的连接尝试都将被拒绝。
2. 使用管理员账户连接
服务重启后,您必须使用配置中定义的初始管理员账户(默认为 root/Milvus)进行连接。
1
2
3
4
5
6
7
8
9
10
11
12 from pymilvus import connections, utility
# 替换为您的Milvus地址和启用后的认证信息
connections.connect(
alias="default",
host="localhost",
port="19530",
user="root",
password="Milvus"
)
print("成功以管理员身份连接到Milvus")
3. 创建用户和角色
在生产环境中,不应直接使用 root 账户进行日常操作。我们需要创建专用的用户和角色。
3.1 创建用户
1
2
3
4
5
6
7
8
9
10 # 1. 创建一个用于开发环境的用户
utility.create_user("dev_user", "secure_dev_pwd")
print("用户 'dev_user' 创建成功")
# 2. 创建一个用于只读分析的用户
utility.create_user("analytics_reader", "analytics_pwd")
print("用户 'analytics_reader' 创建成功")
# 查看当前所有用户
print(utility.list_users())
3.2 创建自定义角色
Milvus中的权限是授予给角色的,用户再被分配到角色中。这样做可以简化管理。
1
2
3
4
5
6
7
8
9
10
11 # 创建一个只允许读取Collection数据的角色
utility.create_role("read_only_role")
# 创建一个允许管理Collection结构(创建/删除)的角色
utility.create_role("schema_manager_role")
# 将用户分配给角色
utility.add_user_to_role("analytics_reader", "read_only_role")
utility.add_user_to_role("dev_user", "schema_manager_role")
print("角色创建及用户分配完成")
4. 配置和授予权限
权限授权是RBAC的核心。您需要指定:角色、资源类型、资源名称(可选,如Collection名称)以及操作类型(Privilege)。
Milvus支持的资源类型包括 Collection, Global, User, Role 等。
4.1 授予全局只读权限
我们希望 read_only_role 可以描述所有集合、搜索和查询数据,但不能修改结构或写入数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # 定义 Collection 上的读取权限列表
read_privileges = [
"DescribeCollection",
"Search",
"Query",
"GetLoadingProgress"
]
for privilege in read_privileges:
# 授予 read_only_role 在所有 Collection 上的特定权限
# 资源名称为空字符串 "" 表示应用于所有资源
utility.grant(
role_name="read_only_role",
object_type="Collection",
object_name="",
privilege=privilege
)
print("只读权限配置完成")
4.2 授予结构管理权限
我们希望 schema_manager_role 可以创建和删除集合,但仅限于名称以 dev_ 开头的集合(实现资源隔离)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 # 授予创建和删除 Collection 的权限
management_privileges = [
"CreateCollection",
"DropCollection"
]
for privilege in management_privileges:
# 授予 dev_user 在所有 Collection 上管理权限
# 注意:在Milvus 2.x中,权限控制的粒度如果需要针对Collection名称进行通配符匹配,
# 需要依赖其底层的权限实现。这里先演示针对全局Collection资源的操作授权。
utility.grant(
role_name="schema_manager_role",
object_type="Collection",
object_name="",
privilege=privilege
)
print("结构管理权限配置完成")
5. 验证新用户权限
现在,我们尝试使用 analytics_reader 用户进行连接和操作验证。
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
26
27
28
29
30
31
32
33
34 # 断开管理员连接
connections.disconnect("default")
# 使用只读用户连接
connections.connect(
alias="reader_session",
host="localhost",
port="19530",
user="analytics_reader",
password="analytics_pwd"
)
# 尝试只读操作 (例如,列出所有集合,如果存在)
try:
collections = utility.list_collections(using='reader_session')
print(f"Reader session可以查看的集合: {collections}")
except Exception as e:
print(f"列出集合失败 (不应该发生如果已授权): {e}")
# 尝试写入操作 (例如,创建集合,应该失败)
try:
from pymilvus import Collection, FieldSchema, CollectionSchema, DataType
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128)
]
schema = CollectionSchema(fields, description="Test Collection")
Collection("test_denied", schema, using='reader_session')
print("!!! 错误:创建集合成功 (权限未生效或配置错误)")
except Exception as e:
if "Access denied" in str(e):
print("权限验证成功: 只读用户无法创建集合。")
else:
print(f"其他错误: {e}")
通过上述步骤,您就完成了Milvus RBAC的启用和基本用户权限配置,确保了向量数据平台的安全性和可管理性。
汤不热吧