利用 MongoDB 的内置身份验证和授权方法


该系列的一部分:
MongoDB 安全性:确保数据安全的最佳实践

MongoDB,也称为Mongo,是许多现代 Web 应用程序中使用的文档数据库。与任何数据库管理系统一样,负责管理 Mongo 数据库的人员必须遵守推荐的安全最佳实践,以防止数据在发生灾难时丢失并防止其落入恶意行为者之手。

本系列概念文章对 MongoDB 的内置安全功能进行了高级概述,同时还重点介绍了一些通用的数据库安全最佳实践。

授权和身份验证是两个对于理解数据库安全性至关重要的概念。这两个概念很相似,但重要的是要了解它们是什么以及是什么使它们不同。身份验证是确认用户或客户是否真实身份的过程。另一方面,授权涉及为给定用户或用户组设置规则,以定义他们可以执行哪些操作以及他们可以访问哪些资源。

验证

MongoDB 具有多种允许您对用户进行身份验证的机制,默认机制是它的Salted Challenge Response Authentication Mechanism (SCRAM)。SCRAM 涉及 MongoDB 读取和验证用户根据用户名、密码和身份验证数据库的组合提供的凭据,所有这些都为给定的 MongoDB 实例所知。如果任何用户的凭据与 Mongo 数据库所期望的不匹配,数据库将不会对用户进行身份验证,并且在他们提供正确的用户名、密码和身份验证数据库之前,他们将无法获得访问权限。

您还可以使用文本文件作为一组连接的 MongoDB 实例(例如副本集或分片集群)的共享密码。这种方法称为keyfile authentication,被认为是一种最低限度的安全形式,最适合测试或开发环境,如 MongoDB 文档所建议的那样。

对于实现分片或复制的生产环境,MongoDB 文档建议使用另一种身份验证机制:x.509 身份验证这涉及将有效的 x.509 证书(自签名或从第三方证书颁发机构获得)分发给预期的集群成员或客户端。但是,它们与密钥文件不同,因为每台机器都有自己专用的 x.509 证书。这意味着一台机器的证书仅用于验证该机器。向数据库服务器提供被盗 x.509 证书的客户端将无法进行身份验证。

x.509 身份验证利用了一个称为相互身份验证的概念这意味着当客户端或集群成员向服务器验证自己时,服务器同样向客户端或集群成员验证自己。如果客户端或集群成员尝试使用无效的 x.509 证书连接到数据库服务器,则会阻止这样做,因为相互身份验证将失败。

授权

MongoDB 通过称为基于角色的访问控制的计算机安全概念来管理授权每当您创建 MongoDB 用户时,您都可以选择为他们提供一个或多个角色角色定义用户拥有哪些权限,包括他们可以对给定的数据库、集合、集合集或集群执行哪些操作。当您为用户分配角色时,该用户将获得该角色的所有权限。

MongoDB 附带了许多提供常用权限的内置角色。其中一些可用于每个数据库,但大多数仅可用于admin数据库,因为它们旨在提供强大的管理权限。例如,您可以为用户分配readWrite任何数据库上角色,这意味着您可以读取和修改系统上任何数据库中保存的数据,只要您授予用户对其的readWrite角色即可。但是,该readWriteAnyDatabase角色(允许用户读取和修改除localand之外的任何数据库上的数据config)仅在admin数据库中可用,因为它提供了更广泛的系统权限。

除了内置角色,Mongo 还允许您定义自定义角色,让您更好地控制用户可以访问系统上的资源。与用户一样,角色被添加到特定的数据库中。除了在admin数据库中创建的角色(可以包括对系统中任何数据库的权限)之外,用户定义的角色的权限仅适用于创建该角色的数据库。话虽如此,一个角色可以在其定义中包含一个或多个现有角色,并且一个角色可以从同一数据库中的其他角色继承权限。

通过对用户权限的这种细粒度控制,您可以设置专用用户来执行某些功能,例如管理副本集和分片集群的集群管理员或创建和管理用户和自定义角色的用户管理员。这种类型的用户管理策略还有助于加强系统的安全性,因为它减少了具有广泛权限的用户数量。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁