不能对__system用户执行db.grantRolesToUser(),因为__system是MongoDB内部硬编码的伪用户,不存储于任何用户集合,无密码、不认证、不可创建或授权,其行为完全游离于RBAC之外。

为什么不能对 __system 用户执行 db.grantRolesToUser()
因为 __system 不是一个可创建、可分配、可登录的普通用户,而是 MongoDB 内部硬编码的“伪用户”,用于副本集心跳、分片路由、配置同步等底层通信。它没有密码,不走认证流程,也不在 admin.system.users 或任何用户集合中存储。
你尝试运行类似 db.grantRolesToUser("__system", { roles: ["root"] }) 会直接报错:no such user —— 这不是权限不足,而是该用户根本不存在于用户管理模型中。
__system 出现在日志或审计记录里的含义
当你在 system.profile 或审计日志里看到 user: "__system",说明这次操作是由 MongoDB 自身组件发起的,比如:
- 副本集主节点向从节点发送 oplog 拉取请求
- mongos 向 shard 发送查询分发指令
- config server 向 shard 同步分片元数据
这些行为绕过 RBAC 检查,由内部信任机制保障,不需要、也不允许你干预其“角色”。试图给它加 readWrite 或 clusterManager 是无意义的,系统不会读取这些配置。
混淆来源:__system 和 system. 开头的集合名
容易误以为 __system 和 system.* 集合(如 system.users、system.roles)有关联,其实没有:
-
system.users存储的是你用db.createUser()创建的用户凭证 -
__system不在任何集合里,它是源码级常量(见src/mongo/db/auth/authorization_manager.cpp) - 所有以
system.开头的集合都受 RBAC 控制;而__system的行为完全游离于 RBAC 之外
真正需要关注的“系统级权限”其实是 root 角色的使用边界
如果你以为 “给 __system 加权限” 是为了获得集群全局控制力,那方向错了。实际要解决的问题是:谁能在外部发起 shutdownServer()、修改 sharding 配置、访问 config 库?答案只有一个:root 角色,且必须在 admin 数据库中创建。
常见误操作包括:
- 在
test库执行db.createUser({ user: "sysop", roles: [{ role: "root", db: "admin" }] })→ 报错role 'root' not found - 用
readWriteAnyDatabase + userAdminAnyDatabase + dbAdminAnyDatabase组合替代root→ 缺失shutdownServer()、无法读config.settings、无法操作密钥文件
__system 是内建通道,root 才是你能掌控的最高权限入口——这两者不在同一抽象层,也不能互相模拟。


















