在 MongoDB 中,权限通过角色(Role) 定义,每个角色包含一组具体权限(Privilege),用于控制对数据库、集合、集群的操作。角色分为内置角色(系统预定义)和自定义角色(用户根据需求创建)。以下是 MongoDB 核心内置角色的分类详解,包括权限范围、具体权限及适用场景:

1. 超级用户角色(最高权限)

1.1. root

  • 权限范围:整个集群及所有数据库(包括configlocal)。
  • 核心权限:继承了readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabaseclusterAdminbackuprestore等所有关键角色的权限,可执行任何操作(如创建 / 删除数据库、管理用户、集群配置、备份恢复等)。
  • 适用场景:数据库管理员(DBA),负责整个 MongoDB 环境的全量管理。
  • 注意:权限极高,仅分配给核心管理员。

2. 跨库操作角色(针对所有数据库,除localconfig

2.1. readAnyDatabase

  • 权限范围:所有数据库(localconfig除外)。
  • 核心权限:允许读取所有数据库中的数据(查询文档、查看集合 / 索引信息),但不能写入数据或管理结构。
  • 适用场景:需要跨库读取数据的审计或报表角色。

2.2. readWriteAnyDatabase

  • 权限范围:所有数据库(localconfig除外)。
  • 核心权限:包含readAnyDatabase的所有权限,额外允许写入数据(插入、更新、删除文档)、创建 / 删除索引。
  • 注意:不能管理数据库结构(如创建集合)或用户。

2.3. dbAdminAnyDatabase

  • 权限范围:所有数据库(localconfig除外)。
  • 核心权限:允许对所有数据库执行结构管理操作,如创建 / 删除集合、修改数据库配置(如设置maxSize)、创建 / 删除索引、执行validate校验等。
  • 限制:不能读写数据(无read/write权限),不能管理用户。
  • 适用场景:跨库的结构管理员(如统一维护索引、集合结构)。

2.4. userAdminAnyDatabase

  • 权限范围:所有数据库(localconfig除外)。
  • 核心权限:允许管理所有数据库的用户和角色(创建 / 删除用户、分配 / 回收角色、修改用户密码等)。
  • 特殊点:可给自己分配任意权限(包括root),权限风险较高。
  • 适用场景:跨库的用户管理员(统一管理全量用户)。

3. 单库操作角色(针对指定单个数据库)

3.1. 数据操作角色

  • read:仅允许读取指定数据库的数据(查询文档、查看集合 / 索引信息)。
  • readWrite:允许读写指定数据库的数据(包含read权限,额外允许插入、更新、删除文档,创建 / 删除索引)。

3.2. 数据库管理角色

  • dbAdmin:管理指定数据库的结构(创建 / 删除集合、修改数据库配置、创建 / 删除索引、执行validate等),但不能读写数据或管理用户。
  • userAdmin:管理指定数据库的用户和角色(创建 / 删除用户、分配角色等),可给自己分配该数据库的任意权限。

3.3 数据库级别的内置角色

dbOwner 的核心权限

dbOwner 角色的权限是以下三个基础角色的集合:
  1. read 角色:允许读取指定数据库中的所有数据(包括查询集合、查看索引、执行聚合查询等)。
  2. readWrite 角色:允许对指定数据库执行读写操作(包括插入、更新、删除文档,创建 / 删除集合、索引等)。
  3. dbAdmin 角色:允许对指定数据库执行管理操作(包括修改数据库配置、清理日志、管理索引、执行数据库验证等)。
因此,dbOwner 实际上拥有对单个特定数据库的 “完全控制权”,涵盖了从数据读写到数据库管理的全部操作。

适用场景:

dbOwner 通常用于需要完全管理某个特定数据库的用户,例如:
  • 某个业务数据库的管理员,需要同时负责数据维护(读写)和数据库配置(索引、集合管理等);
  • 开发团队中负责特定数据库全生命周期管理的角色。

4. 集群管理角色(针对整个集群,不绑定单个数据库)

集群角色控制对 MongoDB 集群(副本集、分片集群)的管理操作,权限作用于整个集群而非单个数据库。

4.1. clusterAdmin

  • 权限范围:整个集群。
  • 核心权限:集群管理的最高权限,包括:
    • 管理副本集(如replSetReconfig重新配置副本集、replSetInitiate初始化副本集);
    • 管理分片集群(如addShard添加分片、enableSharding启用分片);
    • 监控集群状态(replSetGetStatusshardCollection等);
    • 继承clusterManagerclusterMonitorhostManager角色的权限。
  • 适用场景:集群管理员(负责副本集 / 分片集群的配置和维护)。

4.2. clusterManager

  • 权限范围:整个集群。
  • 核心权限:可管理集群配置(如修改分片键、平衡器设置)、监控集群,但不能执行敏感操作(如replSetReconfig重新配置副本集)。

4.3. clusterMonitor

  • 权限范围:整个集群。
  • 核心权限:仅允许监控集群状态(如查询副本集状态、分片状态、慢查询日志等),无管理权限。
  • 适用场景:监控系统或运维人员(只读监控)。

4.4. hostManager

  • 权限范围:集群中的服务器节点。
  • 核心权限:管理服务器级操作(如关闭mongod进程、查看节点内存使用等),实际中较少使用(通常由操作系统权限控制)。

5. 备份与恢复角色

5.1. backup

  • 权限范围:所有数据库(local除外)。
  • 核心权限:允许执行备份操作(如使用mongodump),需要读取数据和元数据的权限(包含readAnyDatabase的部分权限)。

5.2. restore

  • 权限范围:所有数据库(local除外)。
  • 核心权限:允许执行恢复操作(如使用mongorestore),需要写入数据的权限(包含readWriteAnyDatabase的部分权限)。

6. 特殊角色

6.1. __system

  • 权限范围:所有资源(数据库、集群、系统集合)。
  • 核心权限:MongoDB 内部使用的角色,拥有所有操作的权限(包括修改系统集合),不建议分配给用户。

7. 角色权限对比表与总结

角色数据读写数据库结构管理用户管理集群管理跨库范围
read 单个库
readWrite 读写 部分(索引) 单个库
dbAdmin 单个库
userAdmin 单个库
dbOwner  读写 是(完整权限,包括:
1. 创建 / 删除集合、索引;
2. 修改数据库配置(如 maxSize);
3. 执行 validate 校验、cleanupOrphaned 清理;
4. 删除数据库(dropDatabase)等)
单个库
readAnyDatabase 所有库(除 local/config)
readWriteAnyDatabase 读写 部分(索引) 所有库(除 local/config)
dbAdminAnyDatabase 所有库(除 local/config)
userAdminAnyDatabase 所有库(除 local/config)
clusterAdmin 整个集群
backup/restore 读 / 写 部分(恢复) 所有库(除 local)
root 读写 所有库 + 集群

总结

  • 最小权限原则:分配角色时仅授予必要权限(如普通应用用readWrite单库角色,监控用clusterMonitor)。
  • 角色继承:复杂需求可通过角色继承实现(如自定义角色继承read+clusterMonitor)。
  • 范围区分:单库角色需指定数据库(如db.test.read),跨库 / 集群角色无需指定数据库(在admin库创建)。
 posted on 2025-08-04 18:38  xibuhaohao  阅读(29)  评论(0)    收藏  举报