内置角色
MongoDB 通过基于角色的授权授予对数据和命令的访问权限,并提供内置角色,这些角色提供数据库系统中通常需要的不同级别的访问权限。您还可以创建用户定义的角色。
角色授予对定义的资源执行一组操作的权限。给定的角色适用于定义它的数据库,并且可以授予访问权限到粒度的集合级别。
MongoDB 的每个内置角色都定义了 角色数据库中所有非系统集合在数据库级别的访问权限以及所有系统集合的集合级别的访问权限。
MongoDB 提供了内置的数据库用户和 数据库管理每个数据库上的角色 。MongoDB 仅在数据库上提供所有其他内置角色 admin。
本节介绍每个内置角色的权限。您还可以随时查看内置角色的权限,方法是发出 rolesInfo将showPrivileges和 showBuiltinRoles字段都设置为 的命令true。
数据库用户角色
每个数据库都包含以下客户端角色:
read
提供读取所有非系统集合和集合上的数据的能力system.js。
笔记:
从 MongoDB 4.2 开始,角色不再提供
system.namespaces直接访问集合的权限。自 MongoDB 3.0 以来,不推荐直接访问集合。在早期版本中,该角色提供了上述对
system.namespaces集合的特权操作,从而允许直接访问。
该角色通过授予以下操作来提供读取访问权限:
如果用户没有listDatabases 权限操作,用户可以运行该listDatabases 命令以返回用户具有权限的数据库列表(包括用户对特定集合具有权限的数据库)如果该命令运行时未指定或 authorizedDatabases设置到true。
readWrite
提供所有特权read角色加上修改所有非系统集合和system.js集合上的数据的能力。
该角色对这些集合提供以下操作:
changeStreamcollStatsconvertToCappedcreateCollectiondbHashdbStatsdropCollectioncreateIndexdropIndexfindinsertkillCursorslistIndexeslistCollectionsremoverenameCollectionSameDBupdate
数据库管理角色
每个数据库都包含以下数据库管理角色:
dbAdmin
提供执行管理任务的能力,例如与架构相关的任务、索引和收集统计信息。此角色不授予用户和角色管理权限。
具体来说,该角色提供以下权限:
资源:
-
允许的操作:
changeStreamcollStatsconvertToCappedcreateCollectiondbHashfindkillCursorslistCollectionslistIndexesplanCacheRead
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.indexesandsystem.namespaces集合。因此,dbAdmin角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。在早期版本中,
dbAdminrole 提供前面提到的对and集合的特权操作(除了dropCollection和createCollection),从而允许直接访问and集合。system.indexessystem.namespacessystem.indexessystem.namespaces 所有非系统集合(即数据库资源)
允许的操作:
dbOwner
数据库所有者可以对数据库执行任何管理操作。该角色结合了由readWrite, dbAdmin和userAdmin角色。
userAdmin
提供在当前数据库上创建和修改角色和用户的能力。自从userAdmin角色允许用户将任何权限授予任何用户,包括他们自己,该角色还间接提供超级用户 访问数据库,或者,如果范围是admin 数据库,则访问集群。
这userAdmin角色明确提供以下操作:
changeCustomDatachangePasswordcreateRolecreateUserdropRoledropUsergrantRolerevokeRolesetAuthenticationRestrictionviewRoleviewUser
警告:
了解授予
userAdmin角色:具有此数据库角色的用户可以为自己分配对该数据库的任何权限。授予userAdmin数据库上的角色admin具有进一步的安全隐患,因为这间接提供了 超级用户访问集群。具有admin范围的用户具有userAdmin角色可以授予集群范围的角色或特权,包括userAdminAnyDatabase.
集群管理角色
该admin数据库包括以下用于管理整个系统的角色,而不仅仅是一个数据库。这些角色包括但不限于副本集和分片集群管理功能。
clusterAdmin
提供最大的集群管理访问。该角色结合了由clusterManager, clusterMonitor, 和hostManager角色。此外,角色提供dropDatabase操作。
clusterManager
提供对集群的管理和监控操作。具有此角色的用户可以访问config和local 数据库,它们分别用于分片和复制。
资源
-
动作:
所有 数据库
动作:
clearJumboFlag(4.2.3新增)enableShardingrefineCollectionShardKey(4.4 中的新功能)moveChunksplitVector
clusterManager为config和local数据库提供额外的权限。
在config数据库上,允许执行以下操作:
资源:
config数据库中的所有非系统集合动作:
-
动作:
-
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.indexesandsystem.namespaces集合。因此,clusterManager角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。在早期版本中,
clusterManagersystem.indexesrole 提供上述对和 集合的特权操作system.namespaces,从而允许直接访问system.indexes和system.namespaces集合。
在local数据库上,允许执行以下操作:
资源:
local数据库中的所有非系统集合动作:
-
动作:
clusterMonitor
提供对监控工具的只读访问,例如MongoDB 云管理器 和运营经理监控代理。
允许对整个集群执行以下操作:
checkFreeMonitoringStatusconnPoolStatsgetCmdLineOptsgetDefaultRWConcern(4.4 版新增)getLoggetParametergetShardMaphostInfoinproglistDatabaseslistSessionslistShardsnetstatreplSetGetConfigreplSetGetStatusserverStatussetFreeMonitoringshardingStatetop
允许对集群中的所有数据库执行以下操作:
允许对集群中的find所有集合执行操作。system.profile
在config数据库上,允许执行以下操作:
资源:
config数据库中的所有非系统集合动作:
-
动作:
-
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.indexesandsystem.namespaces集合。因此,clusterMonitor角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。system.indexes在早期版本中,该角色提供上述对和集合的特权操作system.namespaces,从而允许直接访问system.indexes和system.namespaces集合。
在local数据库上,允许执行以下操作:
资源
local数据库中的所有集合动作:
-
-
从 4.2 版开始,MongoDB 删除了
system.indexesandsystem.namespaces集合。因此,clusterMonitor角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。system.indexes在早期版本中,该角色提供上述对和集合的特权操作system.namespaces,从而允许直接访问system.indexes和system.namespaces集合。
hostManager
提供监视和管理服务器的能力。
在整个集群上,提供以下操作:
applicationMessagecloseAllDatabasesconnPoolSyncflushRouterConfigfsyncinvalidateUserCachekillAnyCursorkillAnySessionkilloplogRotateoidResetresyncrotateCertificates(5.0版新增)setParametershutdowntouchunlock
Changed in version 4.4 :从 4.4 版本开始,hostManager不再提供cpuProfiler对集群的权限操作。
在集群中的所有数据库上,提供以下操作:
- killCursors
备份和恢复角色
数据库admin包括以下用于备份和恢复数据的角色:
backup
提供备份数据所需的最低权限。此角色提供足够的权限来使用MongoDB 云管理器备份代理, 运营经理备份代理,或使用 mongodump备份整个mongod实例。
提供对 数据库中的集合和 数据库中的集合的insert操作。updatemms.backup``adminsettingsconfig
在 上anyResource,提供
在整个集群上,提供了
appendOplogNotegetParameterlistDatabasesserverStatus(从 MongoDB 4.2 开始)setUserWriteBlockMode(从 MongoDB 6.0 开始)
提供find以下操作:
集群中的所有非
config系统集合,包括和local数据库中的那些集群中的以下系统集合:
system.users来自 2.6 之前版本的 MongoDB 的遗留集合
提供对集合的insert操作。updateconfig.settings
这backup角色提供额外的权限来备份system.profile运行数据库分析时存在的集合。
restore
提供convertToCapped非系统集合。
如果数据不包括system.profile收集数据并且您运行,则提供从备份恢复数据的必要权限mongorestore没有--oplogReplay选项。
如果备份数据包括system.profile收集数据或者您运行 --oplogReplay,您需要额外的权限:
system.profile |
如果备份数据包含system.profile集合数据,而目标数据库不包含system.profile 集合,mongorestore尝试创建集合,即使该程序实际上并未恢复system.profile 文档。因此,用户需要额外的权限才能对 数据库的集合执行createCollection和convertToCapped 操作。system.profile两个内置角色dbAdmin和 dbAdminAnyDatabase提供额外的特权。 |
--oplogReplay |
运行--oplogReplay,创建 具有 on的用户定义角色。anyActionanyResource仅授予必须运行的用户mongorestore 和--oplogReplay. |
在整个集群上提供以下操作:
对所有非系统集合提供以下操作:
bypassDocumentValidationchangeCustomDatachangePasswordcollModconvertToCappedcreateCollectioncreateIndexcreateRolecreateUserdropCollectiondropRoledropUsergrantRoleinsertrevokeRoleviewRoleviewUser
提供以下system.js收集操作:
在 上提供以下操作anyResource:
config对和数据库上的所有非系统集合提供以下操作 local:
提供以下操作admin.system.version
提供以下操作admin.system.roles
admin.system.users 提供对遗留集合的以下操作system.users:
bypassDocumentValidationcollModcreateCollectioncreateIndexdropCollectionfindinsertremoveupdate
虽然,restore包括使用正常修改操作修改集合中文档的能力admin.system.users,仅使用用户管理方法修改这些数据 。
在整个集群上,提供以下操作:
bypassWriteBlockingMode(盯着 MongoDB 6.0)setUserWriteBlockMode(从 MongoDB 6.0 开始)
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.namespaces集合。因此,restore角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。在早期版本中,
restorerole 在集合上提供上述特权操作system.namespaces,从而允许直接访问集合。
全数据库角色
以下角色在admin数据库上可用,并提供适用于除local和 之外的所有数据库的特权config:
readAnyDatabase
提供与readlocal在除和之外的所有数据库上config。该角色还提供 listDatabases对整个集群的操作。
另见clusterManager和 clusterMonitor访问config和 local数据库的角色。
readWriteAnyDatabase
提供与以下相同的特权readWritelocal在除和之外的所有数据库上config。该角色还提供:
listDatabases对整个集群的操作行动
compactStructuredEncryptionData_另见
clusterManager和clusterMonitor访问config和local数据库的角色。
userAdminAnyDatabase
提供与用户管理操作相同的访问权限 userAdminlocal在除和 之外的所有数据库上config。
userAdminAnyDatabase还在集群上提供以下特权操作:
system.users该角色对数据库中的和 system.roles集合 admin以及system.users2.6 之前的 MongoDB 版本的遗留集合提供以下特权操作 :
这userAdminAnyDatabase角色不限制用户可以授予的权限。因此,userAdminAnyDatabase用户可以授予自己超过当前权限的权限,甚至可以授予自己所有权限,即使该角色没有明确授权超出用户管理的权限。这个角色实际上是一个 MongoDB 系统超级用户。
另见clusterManager和 clusterMonitor访问config和 local数据库的角色。
dbAdminAnyDatabase
提供与以下相同的特权dbAdminlocal在除和之外的所有数据库上config。该角色还提供listDatabases对整个集群的操作。
另见clusterManager和 clusterMonitor访问config和 local数据库的角色。
从 MongoDB 5.0 开始,dbAdminAnyDatabase包括 applyOps特权操作。
超级用户角色
多个角色提供间接或直接的系统级超级用户访问权限。
以下角色提供了为任何用户分配对任何数据库的任何权限的能力,这意味着具有这些角色之一的用户可以为 自己分配对任何数据库的任何权限:
dbOwner角色,当范围限定为admin数据库时userAdmin角色,当范围限定为admin数据库时userAdminAnyDatabase角色
以下角色提供对所有资源的完全权限:
root
提供对以下角色组合的操作和所有资源的访问权限:
还提供validate 对system.集合的特权操作。
在6.0版中更改:角色root包括数据库 中集合的find权限 。removesystem.preimages``config
内部角色
__system
MongoDB 将此角色分配给代表集群成员的用户对象,例如副本集成员和mongos实例。该角色授权其持有者对数据库中的任何对象执行任何操作。
除非在特殊情况下,否则不要将此角色分配给代表应用程序或人工管理员的用户对象。
如果您需要访问所有资源的所有操作,例如运行applyOps命令,请不要分配此角色。相反,创建一个用户定义的角色,授予并确保只有需要访问这些操作的用户才具有此访问权限anyAction。anyResource
译者:韩鹏帅