内置角色
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
集合上的数据的能力。
该角色对这些集合提供以下操作:
changeStream
collStats
convertToCapped
createCollection
dbHash
dbStats
dropCollection
createIndex
dropIndex
find
insert
killCursors
listIndexes
listCollections
remove
renameCollectionSameDB
update
数据库管理角色
每个数据库都包含以下数据库管理角色:
dbAdmin
提供执行管理任务的能力,例如与架构相关的任务、索引和收集统计信息。此角色不授予用户和角色管理权限。
具体来说,该角色提供以下权限:
资源:
-
允许的操作:
changeStream
collStats
convertToCapped
createCollection
dbHash
find
killCursors
listCollections
listIndexes
planCacheRead
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.indexes
andsystem.namespaces
集合。因此,dbAdmin
角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。在早期版本中,
dbAdmin
role 提供前面提到的对and集合的特权操作(除了dropCollection
和createCollection
),从而允许直接访问and集合。system.indexes
system.namespaces
system.indexes
system.namespaces
所有非系统集合(即数据库资源)
允许的操作:
dbOwner
数据库所有者可以对数据库执行任何管理操作。该角色结合了由readWrite
, dbAdmin
和userAdmin
角色。
userAdmin
提供在当前数据库上创建和修改角色和用户的能力。自从userAdmin
角色允许用户将任何权限授予任何用户,包括他们自己,该角色还间接提供超级用户 访问数据库,或者,如果范围是admin
数据库,则访问集群。
这userAdmin
角色明确提供以下操作:
changeCustomData
changePassword
createRole
createUser
dropRole
dropUser
grantRole
revokeRole
setAuthenticationRestriction
viewRole
viewUser
警告:
了解授予
userAdmin
角色:具有此数据库角色的用户可以为自己分配对该数据库的任何权限。授予userAdmin
数据库上的角色admin
具有进一步的安全隐患,因为这间接提供了 超级用户访问集群。具有admin
范围的用户具有userAdmin
角色可以授予集群范围的角色或特权,包括userAdminAnyDatabase
.
集群管理角色
该admin
数据库包括以下用于管理整个系统的角色,而不仅仅是一个数据库。这些角色包括但不限于副本集和分片集群管理功能。
clusterAdmin
提供最大的集群管理访问。该角色结合了由clusterManager
, clusterMonitor
, 和hostManager
角色。此外,角色提供dropDatabase
操作。
clusterManager
提供对集群的管理和监控操作。具有此角色的用户可以访问config
和local
数据库,它们分别用于分片和复制。
资源
-
动作:
所有 数据库
动作:
clearJumboFlag
(4.2.3新增)enableSharding
refineCollectionShardKey
(4.4 中的新功能)moveChunk
splitVector
clusterManager
为config
和local
数据库提供额外的权限。
在config
数据库上,允许执行以下操作:
资源:
config
数据库中的所有非系统集合动作:
-
动作:
-
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.indexes
andsystem.namespaces
集合。因此,clusterManager
角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。在早期版本中,
clusterManager
system.indexes
role 提供上述对和 集合的特权操作system.namespaces
,从而允许直接访问system.indexes
和system.namespaces
集合。
在local
数据库上,允许执行以下操作:
资源:
local
数据库中的所有非系统集合动作:
-
动作:
clusterMonitor
提供对监控工具的只读访问,例如MongoDB 云管理器 和运营经理监控代理。
允许对整个集群执行以下操作:
checkFreeMonitoringStatus
connPoolStats
getCmdLineOpts
getDefaultRWConcern
(4.4 版新增)getLog
getParameter
getShardMap
hostInfo
inprog
listDatabases
listSessions
listShards
netstat
replSetGetConfig
replSetGetStatus
serverStatus
setFreeMonitoring
shardingState
top
允许对集群中的所有数据库执行以下操作:
允许对集群中的find
所有集合执行操作。system.profile
在config
数据库上,允许执行以下操作:
资源:
config
数据库中的所有非系统集合动作:
-
动作:
-
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.indexes
andsystem.namespaces
集合。因此,clusterMonitor
角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。system.indexes
在早期版本中,该角色提供上述对和集合的特权操作system.namespaces
,从而允许直接访问system.indexes
和system.namespaces
集合。
在local
数据库上,允许执行以下操作:
资源
local
数据库中的所有集合动作:
-
-
从 4.2 版开始,MongoDB 删除了
system.indexes
andsystem.namespaces
集合。因此,clusterMonitor
角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。system.indexes
在早期版本中,该角色提供上述对和集合的特权操作system.namespaces
,从而允许直接访问system.indexes
和system.namespaces
集合。
hostManager
提供监视和管理服务器的能力。
在整个集群上,提供以下操作:
applicationMessage
closeAllDatabases
connPoolSync
flushRouterConfig
fsync
invalidateUserCache
killAnyCursor
killAnySession
killop
logRotate
oidReset
resync
rotateCertificates
(5.0版新增)setParameter
shutdown
touch
unlock
Changed in version 4.4 :从 4.4 版本开始,hostManager
不再提供cpuProfiler
对集群的权限操作。
在集群中的所有数据库上,提供以下操作:
- killCursors
备份和恢复角色
数据库admin
包括以下用于备份和恢复数据的角色:
backup
提供备份数据所需的最低权限。此角色提供足够的权限来使用MongoDB 云管理器备份代理, 运营经理备份代理,或使用 mongodump
备份整个mongod
实例。
提供对 数据库中的集合和 数据库中的集合的insert
操作。update
mms.backup``admin
settings
config
在 上anyResource
,提供
在整个集群上,提供了
appendOplogNote
getParameter
listDatabases
serverStatus
(从 MongoDB 4.2 开始)setUserWriteBlockMode
(从 MongoDB 6.0 开始)
提供find
以下操作:
集群中的所有非
config
系统集合,包括和local
数据库中的那些集群中的以下系统集合:
system.users
来自 2.6 之前版本的 MongoDB 的遗留集合
提供对集合的insert
操作。update
config.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的用户定义角色。anyAction anyResource 仅授予必须运行的用户mongorestore 和--oplogReplay . |
在整个集群上提供以下操作:
对所有非系统集合提供以下操作:
bypassDocumentValidation
changeCustomData
changePassword
collMod
convertToCapped
createCollection
createIndex
createRole
createUser
dropCollection
dropRole
dropUser
grantRole
insert
revokeRole
viewRole
viewUser
提供以下system.js
收集操作:
在 上提供以下操作anyResource
:
config
对和数据库上的所有非系统集合提供以下操作 local
:
提供以下操作admin.system.version
提供以下操作admin.system.roles
admin.system.users
提供对遗留集合的以下操作system.users
:
bypassDocumentValidation
collMod
createCollection
createIndex
dropCollection
find
insert
remove
update
虽然,restore
包括使用正常修改操作修改集合中文档的能力admin.system.users
,仅使用用户管理方法修改这些数据 。
在整个集群上,提供以下操作:
bypassWriteBlockingMode
(盯着 MongoDB 6.0)setUserWriteBlockMode
(从 MongoDB 6.0 开始)
笔记:
Aside
从 4.2 版开始,MongoDB 删除了
system.namespaces
集合。因此,restore
角色不再提供访问这些集合的权限。自 MongoDB 3.0 以来,不推荐直接访问这些集合。在早期版本中,
restore
role 在集合上提供上述特权操作system.namespaces
,从而允许直接访问集合。
全数据库角色
以下角色在admin
数据库上可用,并提供适用于除local
和 之外的所有数据库的特权config
:
readAnyDatabase
提供与read
local
在除和之外的所有数据库上config
。该角色还提供 listDatabases
对整个集群的操作。
另见clusterManager
和 clusterMonitor
访问config
和 local
数据库的角色。
readWriteAnyDatabase
提供与以下相同的特权readWrite
local
在除和之外的所有数据库上config
。该角色还提供:
listDatabases
对整个集群的操作行动
compactStructuredEncryptionData
_另见
clusterManager
和clusterMonitor
访问config
和local
数据库的角色。
userAdminAnyDatabase
提供与用户管理操作相同的访问权限 userAdmin
local
在除和 之外的所有数据库上config
。
userAdminAnyDatabase
还在集群上提供以下特权操作:
system.users
该角色对数据库中的和 system.roles
集合 admin
以及system.users
2.6 之前的 MongoDB 版本的遗留集合提供以下特权操作 :
这userAdminAnyDatabase
角色不限制用户可以授予的权限。因此,userAdminAnyDatabase
用户可以授予自己超过当前权限的权限,甚至可以授予自己所有权限,即使该角色没有明确授权超出用户管理的权限。这个角色实际上是一个 MongoDB 系统超级用户。
另见clusterManager
和 clusterMonitor
访问config
和 local
数据库的角色。
dbAdminAnyDatabase
提供与以下相同的特权dbAdmin
local
在除和之外的所有数据库上config
。该角色还提供listDatabases
对整个集群的操作。
另见clusterManager
和 clusterMonitor
访问config
和 local
数据库的角色。
从 MongoDB 5.0 开始,dbAdminAnyDatabase
包括 applyOps特权操作。
超级用户角色
多个角色提供间接或直接的系统级超级用户访问权限。
以下角色提供了为任何用户分配对任何数据库的任何权限的能力,这意味着具有这些角色之一的用户可以为 自己分配对任何数据库的任何权限:
dbOwner
角色,当范围限定为admin
数据库时userAdmin
角色,当范围限定为admin
数据库时userAdminAnyDatabase
角色
以下角色提供对所有资源的完全权限:
root
提供对以下角色组合的操作和所有资源的访问权限:
还提供validate
对system.
集合的特权操作。
在6.0版中更改:角色root
包括数据库 中集合的find
权限 。remove
system.preimages``config
内部角色
__system
MongoDB 将此角色分配给代表集群成员的用户对象,例如副本集成员和mongos
实例。该角色授权其持有者对数据库中的任何对象执行任何操作。
除非在特殊情况下,否则不要将此角色分配给代表应用程序或人工管理员的用户对象。
如果您需要访问所有资源的所有操作,例如运行applyOps
命令,请不要分配此角色。相反,创建一个用户定义的角色,授予并确保只有需要访问这些操作的用户才具有此访问权限anyAction
。anyResource
译者:韩鹏帅