如何配置MongoDB的用户权限
小樊
43
2025-12-13 05:58:24
MongoDB 用户权限配置实操指南
一 核心概念与准备
- MongoDB 使用基于角色的访问控制(RBAC):权限通过“角色”授予,角色由“资源”(数据库、集合、集群等)与“操作”(如 find、insert、killOp 等)组成;用户可拥有多个角色,权限为累加关系。启用访问控制后,所有连接都必须先完成认证。为安全起见,建议先创建一个具备用户管理能力的账户,再开启授权。对于自管理部署,创建的第一个用户应为能管理其他用户的“用户管理员”(如具备 userAdmin 或 userAdminAnyDatabase 的角色)。在 admin 数据库中创建的角色可包含跨库与集群级别的特权,非 admin 数据库的角色仅能作用于本库。
二 启用访问控制与创建首个管理员
- 步骤概览
- 在未启用授权的实例上,先以本地连接创建“用户管理员”(建议在 admin 库):
use admin
db.createUser({
user: “myUserAdmin”,
pwd: “StrongPass!23”,
roles: [{ role: “userAdminAnyDatabase”, db: “admin” }]
})
- 启用访问控制(二选一)
- 命令行:mongod --auth --port 27017 --dbpath /data/db
- 配置文件(mongod.conf):
security:
authorization: enabled
- 重启实例后,使用管理员账户连接并认证:
mongosh --host localhost --port 27017 -u myUserAdmin -p ‘StrongPass!23’ --authenticationDatabase admin
- 说明
- 只有在 admin 库上才应创建具备 userAdminAnyDatabase 等“所有库”管理能力的账户;开启授权后,未认证的连接将无法正常执行命令。
三 常用用户与角色配置示例
- 在目标业务库创建仅读写该库的用户
use sales
db.createUser({
user: “sales_rw”,
pwd: “SalesRW@2025”,
roles: [{ role: “readWrite”, db: “sales” }]
})
- 为应用只读访问多个库
use reporting
db.createUser({
user: “report_ro”,
pwd: “RptRO@2025”,
roles: [
{ role: “read”, db: “sales” },
{ role: “read”, db: “marketing” }
]
})
- 创建数据库“运维管理员”(可管理索引、统计等,但不具备读写数据权限)
use inventory
db.createUser({
user: “inv_admin”,
pwd: “InvAdm@2025”,
roles: [{ role: “dbAdmin”, db: “inventory” }]
})
- 创建实例级只读账户(谨慎授予)
use admin
db.createUser({
user: “audit_reader”,
pwd: “AuditR@2025”,
roles: [{ role: “readAnyDatabase”, db: “admin” }]
})
- 创建具备集群监控权限的只读账户(便于监控工具使用)
use admin
db.createUser({
user: “cluster_mon”,
pwd: “Mon!2025”,
roles: [{ role: “clusterMonitor”, db: “admin” }]
})
- 说明
- 内置角色覆盖常见场景:数据库级有 read、readWrite、dbAdmin、dbOwner、userAdmin;实例/集群级有 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、clusterMonitor、clusterManager、clusterAdmin;备份恢复有 backup、restore;超级用户为 root。仅在 admin 库可创建“所有库”与“集群”级别角色。
四 日常运维与权限变更
- 授予/撤销角色
- 授予跨库只读
use reporting
db.grantRolesToUser(“report_ro”, [{ role: “read”, db: “finance” }])
- 撤销某库写权限
use sales
db.revokeRolesFromUser(“sales_rw”, [{ role: “readWrite”, db: “sales” }])
- 修改密码
use admin
db.changeUserPassword(“myUserAdmin”, “NewStrongPass!45”)
- 查看用户与角色
- 查看某用户
use reporting
db.getUser(“report_ro”)
- 查看角色详细权限
use sales
db.getRole(“readWrite”, { showPrivileges: true })
- 分片集群提示
- 通过 mongos 的变更会立即生效;其他 mongos 的用户缓存通常会在最多 10 分钟 后刷新(参数 userCacheInvalidationIntervalSecs)。必要时可手动触发刷新或等待缓存过期。
五 安全加固与最佳实践
- 最小权限原则:应用账户只授予必需角色(如仅 readWrite 到业务库),避免使用 root 或 readAnyDatabase/readWriteAnyDatabase 给应用。
- 管理员分权:区分“用户管理员”(userAdmin/userAdminAnyDatabase)与“数据/运维管理员”(dbOwner/dbAdmin),避免一人兼具过多权限。
- 使用配置文件开启授权:在 mongod.conf 中设置 security.authorization: enabled,并采用服务方式管理,减少遗漏。
- 副本集/分片环境:优先在 Primary 节点执行用户/角色变更;分片集群通过 mongos 统一管理用户。
- 定期审计:使用 db.getUser()、db.getRole(…, {showPrivileges:true}) 核查账户与角色的实际权限,及时回收不再需要的权限。