自托管部署中的内置角色
MongoDB 通过基于角色的授权 提供数据和对命令的访问权限,并提供了提供数据库系统中常用不同级别访问权限的内置角色。您还可以创建 用户自定义角色。
角色授予在定义的 动作 上执行的一组 资源 的权限。给定的角色应用于其上定义的数据库,并可以授予向下到集合级别的访问权限。
系统集合 包括在
<database>.system.*
命名空间中的那些local.replset.*
复制集命名空间
有关详细信息,请参阅系统集合。
非系统集合 是那些不在上一列表中的命名空间。
MongoDB 的每个内置角色都定义了其数据库中所有 非 系统集合在数据库级别的访问权限,以及在所有系统集合上的集合级别的访问权限。
本节描述了每个内置角色的权限。您也可以通过使用将 showPrivileges
和 showBuiltinRoles
字段都设置为 true
的 rolesInfo
命令来随时查看内置角色的权限。
MongoDB Atlas 部署与自托管部署具有不同的内置角色。有关更多信息,请参阅以下资源
MongoDB Atlas 内置角色
有关在MongoDB Atlas中托管的部署的内置数据库用户角色,请参阅Altas 内置角色和权限。
您可以在MongoDB Atlas用户界面中创建数据库用户并分配内置角色。有关更多信息,请参阅添加数据库用户。
自托管部署内置角色
MongoDB 为自托管部署提供以下内置角色
数据库用户角色
每个数据库包含以下客户端角色
read
提供在所有非系统集合以及
system.js
集合上读取数据的能力。注意
该角色不提供直接访问
system.namespaces
集合的权限。该角色通过授予以下操作提供读取访问权限:
如果用户没有
listDatabases
权限操作,用户可以运行listDatabases
命令来返回用户有权限的数据库列表(包括用户在特定集合上有权限的数据库),如果命令以未指定或设置为true
的authorizedDatabases
选项运行。
数据库管理角色
每个数据库都包含以下数据库管理角色
dbAdmin
提供执行诸如模式相关任务、索引和收集统计信息等管理任务的能力。此角色不授予用户和角色管理的权限。
具体来说,此角色提供以下权限
资源允许的操作所有非系统集合(即数据库资源)
userAdmin
允许在当前数据库上创建和修改角色和用户。由于
userAdmin
角色允许用户将任何权限授予任何用户,包括自己,因此该角色也间接提供了对数据库或,如果作用域为admin
数据库,则对集群的超级用户访问权限。userAdmin
角色明确提供了以下操作警告
理解授予
userAdmin
角色的安全影响非常重要:具有此角色数据库的用户可以为自己在该数据库上分配任何权限。在admin
数据库上授予userAdmin
角色具有进一步的安全影响,因为这间接提供了对集群的 超级用户 访问权限。具有admin
范围的用户可以授予集群范围内的角色或权限,包括userAdminAnyDatabase
。
集群管理角色
admin
数据库包括以下角色,用于管理系统而不是单个数据库。这些角色包括但不限于 副本集 和 分片集群 管理功能。
clusterAdmin
提供最大的集群管理访问权限。此角色结合了由
clusterManager
、clusterMonitor
和hostManager
角色授予的权限。此外,该角色还提供了dropDatabase
操作。
clusterManager
提供对集群的管理和监控操作。具有此角色的用户可以访问
config
和local
数据库,分别用于分片和复制。此外,该角色还提供querySettings
操作。资源操作所有 数据库clusterManager
为config
和local
数据库提供额外的权限。在
config
数据库上,允许以下操作资源操作config
数据库中所有非系统集合在
local
数据库上,允许以下操作
clusterMonitor
提供对监控工具的只读访问权限,例如 MongoDB Cloud Manager 和 Ops Manager 监控代理。
允许在集群整体上进行以下操作
允许在集群中所有数据库上进行以下操作
允许在集群中所有
find
操作的所有system.profile
集合上。在
config
数据库上,允许以下操作资源操作config
数据库中所有非系统集合system.js
集合在
local
数据库上,允许以下操作
directShardOperations
从 MongoDB 8.0 版本开始,您可以使用
directShardOperations
角色执行需要对分片直接执行命令的维护操作。警告
使用
directShardOperations
角色运行命令可能导致您的集群无法正常工作,并可能引起数据损坏。仅当进行维护操作或在 MongoDB 支持的指导下时,才使用directShardOperations
角色进行操作。完成维护操作后,请停止使用directShardOperations
角色。
备份和恢复角色
管理员数据库包含以下备份和恢复数据角色:
backup
提供备份数据所需的最小权限。此角色提供了使用 MongoDB Cloud Manager 备份代理、Ops Manager 备份代理或使用
mongodump
备份整个mongod
实例的充分权限。在
config
数据库的settings
集合上提供insert
和update
操作。在
anyResource
上提供在整个 集群 上提供
setUserWriteBlockMode
(自 MongoDB 6.0 开始)
在以下内容上提供
find
操作:集群中所有非系统集合,包括
config
和local
数据库中的集合集群中的以下系统集合:
来自 MongoDB 2.6 之前版本的旧
system.users
集合
在
config.settings
集合上提供insert
和update
操作。backup
角色提供了额外的权限,用于备份在运行 数据库分析 时存在的system.profile
集合。
restore
在非系统集合上提供
convertToCapped
操作。如果备份数据不包含
system.profile
集合数据,并且您在未使用--oplogReplay
选项的情况下运行mongorestore
,则提供从备份中恢复数据所需的权限。如果备份数据包含
system.profile
集合数据或您使用--oplogReplay
运行,则需要额外的权限。system.profile
如果备份数据包含
system.profile
集合数据,而目标数据库不包含该集合,则mongorestore
会尝试创建该集合,尽管程序实际上并没有恢复system.profile
文档。因此,用户需要额外的权限来在数据库的system.profile
集合上执行createCollection
和convertToCapped
操作。内置角色
dbAdmin
和dbAdminAnyDatabase
提供了这些额外的权限。--oplogReplay
要使用
--oplogReplay
运行,创建一个具有对anyAction
权限的用户定义角色,并且这些权限应用于anyResource
。仅授予必须使用
mongorestore
与--oplogReplay
的用户。在整个集群上提供以下操作
在所有非系统集合上提供以下操作
在
system.js
集合上提供以下操作在
anyResource
上提供以下操作:在
config
和local
数据库上的所有非系统集合提供以下操作在
admin.system.version
上提供以下操作在
admin.system.roles
上提供以下操作在
admin.system.users
和传统的system.users
集合上提供以下操作尽管
restore
包括使用常规修改操作修改admin.system.users
集合文档的能力,但请仅使用用户管理方法修改这些数据。在
<database>.system.views
集合上提供以下操作dropCollection
(从 MongoDB 7.2 开始使用)
在集群整体上,提供以下操作
bypassWriteBlockingMode
(从 MongoDB 6.0 开始使用)setUserWriteBlockMode
(自 MongoDB 6.0 开始)
所有数据库角色
以下角色可在 admin
数据库中找到,并提供了适用于除 local
和 config
之外所有数据库的权限
readAnyDatabase
提供与在所有数据库(除了
local
和config
)上使用read
相同的只读权限。该角色还提供了集群整体上的listDatabases
操作。有关访问
config
和local
数据库的权限,请参阅clusterManager
和clusterMonitor
角色。
readWriteAnyDatabase
该角色提供与
readWrite
相同的权限,但除了本地数据库local
和配置数据库config
之外的所有数据库。该角色还提供对集群整体的
listDatabases
操作compactStructuredEncryptionData
操作
有关访问
config
和local
数据库的权限,请参阅clusterManager
和clusterMonitor
角色。
userAdminAnyDatabase
提供与本地数据库和配置数据库之外所有数据库的
userAdmin
相同的用户管理操作权限。userAdminAnyDatabase
还提供以下集群上的权限操作该角色在
和system.users
集合上,以及system.roles
admin
数据库上的旧版MongoDB 2.6之前的system.users
集合上提供以下权限操作角色
userAdminAnyDatabase
不限制用户可以授予的权限。因此,userAdminAnyDatabase
用户可以授予自己超出当前权限的权限,甚至可以授予自己 所有权限,尽管该角色没有明确授权超出用户管理的权限。这个角色实际上是一个 MongoDB 系统的 超级用户。有关访问
config
和local
数据库的权限,请参阅clusterManager
和clusterMonitor
角色。
dbAdminAnyDatabase
该角色提供与
dbAdmin
相同的权限,但除了local
和config
数据库之外的所有数据库。此外,该角色还提供在集群整体上的listDatabases
操作。有关访问
config
和local
数据库的权限,请参阅clusterManager
和clusterMonitor
角色。从 MongoDB 5.0 开始,
dbAdminAnyDatabase
包括 applyOps 权限操作。
超级用户角色
一些角色提供间接或直接的全局超级用户访问权限。
以下角色提供在任意数据库上为任意用户分配任意权限的能力,这意味着拥有这些角色的用户可以在任意数据库上授予自己任意权限
以下角色提供了对所有资源的完全权限
root
提供对以下角色的操作和所有资源的访问权限 合并
还提供以下权限操作
validate
在system.
集合。bypassDefaultMaxTimeMS
,导致用户运行的所有查询都将忽略defaultMaxTimeMS
的值。
内部角色
__system
MongoDB 将此角色分配给表示集群成员的用户对象,例如副本集成员和
mongos
实例。此角色使持有者有权对数据库中的任何对象采取任何行动。不要 将此角色分配给表示应用程序或人类管理员的用户对象,除非在特殊情况之下。
如果您需要访问所有资源上的所有操作,例如运行
applyOps
命令,不要分配此角色。相反,创建一个用户定义的角色,该角色授予在anyAction
上的anyResource
权限,并确保只有需要访问这些操作的用户提供此访问权限。