创建用户并分配权限
基于 MongoDB 6.x/7.x +
mongosh。本文概述用户创建流程、内置角色、Atlas 差异以及 2024-2025 新增的权限管理实践。详细参考 MongoDB Security Docs。
创建管理员用户(示例)
- 启动 
mongod时启用鉴权:mongod --auth --replSet rs0 ... - 使用本地连接(未开启鉴权时)创建初始管理用户:
 
      
        use admin;
db.createUser({
  user: 'rootAdmin',
  pwd: passwordPrompt(),
  roles: [
    { role: 'root', db: 'admin' }
  ]
});
      
    js
- 重新使用 
mongosh+ SCRAM 登录: 
      
        mongosh --host localhost -u rootAdmin -p --authenticationDatabase admin
      
    bash
- 在业务数据库授予最小权限用户:
 
      
        use appdb;
db.createUser({
  user: 'appUser',
  pwd: passwordPrompt(),
  roles: [
    { role: 'readWrite', db: 'appdb' }
  ]
});
      
    js
推荐使用
passwordPrompt()或环境变量避免明文密码;生产环境可结合 LDAP/Kerberos、AWS IAM、X.509 证书。
内置角色概览
MongoDB 将角色划分为不同级别,以下表格汇总常用角色与典型场景。角色详细权限可在 db.getRole('<role>', { showPrivileges: true }) 查看。
数据库用户角色(Database User Roles)
| 角色 | 说明 | 场景 | 
|---|---|---|
read | 只读访问非系统集合;可使用 find、listCollections | BI/报表 | 
readWrite | 读写非系统集合;可执行 insert、update、remove | 常规应用服务 | 
dbAdmin | 管理集合、索引、统计;不含用户管理 | 数据库管理员、调优 | 
dbOwner | readWrite + dbAdmin + userAdmin | 单库负责人 | 
userAdmin | 管理当前数据库用户/角色 | 独立团队管理员 | 
集群与备份角色(Cluster-Level Roles)
| 角色 | 说明 | 
|---|---|
clusterManager | 管理复制集/分片配置、Shard 迁移 | 
clusterMonitor | 只读监控权限,适合监控工具 | 
hostManager | 主机级操作(logRotate、shutdown 等) | 
clusterAdmin | 组合角色,包含以上全部 | 
backup | 备份所需最小权限(读取 oplog、系统集合等) | 
restore | 恢复集合、建立索引、执行 convertToCapped | 
全数据库角色(Admin DB)
位于 admin 数据库,对除 config、local 之外的所有数据库生效:
| 角色 | 说明 | 
|---|---|
readAnyDatabase | 所有数据库只读 | 
readWriteAnyDatabase | 所有数据库读写 | 
dbAdminAnyDatabase | 所有数据库管理(无用户管理) | 
userAdminAnyDatabase | 所有数据库的用户管理 | 
超级用户角色
| 角色 | 权限 | 
|---|---|
root | 包含所有权限;慎用,仅限基础管理员 | 
__system | 内部使用;不要分配给用户 | 
Atlas 专用补充
| 角色 | 场景 | 
|---|---|
atlasAdmin@admin | Atlas 项目级别管理 | 
readWriteAnyDatabase@admin + atlasAdmin | 常见于 Atlas 上的“Project Data Access Admin” | 
自定义角色
当内置角色无法满足需求时,可创建自定义角色:
      
        use admin;
db.createRole({
  role: 'reportingRole',
  privileges: [
    {
      resource: { db: 'appdb', collection: 'orders' },
      actions: ['find', 'listIndexes', 'collStats']
    },
    {
      resource: { cluster: true },
      actions: ['listDatabases']
    }
  ],
  roles: [{ role: 'read', db: 'config' }]
});
      
    js
赋予用户:
      
        db.getSiblingDB('appdb').grantRolesToUser('analyst', [{ role: 'reportingRole', db: 'admin' }]);
      
    js
自定义角色可继承其他角色(
roles字段),方便组合权限。
更新与撤销权限
      
        // 增加角色
db.grantRolesToUser('appUser', [{ role: 'readAnyDatabase', db: 'admin' }]);
// 撤销角色
db.revokeRolesFromUser('appUser', [{ role: 'readAnyDatabase', db: 'admin' }]);
// 修改密码
db.updateUser('appUser', { pwd: passwordPrompt(), mechanisms: ['SCRAM-SHA-256'] });
      
    js
安全最佳实践(2025)
- 最小权限:默认只授予 
readWrite/read,将管理权限拆分到专用账号 - 身份联动:配合 LDAP、Kerberos、X.509 或 Atlas App Services 统一认证
 - 多因素与密码策略:通过外部身份提供商实施 MFA,定期轮换凭证
 - 网络访问控制:结合 IP 白名单、安全组、PrivateLink/VPC Peering
 - 审计与监控:开启审计日志(Enterprise/Atlas)、Change Streams,对敏感操作留痕
 - 分环境隔离:不同环境(dev/test/prod)使用独立项目与用户,避免越权
 - 自动化:脚本化 
mongo/mongosh、Terraform Provider、Atlas CLI 管理用户 
常见问题
| 问题 | 说明 | 解决方案 | 
|---|---|---|
Authentication failed | 用户名/密码错误或认证库不匹配 | 确认 authSource、密码大小写,必要时 db.updateUser | 
not authorized on db to execute command | 权限不足 | 给用户授予需要的角色,或创建自定义角色 | 
SCRAM-SHA-256 相关错误 | 用户仍使用旧机制 | 执行 db.adminCommand({ authSchemaUpgrade: 1 }) 后更新用户 | 
Atlas IP not whitelisted | 网络未授权 | 在 Atlas 控制台添加客户端 IP 或配置 VPC Peering | 
管理员可使用
db.system.users.find()或 Atlas UI 查看当前用户/角色映射,定期评审权限。
 ↑