暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

按照这个教程查一下你的Milvus 权限设置:避免删库跑路

ZILLIZ 2025-12-19
343

文:许娟

今天聊一聊数据库权限和安全生产哪些事儿~

最近听了一个八卦,某家友商单位,测试同事直接用了生产连接,对数据库执行了一条看似无害的脚本

几秒钟后

核心业务的向量 Collection 全被删了

特征丢失、召回异常、服务大面积降级

层层网络安全建设之后,十年磨一剑,磨的都是没做数据库权限隔离的剑鞘……

这里就不点名是哪一家了,因为,数据库落地生产的实践中,这类问题其实一点也不少见。

自然,用Milvus 构建向量检索系统的团队也不例外。大家往往把注意力都放在索引结构、搜索性能、吞吐量、数据规模这些技术指标上,却忽略了一个只要出一次就会非常致命的问题:谁可以操作你的 Milvus?他们又能做到哪一步?

  • 开发是否能删除 Collection?

  • 测试账号为什么可以操作生产向量?

  • 为何每个人都在用 root 登录?

  • 权限能不能做到“只查不删”?

这些问题的答案,其实都指向一个常常被忽视却至关重要的能力:Milvus 的权限系统(RBAC)

接下来,本文将从概念入手,结合具体场景和配置示例,帮你彻底理清 Milvus 的权限管理系统,并教你如何在真实项目中设计一套安全、清晰、可维护的权限体系。

01 

为什么需要权限管理?

最初使用 Milvus 时,可能只有你一个人在操作,或者是一套简单的测试环境,但当业务开始落地,典型场景很快会变成:

  • 多个业务系统同时使用一个 Milvus 实例

  • 多个团队共享向量库

  • 测试 预发布 生产数据同时存在

  • 有人只需要查询,有人要写入,有人要运维

如果没有合理的权限管理,就很容易发生这些情况:

  • 💣 测试误删生产 Collection

  • 💣 开发误修改线上 Index

  • 💣 每个人都用 root,无法追责

  • 💣 某个服务被攻击时可以操作所有数据

这和我们在 MySQL、Kubernetes、云平台中管理账号和权限的逻辑是一样的:权限是整个生产系统的安全底线。

02 

权限系统的核心概念

Milvus 的权限系统基于经典的 RBAC(Role-Based Access Control)模型。

Milvus 的 RBAC 模型有四个主要组成部分:

资源
可访问的资源实体(实例、数据库和 Collections)。
权限/权限组
可对资源执行特定操作的权限,如对特定数据读取、写入或删除;多个权限组成的组叫权限组。
角色
权限和资源的组成。权限定义了角色可以执行的操作类型,而资源则定义了可以执行操作的目标资源。
用户
使用 Milvus 的人。


它们之间的关系可以用一句话概括:

用户(User)通过绑定角色(Role),继承某个或某些权限(Privilege/Privilege group),而权限是作用在某些资源(Resources)上的。

也就是说:你不是直接给 User 权限,而是通过 Role 进行统一管理

这种模型的最大优点是:当多人角色相同时,只需要修改一次 Role 的权限,就可以影响所有相关用户。

03 

工作原理 - 权限验证的流程

04 

权限配置流程

1. 前期准备

首先要为 Milvus 启用用户身份验证。

使用 Docker Compose 方式部署的话:

  • 修改 milvus.yaml
     配置文件,将 common.security.authorizationEnabled 设置为 true。

    common:
      security:
        authorizationEnabledtrue

    使用 Helm Charts 方式部署的话:

    • 修改 values.yaml
       配置文件,在 extraConfigFiles.user.yaml 中配置,添加common.security.authorizationEnabled 为 true 这段内容。

      extraConfigFiles:
        user.yaml: |+
          common:
            security:
              authorizationEnabledtrue

      2. 初始化

      默认情况下,启动 Milvus 时会创建 root
       用户,密码为 Milvus

      这里使用 root 用户连接并修改默认密码,建议用复杂密码。

        from pymilvus import MilvusClient
        # 使用默认的 root 用户连接 Milvus
        client = MilvusClient(
            uri='http://localhost:19530'
            token="root:Milvus"
        )
        # 更新密码
        client.update_password(
            user_name="root",
            old_password="Milvus"
            new_password="xgOoLudt3Kc#Pq68"
        )

        3. 核心操作

        3.1. 创建用户

        对于日常使用,建议创建新用户而不是使用  root 用户。

          client.create_user(user_name="user_1", password="P@ssw0rd")

          3.2. 创建角色

          Milvus 提供了一个名为 admin
           的内置角色,它是一个管理员角色。建议根据需要创建自定义的角色以实现更细粒度的权限管控。

            client.create_role(role_name="role_a")

            3.3. 创建权限组

            权限组由多个特权组成。为了简化授予权限的流程,可以将多个权限合并为一个权限组。

            Milvus 内置了 9 个特权组:COLL_RO、COLL_RW、COLL_ADMIN、DB_RO、DB_RW、DB_Admin、Cluster_RO、Cluster_RW 和 Cluster_Admin。

            合理使用这些内置特权组,可以极大降低权限设计复杂度,并提高整体一致性。

            可以直接使用内置的特权组,也可以新建特权组。

              # 创建特权组
              client.create_privilege_group(group_name='privilege_group_1'
              # 向特权组添加权限
              client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query''Search'])

              3.4. 向角色授予权限或权限组

              创建角色后,可以向角色授予权限。权限的目标资源,可以是特定实例、数据库或 Collections。

                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='*',
                )

                3.5. 向用户授予角色

                向用户授予角色后,用户就可以访问资源并执行角色所定义的操作。可以向一个用户授予一个或多个角色。

                  client.grant_role(user_name="user_1", role_name="role_a")

                  4. 查看与回收

                  • 查看用户的角色

                    client.describe_user(user_name="user_1")

                    • 查看角色的权限

                      client.describe_role(role_name="role_a")

                      • 撤销分配给角色的权限:

                        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_role(
                              user_name='user_1',
                              role_name='role_a'
                          )

                          • 删除用户和角色:

                            client.drop_user(user_name="user_1")
                            client.drop_role(role_name="role_a")

                            05 

                            结合场景理解:权限设计示例

                            假设现在有这样一个基于 Milvus 的 RAG 系统:

                            用户
                            职责
                            权限
                            平台管理员
                            运维与配置
                            实例管理
                            向量写入服务
                            读取和写入数据
                            读写操作
                            搜索服务
                            查询数据
                            只读操作


                              from pymilvus import MilvusClient
                              client = MilvusClient(
                                  uri='http://localhost:19530',
                                  token="root:xxx"  # 替换为已经修改过的 root 密码
                              )
                              # 1. 创建用户,建议复杂密码
                              client.create_user(user_name="rag_admin", password="xxx")
                              client.create_user(user_name="rag_reader", password="xxx")
                              client.create_user(user_name="rag_writer", password="xxx")
                              # 2. 创建角色
                              client.create_role(role_name="role_admin")
                              client.create_role(role_name="role_read_only")
                              client.create_role(role_name="role_read_write")
                              # 3. 向角色授予权限
                              ## 这里使用 Milvus 内置特权组
                              client.grant_privilege_v2(
                                  role_name="role_admin",
                                  privilege="Cluster_Admin",
                                  collection_name='*',
                                  db_name='*',
                              )
                              client.grant_privilege_v2(
                                  role_name="role_read_only",
                                  privilege="COLL_RO",
                                  collection_name='*',
                                  db_name='default',
                              )
                              client.grant_privilege_v2(
                                  role_name="role_read_write",
                                  privilege="COLL_RW",
                                  collection_name='*',
                                  db_name='default',
                              )
                              # 4. 向用户授予角色
                              client.grant_role(user_name="rag_admin", role_name="role_admin")
                              client.grant_role(user_name="rag_reader", role_name="role_read_only")
                              client.grant_role(user_name="rag_writer", role_name="role_read_write")

                              06 

                              权限设计最佳实践

                              ✅ 修改 root 默认密码,不共享 root 账号

                              ✅ 多实例优先,测试、预发布和生产物理隔离

                              ✅ 遵循最小权限原则

                              • 开发环境:适当放宽权限

                              • 生产环境:严格按需授权

                              • 定期审计:检查权限是否仍然必要

                              ✅ 不要忽略权限回收

                              07 

                              结语

                              Milvus 的权限系统设置并不复杂,但它是你从能用走向能放心用的关键一步。  通过合理的权限规划,你可以:

                              • 降低风险:防止误操作导致的数据损失

                              • 保障安全:实现数据访问的最小权限控制

                              • 规范管理:建立清晰的职责分离机制

                              • 支持扩展:为多租户、大规模部署奠定基础

                              今天就开始为你的 Milvus 构建坚实的安全堡垒吧,大冬天的,别让数据继续裸奔了。

                              参考文章:https://milvus.io/docs/zh/rbac.md

                              作者介绍

                              Milvus北辰使者:许娟


                              阅读推荐
                              embedding分数不是唯一解!搜索场景,如何根据元数据做加权rerank
                              短语检索不等于BM25+向量检索| Milvus Phrase Match实战
                              高精度知识库≠Milvus+llm!这份PaddleOCR+混合检索+Rerank技巧请收好
                              向量数据库新范式:分层存储,让数据从全量加载到按需加载 | Milvus Week
                              客服、代码、法律场景适配:Milvus Ngram Index如何百倍优化LIKE查询| Milvus Week

                              文章转载自ZILLIZ,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论