创建用户并分配权限
基于 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 查看当前用户/角色映射,定期评审权限。
↑