温馨提示×

如何配置MongoDB的用户权限

小樊
43
2025-12-13 05:58:24
栏目: 云计算

MongoDB 用户权限配置实操指南

一 核心概念与准备

  • MongoDB 使用基于角色的访问控制(RBAC):权限通过“角色”授予,角色由“资源”(数据库、集合、集群等)与“操作”(如 find、insert、killOp 等)组成;用户可拥有多个角色,权限为累加关系。启用访问控制后,所有连接都必须先完成认证。为安全起见,建议先创建一个具备用户管理能力的账户,再开启授权。对于自管理部署,创建的第一个用户应为能管理其他用户的“用户管理员”(如具备 userAdminuserAdminAnyDatabase 的角色)。在 admin 数据库中创建的角色可包含跨库与集群级别的特权,非 admin 数据库的角色仅能作用于本库。

二 启用访问控制与创建首个管理员

  • 步骤概览
    1. 在未启用授权的实例上,先以本地连接创建“用户管理员”(建议在 admin 库): use admin db.createUser({ user: “myUserAdmin”, pwd: “StrongPass!23”, roles: [{ role: “userAdminAnyDatabase”, db: “admin” }] })
    2. 启用访问控制(二选一)
      • 命令行:mongod --auth --port 27017 --dbpath /data/db
      • 配置文件(mongod.conf): security: authorization: enabled
    3. 重启实例后,使用管理员账户连接并认证: 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” }] })
  • 说明
    • 内置角色覆盖常见场景:数据库级有 readreadWritedbAdmindbOwneruserAdmin;实例/集群级有 readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabaseclusterMonitorclusterManagerclusterAdmin;备份恢复有 backuprestore;超级用户为 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 到业务库),避免使用 rootreadAnyDatabase/readWriteAnyDatabase 给应用。
  • 管理员分权:区分“用户管理员”(userAdmin/userAdminAnyDatabase)与“数据/运维管理员”(dbOwner/dbAdmin),避免一人兼具过多权限。
  • 使用配置文件开启授权:在 mongod.conf 中设置 security.authorization: enabled,并采用服务方式管理,减少遗漏。
  • 副本集/分片环境:优先在 Primary 节点执行用户/角色变更;分片集群通过 mongos 统一管理用户。
  • 定期审计:使用 db.getUser()、db.getRole(…, {showPrivileges:true}) 核查账户与角色的实际权限,及时回收不再需要的权限。

0