

今天聊一聊数据库权限和安全生产哪些事儿~
最近听了一个八卦,某家友商单位,测试同事直接用了生产连接,对数据库执行了一条看似无害的脚本;
几秒钟后
核心业务的向量 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 模型有四个主要组成部分:

它们之间的关系可以用一句话概括:
用户(User)通过绑定角色(Role),继承某个或某些权限(Privilege/Privilege group),而权限是作用在某些资源(Resources)上的。
也就是说:你不是直接给 User 权限,而是通过 Role 进行统一管理。
这种模型的最大优点是:当多人角色相同时,只需要修改一次 Role 的权限,就可以影响所有相关用户。
03
工作原理 - 权限验证的流程

04
权限配置流程
1. 前期准备
首先要为 Milvus 启用用户身份验证。
使用 Docker Compose 方式部署的话:
修改
milvus.yaml
配置文件,将 common.security.authorizationEnabled 设置为 true。
common:security:authorizationEnabled: true
使用 Helm Charts 方式部署的话:
修改
values.yaml
配置文件,在 extraConfigFiles.user.yaml 中配置,添加common.security.authorizationEnabled 为 true 这段内容。
extraConfigFiles:user.yaml: |+common:security:authorizationEnabled: true
2. 初始化
默认情况下,启动 Milvus 时会创建 root
用户,密码为 Milvus
。
这里使用 root 用户连接并修改默认密码,建议用复杂密码。
from pymilvus import MilvusClient# 使用默认的 root 用户连接 Milvusclient = 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 MilvusClientclient = 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







