验证用户访问

本指南介绍如何在 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()

限制条件

  1. 用户名不得为空,长度不得超过 32 个字符。必须以字母开头,且只能包含下划线、字母或数字。
  2. 密码必须至少包含 6 个字符,长度不得超过 256 个字符。

RBAC 解释

RBAC(基于角色的访问控制)是一种基于角色的访问控制方法。通过 RBAC,可以精细地控制用户在 Collections、数据库和实例级别上可以执行的操作,增强数据的安全性。

与传统的用户访问控制模型不同,RBAC 引入了角色的概念。在 RBAC 模型中,先授予角色权限,然后再将这些角色授予用户。然后,用户才能获得权限。

RBAC 模型可以提高访问控制管理的效率。例如,如果多个用户需要同一套权限,就不需要为每个用户手动设置权限。相反,你可以创建一个角色并将该角色分配给用户。如果要调整这些用户的权限,只需调整角色的权限,修改后的权限就会应用到所有拥有该角色的用户。

RBAC 主要概念

Users Roles Privileges

用户 角色 权限

RBAC 模型有四个主要组成部分。

  • 资源:可访问的资源实体。Milvus 中的资源分为三个级别--实例、数据库和 Collections。

  • 权限:对 Milvus 资源执行特定操作的权限(如创建 Collection、插入数据等)。

  • 权限组:由多个权限组成的组。

  • 角色:角色由两部分组成--权限和资源。权限定义了角色可以执行的操作类型,而资源则定义了可以执行操作的目标资源。例如,数据库管理员角色可以对某些数据库执行读、写和管理操作。

  • 用户:用户是指使用 Milvus 的人。每个用户都有一个唯一的 ID,并被授予一个或多个角色。

程序

要通过 RBAC 实现访问控制,需要遵循以下步骤:

  1. 创建用户:除了 Milvus 中的默认用户root 外,您还可以创建新用户并设置密码,以保护数据安全。

  2. 创建角色:您可以根据需要创建自定义角色。角色的具体功能由其权限决定。

  3. 创建权限组:将多个权限合并为一个权限组,以简化向角色授予权限的流程。

  4. 向角色授予权限或权限组:通过向角色授予权限或权限组来定义角色的功能。

  5. 向用户授予角色:向用户授予具有特定权限的角色,这样用户就可以拥有某个角色的权限。一个角色可以授予多个用户。

创建用户和角色

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 是刚刚创建的新角色。

创建权限组

为简化授予权限的流程,建议将多个权限合并为一个权限组。

特权组与特权

特权组由多个特权组成。

Privilege Group Illustrated

特权组示例

如上图所示,假设需要向一个角色授予三种不同的权限。

  • 如果不使用特权组,则需要授予三次权限。

  • 如果使用特权组,则只需创建一个特权组并将三种特权添加到该特权组中,然后将该特权组授予角色 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

 client.grant_privilege_v2(
     role_name="roleA", 
     privilege="CollectionAdmin",
     collection_name="col1", 
     db_name="db1"
 )

输入目标 Collection 的名称和目标 Collection 所属数据库的名称。

特定数据库下的所有集合

 client.grant_privilege_v2(
     role_name="roleA", 
     privilege="CollectionAdmin",
     collection_name="*", 
     db_name="db1"
 )

输入目标数据库名称和通配符* 作为 Collection 名称。

数据库

特定数据库

 client.grant_privilege_v2(
     role_name="roleA", 
     privilege="DatabaseAdmin", 
     collection_name="*", 
     db_name="db1"
 )

输入目标数据库的名称和通配符* 作为 Collections 名称。

当前实例下的所有数据库

 client.grant_privilege_v2(
     role_name="roleA", 
     privilege="DatabaseAdmin", 
     collection_name="*", 
     db_name="*"
 )

输入* 作为数据库名称,输入* 作为 Collections 名称。

实例

当前实例

 client.grant_privilege_v2(
     role_name="roleA", 
     privilege="ClusterAdmin", 
     collection_name="*", 
     db_name="*"
 )

输入* 作为数据库名称,输入* 作为 Collections 名称。

下面的示例演示了如何在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='*',
)
目录

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐