分享到

简介

授权是用户管理和访问控制中必不可少的组成部分,它定义了每个用户在系统上可以执行哪些操作的策略。确定哪些策略是合适的,并在你的数据库中实施这些策略,可以确保用户可以与他们需要的资源进行交互,同时防止不当行为。

在本指南中,我们将介绍授权在 MongoDB 中的工作原理。我们将介绍 MongoDB 如何概念化访问管理,哪些类型的权限可以授予用户,以及如何将策略附加到用户帐户。

先决条件

要遵循本指南,你需要在具有适当权限的 MongoDB 服务器上拥有一个帐户。

要调整 MongoDB 的配置并在数据库上启用授权,你需要在服务器上拥有 root 级别的访问权限。

此外,在 MongoDB 中,你需要一个至少具有 userAdmin 角色的帐户,以便可以设置基于角色的授权策略。包含 userAdmin 角色的角色(从最窄的关注范围到最广泛的权限范围排列)是

  • userAdmin
  • dbOwner
  • userAdminAnyDatabase
  • root

MongoDB 中的授权机制如何运作?

MongoDB 中的授权和权限管理是使用 基于角色的访问控制 (RBAC) 实现的。在这个系统中,不同的访问级别与单个角色相关联。要授予用户执行操作的权限,你需要授予他们具有适当权限的角色成员资格。

MongoDB 中的角色可以嵌套。这意味着角色可以授予其他角色。包含另一个角色的角色继承了所有子角色的权限。这使得可以通过适当地组合角色来创建具有所需权限的新角色。

权限本身由操作和资源的组合定义。操作部分描述了权限允许的行为类型,而资源指示操作的目标或范围。

MongoDB 中有哪些资源可用?

操作的目标或范围在 MongoDB 的访问控制模型中被称为资源。每个操作只能应用于特定类型的资源。在配置权限时,你需要指定权限应该适用的确切资源。

我们可以从最窄的关注范围到最广泛的关注范围,逐一介绍可用的资源。

权限可以通过将其范围限定到特定集群中特定数据库内的特定 集合 来最严格地定义。在同一个数据库中,不同的集合可以指定不同的权限。这允许你为不同类型的数据实施细粒度的策略。

你可以实施策略的下一个最大的资源是 数据库。在数据库级别管理权限允许你提供影响整个数据库及其所有集合的一般策略。

你还可以设置适用于所有数据库中同名集合的策略。这允许你使用命名约定在整个系统中实施特定集合的访问控制。更广泛的版本是将策略应用于系统上的所有数据库和非系统集合。

最后,你可以针对整个 集群 应用策略。针对集群的操作会影响一般系统,而不是它直接管理的数据。集群级别的策略倾向于关注管理操作。

MongoDB 中有哪些操作可用?

MongoDB 中有许多操作与一般使用、数据库管理和系统管理相关。一般来说,操作对应于 MongoDB 中的一个或多个命令或方法。

要查看 MongoDB 中可用的操作列表及其功能,请展开下面的部分。

操作范围描述
find数据库或集合允许对数据库进行读取操作
插入数据库或集合允许对数据库进行写入操作
删除数据库或集合允许对数据库进行删除操作
更新数据库或集合允许对数据库进行替换操作
绕过文档验证数据库或集合允许用户忽略文档的数据验证策略。
使用UUID集群允许用户使用 UUID 值来查找文档
更改自定义数据数据库用户可以修改与数据库中任何用户相关的自定义数据
更改自己的自定义数据数据库允许用户更改与自己用户相关的自定义数据
更改自己的密码数据库允许用户更改自己的帐户密码
更改密码数据库允许用户更改数据库中任何用户的密码
创建集合数据库或集合允许用户在数据库中创建集合
创建索引数据库或集合允许用户为数据库创建索引
创建角色数据库允许用户在数据库中创建自定义角色
创建用户数据库允许用户定义新的用户帐户
删除集合数据库或集合允许用户删除集合
删除角色数据库允许用户删除角色
删除用户数据库允许用户删除用户
启用性能分析数据库允许用户启用性能分析
授予角色数据库允许用户将与数据库关联的角色授予系统上的任何用户
终止游标集合允许用户在 4.2 之前的 MongoDB 版本中终止自己的游标
终止任何游标集合允许用户终止其他用户的游标
撤销角色数据库允许用户从系统中的任何用户那里删除角色
设置身份验证限制数据库允许用户为用户和角色设置身份验证要求
解锁集群允许用户减少集群上的写锁数量
查看角色数据库允许查看数据库中有关角色的详细信息
查看用户数据库允许查看数据库中有关用户的详细信息
身份验证模式升级集群允许用户在 MongoDB 版本之间升级身份验证机制
清理孤立文档集群允许用户清理 4.4 之前的 MongoDB 版本中的孤立文档
CPU 分析器集群允许用户启用 CPU 分析
正在进行集群允许用户查看其他用户正在进行或排队操作的信息
使缓存失效集群允许用户手动从缓存中刷新用户详细信息
终止操作集群允许用户终止其他用户的操作
计划缓存读取数据库或集合允许用户查看有关缓存的查询计划的信息
计划缓存写入数据库或集合允许用户删除缓存的查询计划
存储详细信息数据库或集合已弃用
更改流集合、数据库或集群允许用户从非系统集合中访问实时更改数据
追加操作日志备注集群允许用户向操作日志添加备注
复制集配置集群允许配置复制集
复制集获取配置集群允许用户查看当前复制集配置
复制集获取状态集群允许用户查找复制集的当前状态
复制集心跳集群已弃用
复制集状态更改集群允许用户管理集群复制集的状态
重新同步集群已弃用
添加分片集群允许用户将分片复制添加到分片集群
清除超大块标志数据库或集合允许用户清理分片中的超大块
启用分片集群、数据库或集合允许用户在集群和数据库上启用分片,或在集群级别管理分片
优化集合分片键数据库或集合允许用户向现有分片键添加其他字段
刷新路由器配置集群允许用户将缓存的路由表标记为已过时
获取分片版本数据库内部命令
列出分片集群允许用户查看集群的已配置分片列表
移动块数据库或集合允许用户将块移动到新的分片
移除分片集群允许用户从分片中清空块,然后从集群中移除分片
分片状态集群允许用户查看 MongoDB 服务器是否属于分片集群的一部分
拆分块数据库或集合允许用户合并或拆分分片中的块
拆分向量数据库或集合内部命令
应用程序消息集群允许用户向审核日志添加自定义消息
关闭所有数据库集群已弃用
修改集合数据库或集合允许用户修改与集合关联的选项
压缩数据库或集合允许用户对集合中的数据和索引进行碎片整理
连接池同步集群内部命令
转换为封顶数据库或集合允许用户将集合转换为具有设定的最大大小的封顶集合
删除连接集群允许用户从 MongoDB 到指定主机的连接中删除传出连接
删除数据库数据库允许用户删除当前数据库
删除索引数据库或集合允许用户删除索引
强制UUID集群允许用户使用全局唯一的 UUID 定义集合
强制同步集群允许用户将所有挂起的写入刷新到存储并锁定集群以进行写入
获取默认读写关注点集群允许用户查看默认的读写一致性和隔离设置
获取参数集群允许用户查询参数的值
主机信息集群允许用户查看运行 MongoDB 实例的服务器的信息
日志轮转集群允许用户触发日志轮转
重新索引数据库或集合允许用户重建集合的索引
重命名同一数据库中的集合数据库允许用户重命名当前数据库中的集合
设置默认读写关注点集群允许用户指定默认的读写一致性和隔离设置
设置参数集群允许用户定义参数的值
关闭集群允许用户关闭 MongoDB 实例
触摸集群已弃用
模拟集群允许用户终止与其他用户和角色关联的会话
列出会话集群允许用户列出所有用户的会话
终止任何会话集群允许用户终止特定用户或模式的所有会话
检查免费监控状态集群允许用户查看云监控功能的状态
设置免费监控集群允许用户启用或禁用云监控功能
集合统计数据库或集合允许用户查看有关集合的统计信息
连接池统计集群允许用户查看 MongoDB 实例传出连接的状态
数据库哈希数据库或集合允许用户查询数据库中集合的哈希值
数据库统计数据库允许用户查看存储统计信息
获取命令行选项集群允许用户查看用于启动 MongoDB 实例的命令行选项
获取日志集群允许用户查看最新的 MongoDB 事件
列出数据库集群允许用户查看所有数据库的列表
列出集合数据库允许用户查看数据库中集合和视图的列表
列出索引数据库或集合允许用户查看与特定集合关联的索引
网络统计集群内部命令
服务器状态集群允许用户查看有关数据库当前状态的信息
验证数据库或集合允许用户检查集合数据和索引的正确性
顶部集群允许用户查看集合的使用统计信息

MongoDB 默认提供哪些角色?

MongoDB 包含许多有用的角色,它们将类似的权限组合在一起。这些角色允许您以简洁的方式授予和撤销对数据库资源的权限。

要查看 MongoDB 中可用的操作列表及其功能,请展开下面的部分。

  • read: 提供对非系统集合的读取访问权限
    • 操作
      • 更改流
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 终止游标
      • 列出索引
      • 列出集合
  • readWrite: 提供对非系统集合的读写访问权限
    • 操作
      • 集合统计
      • 转换为封顶
      • 创建集合
      • 数据库哈希
      • 数据库统计
      • 删除集合
      • 创建索引
      • 删除索引
      • find
      • 插入
      • 终止游标
      • 列出索引
      • 列出集合
      • 删除
      • 重命名同一数据库中的集合
      • 更新
  • dbAdmin: 提供对数据库级别的管理任务的访问权限,不包括角色和用户管理
    • system.profile 集合中的操作
      • 更改流
      • 集合统计
      • 转换为封顶
      • 创建集合
      • 数据库哈希
      • 数据库统计
      • 删除集合
      • find
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
    • 在非系统集合中的操作
      • 绕过文档验证
      • 修改集合
      • 集合统计
      • 压缩
      • 转换为封顶
      • 创建集合
      • 创建索引
      • 数据库统计
      • 删除集合
      • 删除数据库
      • 删除索引
      • 启用性能分析
      • 列出集合
      • 列出索引
      • 计划缓存索引过滤器
      • 计划缓存读取
      • 计划缓存写入
      • 重新索引
      • 重命名同一数据库中的集合
      • 存储详细信息
      • 验证
  • userAdmin: 提供创建和修改用户和角色的访问权限
    • 操作
      • 更改自定义数据
      • 更改密码
      • 创建角色
      • 创建用户
      • 删除角色
      • 删除用户
      • 授予角色
      • 撤销角色
      • 设置身份验证限制
      • 查看角色
      • 查看用户
  • dbOwner: 提供对数据库的管理访问权限,包括角色和用户管理
    • 此角色继承的角色
      • readWrite
      • dbAdmin
      • userAdmin
  • clusterMonitor: 提供对集群的读取访问权限
    • 针对整个集群的操作
      • 检查免费监控状态
      • 连接池统计
      • 获取命令行选项
      • 获取默认读写关注点
      • 获取日志
      • 获取参数
      • 获取分片映射
      • 主机信息
      • 正在进行
      • 列出数据库
      • 列出会话
      • 列出分片
      • 网络统计
      • 复制集获取配置
      • 复制集获取状态
      • 服务器状态
      • 设置免费监控
      • 分片状态
      • 顶部
    • 针对集群中所有数据库的操作
      • 集合统计
      • 数据库统计
      • 获取分片版本
      • 索引统计
      • 使用UUID
    • 针对所有 system.profile 集合的操作
      • find
    • 针对 config 数据库中非系统集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 获取分片版本
      • 索引统计
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
    • 针对 config 数据库中 system.js 集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
    • 针对 local 数据库中所有集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 获取分片版本
      • 索引统计
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
    • 针对 local 数据库中 system.js 集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
    • 针对 local 数据库中 system.replsetsystem.profile 集合的操作
      • find
  • clusterManager: 通过 configlocal 数据库提供对集群的监控和管理访问权限
    • 针对整个集群的操作
      • 添加分片
      • 追加操作日志备注
      • 应用程序消息
      • 清理孤立文档
      • 刷新路由器配置
      • 获取默认读写关注点
      • 列出会话
      • 列出分片
      • 移除分片
      • 复制集配置
      • 复制集获取配置
      • 复制集获取状态
      • 复制集状态更改
      • 重新同步
      • 设置默认读写关注点
      • 设置功能兼容性版本
      • 设置免费监控
    • 针对集群中所有数据库的操作
      • 清除超大块标志
      • 启用分片
      • 优化集合分片键
      • 移动块
      • 拆分块
      • 拆分向量
    • 针对 config 数据库中非系统集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • 启用分片
      • find
      • 插入
      • 终止游标
      • 列出集合
      • 列出索引
      • 移动块
      • 计划缓存读取
      • 删除
      • 拆分块
      • 拆分向量
      • 更新
    • 针对 config 数据库中 system.js 集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
    • 针对 local 数据库中所有非系统集合的操作
      • 启用分片
      • 插入
      • 移动块
      • 删除
      • 拆分块
      • 拆分向量
      • 更新
    • 针对 local 数据库中 system.replset 集合的操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 终止游标
      • 列出集合
      • 列出索引
      • 计划缓存读取
  • hostManager: 提供监控和管理服务器的能力。
    • 针对整个集群的操作
      • 应用程序消息
      • 关闭所有数据库
      • 连接池同步
      • 刷新路由器配置
      • 强制同步
      • 使缓存失效
      • 终止任何游标
      • 终止任何会话
      • 终止操作
      • 日志轮转
      • 重新同步
      • 设置参数
      • 关闭
      • 触摸
      • 解锁
  • clusterAdmin: 提供所有集群管理访问权限
    • 此角色继承的角色
      • clusterManager
      • clusterMonitor
      • hostManager
    • 其他操作
      • 删除数据库
  • backup: 提供备份数据的必要权限
    • 针对所有资源的操作
      • 列出数据库
      • 列出集合
      • 列出索引
    • 针对整个集群的操作
      • 追加操作日志备注
      • 获取参数
      • 列出数据库
      • 服务器状态
    • 针对非系统集合、system.jssystem.profile 集合、admin.system.usersadmin.system.roles 集合以及 config.settings 集合的操作
      • find
    • 针对 config.settings 集合的操作
      • 插入
      • 更新
  • restore: 提供将数据还原到集群的权限
    • 针对整个集群的操作
      • 获取参数
    • 针对非系统集合的操作
      • 绕过文档验证
      • 更改自定义数据
      • 更改密码
      • 修改集合
      • 转换为封顶
      • 创建集合
      • 创建索引
      • 创建角色
      • 创建用户
      • 删除集合
      • 删除角色
      • 删除用户
      • 授予角色
      • 插入
      • 撤销角色
      • 查看角色
      • 查看用户
    • 针对 system.js 集合的操作
      • 绕过文档验证
      • 修改集合
      • 创建集合
      • 创建索引
      • 删除集合
      • 插入
    • 针对任何资源的操作
      • 列出集合
    • 针对 configlocal 数据库中非系统集合的操作
      • 绕过文档验证
      • 修改集合
      • 创建集合
      • 创建索引
      • 删除集合
      • 插入
    • 针对 admin.system.version 集合的操作
      • 绕过文档验证
      • 修改集合
      • 创建集合
      • 创建索引
      • 删除集合
      • find
      • 插入
    • 针对 admin.system.roles 集合的操作
      • 创建索引
    • 针对 admin.system.users 集合的操作
      • 绕过文档验证
      • 修改集合
      • 创建集合
      • 创建索引
      • 删除集合
      • find
      • 插入
      • 删除
      • 更新
  • readAnyDatabase: 除了 localconfig 数据库外,提供与 read 相同的权限,适用于所有数据库。
    • 对整个集群的额外操作
      • 列出数据库
  • readWriteAnyDatabase: 除了 localconfig 数据库外,提供与 readWrite 相同的权限,适用于所有数据库。
    • 对整个集群的额外操作
      • 列出数据库
  • userAdminAnyDatabase: 除了 localconfig 数据库外,提供与 userAdmin 相同的权限,适用于所有数据库。
    • 对整个集群的额外操作
      • 身份验证模式升级
      • 使缓存失效
      • 列出数据库
    • admin 数据库中的 system.userssystem.roles 集群的额外操作
      • 集合统计
      • 数据库哈希
      • 数据库统计
      • find
      • 终止游标
      • 计划缓存读取
  • dbAdminAnyDatabase: 除了 localconfig 数据库外,提供与 dbAdmin 相同的权限,适用于所有数据库。
    • 对整个集群的额外操作
      • 列出数据库
  • root: 提供对整个系统的完全访问权限。
    • 此角色继承的角色
      • readWriteAnyDatabase
      • dbAdminAnyDatabase
      • userAdminAnyDatabase
      • clusterAdmin
      • restore
      • backup
    • system 集合的额外操作
      • 验证

如何在 MongoDB 中启用授权

在 MongoDB 可以使用授权管理用户权限之前,您必须在服务器或集群上启用此功能。为此,您必须使用 root 或其他管理员权限登录到服务器。

注意:在启用授权之前,请仔细检查确保您至少拥有一个角色,该角色具有管理角色所需的权限。

通过使用文本编辑器以管理员身份打开 /etc/mongod.conf 文件来修改 MongoDB 服务器的配置。此命令将使用 EDITOR 环境变量中定义的文本编辑器打开文件,并回退到 vi,它在几乎所有系统上都可用。

sudo ${EDITOR:-vi} /etc/mongod.conf

MongoDB 配置文件使用 YAML 序列化格式 来定义配置。取消注释或在文件中添加一个 security: 节点键。在该键下方,使用空格缩进一行(YAML 中不允许使用制表符),并将 authorization 设置为 enabled

. . .
security:
authorization: enabled
. . .

完成后,保存并关闭文件。

要启用新的设置,请重新启动 MongoDB 服务器进程。如果您的 MongoDB 服务器在 Linux 主机上运行,操作将如下所示

sudo systemctl restart mongod.service

进程重新启动后,MongoDB 的授权框架应该在数据库中启用。

查看权限和角色

在开始将角色分配给用户之前,最好先了解如何在系统中查看有关权限和角色的信息。

要查看系统上所有可用的角色,包括所有内置角色及其关联的权限,请使用 db.getRoles() 方法,并将 showPrivilegesshowBuiltinRoles 选项设置为 true

db.getRoles({
rolesInfo: 1,
showPrivileges: true,
showBuiltinRoles: true
})

返回的列表将包含有关每个角色及其在系统中各种资源上的权限的完整嵌套信息列表。

要获取有关特定角色的信息,请改用 db.getRole() 方法。您必须在执行命令之前位于用户定义所在的数据库中。

use admin
db.getRole(
"root",
{
showPrivileges: true,
showBuiltinRoles: true
}
)

要检查已授予每个用户的角色,请切换到您感兴趣的数据库并使用 db.getUsers() 方法

use admin
db.getUsers()

要检查与特定用户关联的角色,请改用 db.getUser()

use admin
db.getUser("root")

分配和撤销用户的角色

要授予用户更多权限,您必须授予他们访问现有角色的权限。

db.grantRolesToUser() 方法允许您指定要添加到用户的额外角色。它的第一个参数是要授予额外权限的用户,第二个参数是要添加的额外角色数组。

db.grantRolesToUser(
"sally",
[
"read",
"backup"
]
)

如果角色在当前数据库中定义,您可以使用上面的简写方法,该方法通过名称指定角色,而不提及数据库。

要授予与其他数据库关联的角色,或更明确地指定角色,请使用文档指定 roledb,而不是数据库名。

db.grantRolesToUser(
"sally",
[
{ role: "read", db: "sales"},
{ role: "readWrite", db: "callLogs"}
]
)

要撤销用户的角色,您可以使用名为 db.revokeRolesFromUser() 的配套方法。参数语法完全相同,但这次,命令将从指定的帐户中删除角色。

要删除在当前数据库中定义的角色,您可以使用角色名称,而不提及数据库。

db.revokeRolesFromUser(
"sally",
[
"read",
"backup"
]
)

要指定与其他数据库关联的角色,请使用长格式,在文档中指定 roledb

db.revokeRolesFromUser(
"sally",
[
{ role: "read", db: "sales"},
{ role: "readWrite", db: "callLogs"}
]
)

创建和管理自定义角色

有时系统内置的角色无法完全满足您需要分配的权限类型。在这种情况下,您可以创建自己的自定义角色。

创建新角色

db.createRole() 方法允许您定义一个新的角色,您可以为其分配权限和其他角色。然后,您可以将新角色授予用户,以赋予他们您定义的特定权限。

db.createRole() 方法的基本语法涉及传递一个文档,该文档定义角色的特征。文档可以包含以下字段

  • role: 要赋予角色的名称
  • privileges: 包含要分配给角色的一组松散权限的数组。每个权限都定义在一个嵌套文档中,该文档定义一个 resource 文档(指定此权限适用的资源)以及正在授予的 actions 数组。
  • roles: 此角色应继承的其他角色的数组。新角色将获得授予此处列出的任何角色的所有权限。
  • authenticationRestrictions: 指定角色身份验证的任何限制的数组。这允许您拒绝角色的权限,如果用户没有以角色批准的方式进行身份验证。

前三个字段对于创建的每个新角色都是必需的。

例如,让我们创建一个名为 salesMonitor 的角色,它提供对 sales 数据库的只读访问权限。

db.createRole({
role: "salesMonitor",
privileges: [],
roles: [
{
role: "read",
db: "sales"
}
],
})

我们可以使用 privileges 字段而不是 read 角色来表达一个类似(但更有限)的角色,方法是键入以下内容

db.createRole({
role: "salesMonitor",
privileges: [
{
resource: { db: "sales", collection: "" },
actions: [ "find" ]
}
],
roles: []
})

查看有关自定义角色的信息

与以前一样,您可以使用 db.getRole() 方法获取有关角色的信息。

db.getRole(
"salesMonitor",
{
showPrivileges: true
}
)

授予自定义角色更多权限

要授予现有用户定义的角色更多权限,您可以使用 db.grantPrivilegesToRole() 方法。它接受一个权限数组,这些权限由包含 resource 文档和 actions 数组的文档定义,就像我们在上面使用 db.createRole() 时看到的那样。

例如,要将 listCollections 权限添加到 salesMonitor 角色,您可以键入以下内容

db.grantPrivilegesToRole(
"salesMonitor",
[
{
resource: { db: "sales", collection: "" },
actions: [ "listCollections" ]
}
]
)

撤销自定义角色的权限

如果您改变主意,您可以使用 db.revokePrivilegesFromRole() 方法使用相同的格式删除 listCollections 操作。

db.revokePrivilegesFromRole(
"salesMonitor",
[
{
resource: { db: "sales", collection: "" },
actions: [ "listCollections" ]
}
]
)

授予自定义角色的角色

要将角色定义的权限添加到另一个角色,您可以使用 db.grantRolesToRole() 方法。该方法接受要修改的角色以及要添加到该角色的角色数组作为参数。

如果您最终还是想对 salesMonitor 角色使用 read 角色,您可以通过键入以下内容来实现。

db.grantRolesToRole(
"salesMonitor",
[
"read"
]
)

撤销自定义角色的权限

如果您再次改变主意,可以使用 db.revokeRolesFromRole() 方法撤销角色访问权限,该方法使用相同的参数语法。

db.revokeRolesFromRole(
"salesMonitor",
[
"read"
]
)

替换自定义角色的值

要重新定义用户定义角色的特征,可以使用 db.updateRole() 命令。它通过*替换*它指定的字段来工作,而不是*追加*或*截断*它们。因此,在发出命令时要小心,以免意外覆盖重要信息。

db.updateRole() 命令的语法涉及将角色名称作为第一个参数传递,并将指定要替换的字段的文档作为第二个参数传递。可以替换的字段包括 privileges 数组、roles 数组和 authenticationRestrictions 数组。文档中必须包含至少一个这些字段。

例如,当我们最终确定要使用 sales 数据库上的 read 角色来定义 salesMonitor 角色时,我们可能希望重新定义该角色的权限和角色数组,以清理我们实验中遗留的任何额外权限。您可以通过使用要设置的新信息更新角色来做到这一点。

db.updateRole(
"salesMonitor",
{
privileges: [],
roles: [
{
role: "read",
db: "sales"
}
]
}
)

删除用户定义的角色

您可以使用 db.dropRole() 方法删除不必要的角色。

要删除角色,只需将角色名称传递给方法即可。

db.dropRole()

该角色将从系统中删除,并且该角色授予用户的任何权限将不再可访问。

结论

在本文中,我们介绍了 MongoDB 如何实现访问控制和权限管理的很多方面。我们了解了该系统的概念基础,看到了管理员可用于管理的角色、操作和资源,然后了解了如何使用角色系统来配置整个系统的授权。

这些技能对于为用户提供完成其所需任务所需的资源访问权限,同时限制对系统无关部分的访问是必要的。了解如何定义和利用角色可以提高您对管理的 MongoDB 系统提供细粒度访问控制的能力。

常见问题解答

MongoDB 中有两个内置角色用于只读用户。用户可以被分配到 read 角色或 readAnyDatabase 角色。

read 允许读取所有非系统集合中的数据。

readAnyDatabase 提供与 read 相同的功能,但它还允许在整个集群中使用 listDatabases 操作。

clusterMonitor 角色提供对监控工具(如 MongoDB 云管理器和 Ops Manager 监控代理)的只读访问权限。

backup 角色提供备份数据所需的最小权限。此角色提供足够的权限来使用 MongoDB 云和 Ops Manager 备份代理。

它还具有对 adminsettingsconfig 数据库中的备份集合运行 insertupdate 操作的权限。

MongoDB 中的 root 角色提供对以下所有角色的操作和资源的访问权限。

  • readWriteAnyDatabase
  • dbAdminAnyDatabase
  • userAdminAnyDatabase
  • clusterAdmin
  • restore
  • backup

MongoDB 使用 RBAC 来控制对 MongoDB 系统的访问。RBAC 是一种安全策略,它根据用户分配的角色限制允许用户执行的操作。

如果用户没有分配的角色,MongoDB 不允许操作或访问数据库。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直撰写有关数据库、Linux、基础设施和开发人员工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一件好事。