在 MongoDB 中,权限通过角色(Role) 定义,每个角色包含一组具体权限(Privilege),用于控制对数据库、集合、集群的操作。角色分为内置角色(系统预定义)和自定义角色(用户根据需求创建)。以下是 MongoDB 核心内置角色的分类详解,包括权限范围、具体权限及适用场景:
- 权限范围:整个集群及所有数据库(包括
config、local)。
- 核心权限:继承了
readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、backup、restore等所有关键角色的权限,可执行任何操作(如创建 / 删除数据库、管理用户、集群配置、备份恢复等)。
- 适用场景:数据库管理员(DBA),负责整个 MongoDB 环境的全量管理。
- 注意:权限极高,仅分配给核心管理员。
- 权限范围:所有数据库(
local、config除外)。
- 核心权限:允许读取所有数据库中的数据(查询文档、查看集合 / 索引信息),但不能写入数据或管理结构。
- 适用场景:需要跨库读取数据的审计或报表角色。
- 权限范围:所有数据库(
local、config除外)。
- 核心权限:包含
readAnyDatabase的所有权限,额外允许写入数据(插入、更新、删除文档)、创建 / 删除索引。
- 注意:不能管理数据库结构(如创建集合)或用户。
- 权限范围:所有数据库(
local、config除外)。
- 核心权限:允许对所有数据库执行结构管理操作,如创建 / 删除集合、修改数据库配置(如设置
maxSize)、创建 / 删除索引、执行validate校验等。
- 限制:不能读写数据(无
read/write权限),不能管理用户。
- 适用场景:跨库的结构管理员(如统一维护索引、集合结构)。
- 权限范围:所有数据库(
local、config除外)。
- 核心权限:允许管理所有数据库的用户和角色(创建 / 删除用户、分配 / 回收角色、修改用户密码等)。
- 特殊点:可给自己分配任意权限(包括
root),权限风险较高。
- 适用场景:跨库的用户管理员(统一管理全量用户)。
read:仅允许读取指定数据库的数据(查询文档、查看集合 / 索引信息)。
readWrite:允许读写指定数据库的数据(包含read权限,额外允许插入、更新、删除文档,创建 / 删除索引)。
dbAdmin:管理指定数据库的结构(创建 / 删除集合、修改数据库配置、创建 / 删除索引、执行validate等),但不能读写数据或管理用户。
userAdmin:管理指定数据库的用户和角色(创建 / 删除用户、分配角色等),可给自己分配该数据库的任意权限。
3.3 数据库级别的内置角色
dbOwner 角色的权限是以下三个基础角色的集合:
read 角色:允许读取指定数据库中的所有数据(包括查询集合、查看索引、执行聚合查询等)。
readWrite 角色:允许对指定数据库执行读写操作(包括插入、更新、删除文档,创建 / 删除集合、索引等)。
dbAdmin 角色:允许对指定数据库执行管理操作(包括修改数据库配置、清理日志、管理索引、执行数据库验证等)。
因此,dbOwner 实际上拥有对单个特定数据库的 “完全控制权”,涵盖了从数据读写到数据库管理的全部操作。
dbOwner 通常用于需要完全管理某个特定数据库的用户,例如:
- 某个业务数据库的管理员,需要同时负责数据维护(读写)和数据库配置(索引、集合管理等);
- 开发团队中负责特定数据库全生命周期管理的角色。
集群角色控制对 MongoDB 集群(副本集、分片集群)的管理操作,权限作用于整个集群而非单个数据库。
- 权限范围:整个集群。
- 核心权限:集群管理的最高权限,包括:
- 管理副本集(如
replSetReconfig重新配置副本集、replSetInitiate初始化副本集);
- 管理分片集群(如
addShard添加分片、enableSharding启用分片);
- 监控集群状态(
replSetGetStatus、shardCollection等);
- 继承
clusterManager、clusterMonitor、hostManager角色的权限。
- 适用场景:集群管理员(负责副本集 / 分片集群的配置和维护)。
- 权限范围:整个集群。
- 核心权限:可管理集群配置(如修改分片键、平衡器设置)、监控集群,但不能执行敏感操作(如
replSetReconfig重新配置副本集)。
- 权限范围:整个集群。
- 核心权限:仅允许监控集群状态(如查询副本集状态、分片状态、慢查询日志等),无管理权限。
- 适用场景:监控系统或运维人员(只读监控)。
- 权限范围:集群中的服务器节点。
- 核心权限:管理服务器级操作(如关闭
mongod进程、查看节点内存使用等),实际中较少使用(通常由操作系统权限控制)。
- 权限范围:所有数据库(
local除外)。
- 核心权限:允许执行备份操作(如使用
mongodump),需要读取数据和元数据的权限(包含readAnyDatabase的部分权限)。
- 权限范围:所有数据库(
local除外)。
- 核心权限:允许执行恢复操作(如使用
mongorestore),需要写入数据的权限(包含readWriteAnyDatabase的部分权限)。
- 权限范围:所有资源(数据库、集群、系统集合)。
- 核心权限:MongoDB 内部使用的角色,拥有所有操作的权限(包括修改系统集合),不建议分配给用户。
- 最小权限原则:分配角色时仅授予必要权限(如普通应用用
readWrite单库角色,监控用clusterMonitor)。
- 角色继承:复杂需求可通过角色继承实现(如自定义角色继承
read+clusterMonitor)。
- 范围区分:单库角色需指定数据库(如
db.test.read),跨库 / 集群角色无需指定数据库(在admin库创建)。