Milvus 启用身份验证
验证用户访问
本指南介绍如何在 Milvus 中管理用户身份验证,包括启用身份验证、以用户身份连接和修改用户凭证。
-
TLS 和用户身份验证是两种不同的安全方法。如果在 Milvus 系统中同时启用了用户身份验证和 TLS,则必须提供用户名、密码和证书文件路径。有关如何启用 TLS 的信息,请参阅 "传输中的加密"。
-
本页的代码片段使用新的MilvusClient(Python) 与 Milvus 进行交互。用于其他语言的新 MilvusClient SDK 将在未来更新中发布。
启用用户身份验证
要为您的 Milvus 服务器启用用户身份验证,请在 Milvus 配置文件milvus.yaml 中将 common.security.authorizationEnabled 设置为 true。有关配置的更多信息,请参阅使用 Docker Compose 配置 Milvus。
...
common:
...
security:
authorizationEnabled: true
...
通过身份验证连接 Milvus
启用身份验证后,需要使用用户名和密码连接到 Milvus。默认情况下,启动 Milvus 时会创建root 用户,密码为Milvus 。下面是一个示例,说明如何使用默认root 用户在启用身份验证后连接 Milvus:
# use default `root` user to connect to Milvus
from pymilvus import MilvusClient
client = MilvusClient(
uri='http://localhost:19530', # replace with your own Milvus server address
token="root:Milvus"
)
如果在启用身份验证的情况下连接 Milvus 时未能提供有效令牌,则会收到 gRPC 错误。
创建新用户
以默认root 用户身份连接后,可以按以下步骤创建和验证新用户:
# create a user
client.create_user(
user_name="user_1",
password="P@ssw0rd",
)
# verify the user has been created
client.describe_user("user_1")
# output
# {'user_name': 'user_1', 'roles': ()}
有关创建用户的更多信息,请参阅create_user()。
使用新用户连接 Milvus
使用新创建用户的凭据进行连接:
# connect to milvus with the newly created user
client = MilvusClient(
uri="http://localhost:19530",
token="user_1:P@ssw0rd"
)
更新用户密码
用以下代码更改现有用户的密码:
# update password
client.update_password(
user_name="user_1",
old_password="P@ssw0rd",
new_password="P@ssw0rd123"
)
有关更新用户密码的更多信息,请参阅update_password()。
如果忘记了旧密码,Milvus 提供了一个配置项,允许将某些用户指定为超级用户。这样,重置密码时就不需要旧密码了。
默认情况下,Milvus 配置文件中的common.security.superUsers 字段为空,这意味着所有用户在重置密码时都必须提供旧密码。不过,你可以将特定用户指定为超级用户,他们不需要提供旧密码。在下面的代码段中,root 和foo 被指定为超级用户。
你应该在管理 Milvus 实例运行的 Milvus 配置文件中添加以下配置项。
common:
security:
superUsers: root, foo
删除用户
要删除用户,请使用drop_user() 方法。
client.drop_user(user_name="user_1")
要删除用户,你不能是被删除的用户。否则,将引发错误。
列出所有用户
列出所有用户。
# list all users
client.list_users()
限制条件
- 用户名不得为空,长度不得超过 32 个字符。必须以字母开头,且只能包含下划线、字母或数字。
- 密码必须至少包含 6 个字符,长度不得超过 256 个字符。
RBAC 解释
RBAC(基于角色的访问控制)是一种基于角色的访问控制方法。通过 RBAC,可以精细地控制用户在 Collections、数据库和实例级别上可以执行的操作,增强数据的安全性。
与传统的用户访问控制模型不同,RBAC 引入了角色的概念。在 RBAC 模型中,先授予角色权限,然后再将这些角色授予用户。然后,用户才能获得权限。
RBAC 模型可以提高访问控制管理的效率。例如,如果多个用户需要同一套权限,就不需要为每个用户手动设置权限。相反,你可以创建一个角色并将该角色分配给用户。如果要调整这些用户的权限,只需调整角色的权限,修改后的权限就会应用到所有拥有该角色的用户。
RBAC 主要概念

用户 角色 权限
RBAC 模型有四个主要组成部分。
-
资源:可访问的资源实体。Milvus 中的资源分为三个级别--实例、数据库和 Collections。
-
权限:对 Milvus 资源执行特定操作的权限(如创建 Collection、插入数据等)。
-
权限组:由多个权限组成的组。
-
角色:角色由两部分组成--权限和资源。权限定义了角色可以执行的操作类型,而资源则定义了可以执行操作的目标资源。例如,数据库管理员角色可以对某些数据库执行读、写和管理操作。
-
用户:用户是指使用 Milvus 的人。每个用户都有一个唯一的 ID,并被授予一个或多个角色。
程序
要通过 RBAC 实现访问控制,需要遵循以下步骤:
-
创建用户:除了 Milvus 中的默认用户
root外,您还可以创建新用户并设置密码,以保护数据安全。 -
创建角色:您可以根据需要创建自定义角色。角色的具体功能由其权限决定。
-
创建权限组:将多个权限合并为一个权限组,以简化向角色授予权限的流程。
-
向角色授予权限或权限组:通过向角色授予权限或权限组来定义角色的功能。
-
向用户授予角色:向用户授予具有特定权限的角色,这样用户就可以拥有某个角色的权限。一个角色可以授予多个用户。
创建用户和角色
Milvus 通过 RBAC 实现细粒度访问控制。您可以从创建用户和角色开始,然后为角色分配权限或权限组,最后通过向用户授予角色来管理访问控制。这种方法可确保访问管理的效率和安全性。本页将介绍如何在 Milvus 中创建用户和角色。
用户
初始化 Milvus 实例后,会自动生成一个根用户,用于首次连接 Milvus 时进行身份验证。根用户的用户名是root ,密码是Milvus 。根用户的默认角色是admin ,可以访问所有资源。为确保数据安全,请妥善保管根用户的凭据,防止未经授权的访问。
对于日常操作,我们建议创建用户而不是使用根用户。
创建用户
下面的示例显示了如何创建用户名为user_1 、密码为P@ssw0rd 的用户。用户名和密码必须遵循以下规则:
-
用户名:必须以字母开头,只能包含大写或小写字母、数字和下划线。
-
密码:长度必须为 8-64 个字符,必须包括以下三种字符:大写字母、小写字母、数字和特殊字符。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.create_user(user_name="user_1", password="P@ssw0rd")
更新密码
创建用户后,如果忘记密码,可以更新密码。
新密码也必须遵循以下规则:
- 长度必须为 8-64 个字符,并包含以下三个字符:大写字母、小写字母、数字和特殊字符。
下面的示例显示了如何将用户user_1 的密码更新为NewP@ssw0rd 。
from pymilvus import MilvusClient
client.update_password(
user_name="user_1",
old_password="P@ssw0rd",
new_password="NewP@ssw0rd"
)
列出用户
创建多个用户后,您可以列出并查看所有现有用户。
from pymilvus import MilvusClient
client.list_users()
下面是一个输出示例。root 是 Milvus 自动生成的默认用户。user_1 是刚刚创建的新用户。
角色
Milvus 提供了一个名为admin 的内置角色,它是一个管理员角色,可以访问所有实例下的资源,并拥有所有操作的权限。为实现更精细的访问管理和增强数据安全性,建议根据需要创建自定义角色。
创建角色
下面的示例演示了如何创建名为role_a 的角色。
角色名称必须遵循以下规则:
- 必须以字母开头,且只能包含大写或小写字母、数字和下划线。
from pymilvus import MilvusClient
client.create_role(role_name="role_a")
import io.milvus.v2.service.rbac.request.CreateRoleReq;
列出角色
创建多个角色后,您可以列出并查看所有现有角色。
from pymilvus import MilvusClient
client.list_roles()
下面是一个输出示例。admin 是 Milvus 中的默认角色。role_a 是刚刚创建的新角色。
创建权限组
为简化授予权限的流程,建议将多个权限合并为一个权限组。
特权组与特权
特权组由多个特权组成。

特权组示例
如上图所示,假设需要向一个角色授予三种不同的权限。
-
如果不使用特权组,则需要授予三次权限。
-
如果使用特权组,则只需创建一个特权组并将三种特权添加到该特权组中,然后将该特权组授予角色 A。
通过使用特权组,可以向角色批量授予多项特权。
内置特权组
为方便使用,Milvus 在 Collections、数据库和实例级别上提供了共 9 个内置特权:COLL_RO、COLL_RW、COLL_ADMIN、DB_RO、DB_RW、DB_Admin、Cluster_RO、Cluster_RW 和 Cluster_Admin。
内置特权组的三个级别没有级联关系。在实例级别设置特权组不会自动为该实例下的所有数据库和 Collections 设置权限。数据库和集合级别的权限需要手动设置。
下表解释了每个内置权限组所包含的权限。
Collection 级别
-
CollectionReadOnly (COLL_RO):包括读取集合数据的权限
-
CollectionReadWrite (COLL_RW):包括读取和写入收集数据的权限
-
CollectionAdmin (COLL_ADMIN):包括读写收集数据和管理收集的权限。
下表列出了集合级三个内置权限组所包含的具体权限:
|
权限 |
只读集合 |
收集读写 |
收藏管理 |
|---|---|---|---|
|
查询 |
✔️ |
✔️ |
✔️ |
|
搜索 |
✔️ |
✔️ |
✔️ |
|
索引详情 |
✔️ |
✔️ |
✔️ |
|
获取冲洗状态 |
✔️ |
✔️ |
✔️ |
|
获取加载状态 |
✔️ |
✔️ |
✔️ |
|
获取加载进度 |
✔️ |
✔️ |
✔️ |
|
HasPartition |
✔️ |
✔️ |
✔️ |
|
显示分区 |
✔️ |
✔️ |
✔️ |
|
列出别名 |
✔️ |
✔️ |
✔️ |
|
描述集合 |
✔️ |
✔️ |
✔️ |
|
描述别名 |
✔️ |
✔️ |
✔️ |
|
获取统计数据 |
✔️ |
✔️ |
✔️ |
|
创建索引 |
❌ |
✔️ |
✔️ |
|
删除索引 |
❌ |
✔️ |
✔️ |
|
创建分区 |
❌ |
✔️ |
✔️ |
|
删除分区 |
❌ |
✔️ |
✔️ |
|
加载 |
❌ |
✔️ |
✔️ |
|
发布 |
❌ |
✔️ |
✔️ |
|
插入 |
❌ |
✔️ |
✔️ |
|
删除 |
❌ |
✔️ |
✔️ |
|
增加 |
❌ |
✔️ |
✔️ |
|
进口 |
❌ |
✔️ |
✔️ |
|
同花顺 |
❌ |
✔️ |
✔️ |
|
压实 |
❌ |
✔️ |
✔️ |
|
负载平衡 |
❌ |
✔️ |
✔️ |
|
创建别名 |
❌ |
❌ |
✔️ |
|
删除别名 |
❌ |
❌ |
✔️ |
数据库级别
-
只读数据库 (DB_RO):包括读取数据库数据的权限
-
数据库读写 (DB_RW):包括读取和写入数据库数据的权限
-
数据库管理 (DB_Admin):包括读写数据库数据和管理数据库的权限。
下表列出了数据库级三个内置权限组所包含的具体权限:
|
权限 |
只读数据库 |
数据库读写 |
数据库管理 |
|---|---|---|---|
|
显示收藏 |
✔️ |
✔️ |
✔️ |
|
描述数据库 |
✔️ |
✔️ |
✔️ |
|
创建集合 |
❌ |
❌ |
✔️ |
|
删除收藏 |
❌ |
❌ |
✔️ |
|
更改数据库 |
❌ |
✔️ |
✔️ |
群集级别
-
只读群集 (Cluster_RO):包括读取实例数据的权限
-
群集读写 (Cluster_RW):包括读取和写入实例数据的权限
-
ClusterAdmin (Cluster_Admin):包括读写实例数据和管理实例的权限。
下表列出了实例级三个内置权限组所包含的具体权限:
|
权限 |
仅群集读取 |
群集读写 |
群集管理员 |
|---|---|---|---|
|
列出数据库 |
✔️ |
✔️ |
✔️ |
|
重命名收藏 |
❌ |
❌ |
✔️ |
|
创建所有权 |
❌ |
❌ |
✔️ |
|
更新用户 |
❌ |
❌ |
✔️ |
|
删除所有者 |
❌ |
❌ |
✔️ |
|
选择所有权 |
✔️ |
✔️ |
✔️ |
|
管理所有权 |
❌ |
❌ |
✔️ |
|
选择用户 |
✔️ |
✔️ |
✔️ |
|
备份 |
❌ |
❌ |
✔️ |
|
还原 RBAC |
❌ |
❌ |
✔️ |
|
创建资源组 |
❌ |
❌ |
✔️ |
|
删除资源组 |
❌ |
❌ |
✔️ |
|
更新资源组 |
❌ |
✔️ |
✔️ |
|
描述资源组 |
✔️ |
✔️ |
✔️ |
|
ListResourceGroups |
✔️ |
✔️ |
✔️ |
|
传输节点 |
❌ |
✔️ |
✔️ |
|
传输复制 |
❌ |
✔️ |
✔️ |
|
创建数据库 |
❌ |
❌ |
✔️ |
|
删除数据库 |
❌ |
❌ |
✔️ |
|
冲洗全部 |
❌ |
✔️ |
✔️ |
|
创建权限组 |
❌ |
❌ |
✔️ |
|
删除特权组 |
❌ |
❌ |
✔️ |
|
ListPrivilegeGroups |
❌ |
❌ |
✔️ |
|
操作特权组 |
❌ |
❌ |
✔️ |
操作步骤
可以创建特权组,然后向特权组添加特权。
创建权限组
下面的示例演示了如何创建名为privilege_group_1 的特权组。
from pymilvus import MilvusClient
client.create_privilege_group(group_name='privilege_group_1')
向特权组添加权限
下面的示例演示了如何将PrivilegeBackupRBAC 和PrivilegeRestoreRBAC 添加到刚刚创建的特权组privilege_group_1 中。
from pymilvus import MilvusClient
client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])
从权限组中删除权限
下面的示例演示了如何从权限组privilege_group_1 中移除权限PrivilegeRestoreRBAC 。
from pymilvus import MilvusClient
client.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')
列出特权组
下面的示例演示了如何列出所有现有特权组。
from pymilvus import MilvusClient
client.list_privilege_groups()
下面是一个输出示例。
删除权限组
下面的示例演示了如何删除privilege_group_1 特权组。
from pymilvus import MilvusClient
client.drop_privilege_group(group_name='privilege_group_1')
为角色授予权限或权限组
创建角色后,就可以向角色授予权限。本指南将介绍如何向角色授予权限或权限组。
向角色授予权限或权限组
Milvus 2.5 引入了新版本的 API,简化了授予操作。向角色授予权限时,不再需要查找对象类型。以下是参数和相应的解释。
-
role_name:需要授予权限或权限组的目标角色名称。
-
资源:特权的目标资源,可以是特定实例、数据库或 Collections。
下表解释了如何在client.grantV2() 方法中指定资源。
|
级别 |
资源 |
授予方法 |
注释 |
|---|---|---|---|
|
Collections |
特定 Collections |
|
输入目标 Collection 的名称和目标 Collection 所属数据库的名称。 |
|
特定数据库下的所有集合 |
|
输入目标数据库名称和通配符 |
|
|
数据库 |
特定数据库 |
|
输入目标数据库的名称和通配符 |
|
当前实例下的所有数据库 |
|
输入 |
|
|
实例 |
当前实例 |
|
输入 |
-
权限:需要授予角色的特定权限或权限组。目前,Milvus 提供了 56 种可授予的特权。下表列出了 Milvus 中的特权。
下表中的类型列是用户为方便快速查找特权而设置的,仅用于分类目的。授予权限时,不需要了解类型。只需输入相应的权限即可。
类型
权限
说明
客户端的相关 API 说明
数据库权限
列出数据库
查看当前实例中的所有数据库
描述数据库
查看数据库的详细信息
创建数据库
创建数据库
删除数据库
删除数据库
更改数据库
修改数据库属性
Collections 权限
获取刷新状态
检查 Collections 清除操作符的状态
获取加载状态
检查 Collections 的加载状态
获取加载进度
检查 Collections 的加载进度
显示收藏集
查看具有收藏权限的所有 Collections
列出别名
查看某个 Collection 的所有别名
描述收藏集
查看 Collections 的详细信息
描述别名
查看别名的详细信息
获取统计数据
获取 Collections 的统计数据(如 Collections 中实体的数量)
创建集合
创建 Collections
删除收藏集
删除 Collections
加载
加载 Collections
释放
释放一个 Collections
刷新
将 Collections 中的所有实体持久化到一个密封段中。任何在冲洗操作后插入的实体都将存储在新的段中。
压缩
手动触发压缩
重命名集合
重命名 Collections
创建别名
为 Collections 创建别名
删除别名
删除 Collections 的别名
全部清除
清除数据库中的所有 Collections
分区权限
有分区
检查是否存在分区
显示分区
查看 Collections 中的所有分区
创建分区
创建分区
删除分区
删除分区
索引权限
索引详情
查看索引的详细信息
创建索引
创建索引
删除索引
删除索引
资源管理权限
负载平衡
实现负载平衡
创建资源组
创建资源组
删除资源组
删除资源组
更新资源组
更新资源组
描述资源组
查看资源组的详细信息
列出资源组
查看当前实例的所有资源组
转移节点
在资源组之间转移节点
传输副本
在资源组之间传输副本
备份 RBAC
为当前实例中所有与 RBAC 相关的操作创建备份
备份 RBAC
还原 RBAC
恢复当前实例中所有 RBAC 相关操作的备份
还原 RBAC
实体权限
查询
进行查询
搜索
进行搜索
插入
插入实体
删除
删除实体
插入
插入实体
导入
批量插入或导入实体
RBAC 权限
创建所有权
创建用户或角色
更新用户
更新用户密码
删除所有权
删除用户密码或角色
选择所有权
查看被授予特定角色的所有用户
管理所有权
管理用户或角色,或向用户授予角色
选择用户
查看授予用户的所有角色
创建权限组
创建权限组
删除权限组
删除权限组
列出特权组
查看当前实例中的所有特权组
操作特权组
向特权组添加特权或从特权组移除特权
下面的示例演示了如何在default 数据库下的collection_01 上授予PrivilegeSearch 权限,以及如何将名为privilege_group_1 的特权组授予角色role_a 。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.grant_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
描述角色
下面的示例演示了如何使用describe_role 方法查看授予角色role_a 的权限。
from pymilvus import MilvusClient
client.describe_role(role_name="role_a")
下面是一个输出示例。
{
"role": "role_a",
"privileges": [
{
"collection_name": "collection_01",
"db_name": "default",
"role_name": "role_a",
"privilege": "Search",
"grantor_name": "root"
},
"privilege_group_1"
]
}
撤销角色的权限或权限组
下面的示例演示了如何撤销default 数据库下collection_01 的特权PrivilegeSearch 以及授予角色role_a 的特权组privilege_group_1 。
client.revoke_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
目录
更多推荐



所有评论(0)