利用MongoDB的内置认证和授权方法

410 阅读4分钟

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

认证

MongoDB具有多种机制,允许你对用户进行认证,默认机制是其盐化挑战响应认证机制(SCRAM)。SCRAM涉及MongoDB读取和验证用户提交的凭证与他们的用户名、密码和认证数据库的组合,所有这些都是由给定的MongoDB实例所知道。如果用户的任何凭证与Mongo数据库所期望的不一致,数据库将不会对用户进行认证,他们将无法获得访问权,直到他们出示正确的用户名、密码和认证数据库。

你也可以使用一个文本文件作为一组连接的MongoDB实例的共享密码,比如一个副本集或分片集群。这种方法被称为_密钥文件认证_,被认为是一种最基本的安全形式,最适合于测试或开发环境,正如MongoDB文档所建议的。

对于实施分片或复制的生产环境,MongoDB文档建议使用另一种认证机制:x.509认证。这涉及到分发有效的x.509证书--要么是自签的,要么是从第三方证书机构获得的--到预定的集群成员或客户端。不过,这与密钥文件不同,每台机器都有自己的专用x.509证书。这意味着,一台机器的证书只对认证该机器有用。一个向数据库服务器出示偷来的x.509证书的客户将不能进行认证。

x.509认证利用了一个被称为_相互认证_的概念。这意味着当一个客户或集群成员向服务器认证时,服务器也同样向客户或集群成员认证。如果客户或集群成员试图连接到具有无效的x.509证书的数据库服务器,它将被阻止这样做,因为相互认证将失败。

授权

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

MongoDB有许多内置的角色,提供常用的权限。其中有几个是每个数据库都可以使用的,但大多数只适用于admin 数据库,因为它们的目的是提供强大的管理权限。例如,你可以在任何数据库上给一个用户分配readWrite 角色,这意味着只要你给一个用户授予readWrite 角色,你就可以读取和修改你系统中任何数据库中的数据。然而,readWriteAnyDatabase 角色--它允许用户读取和修改除localconfig 以外的任何数据库的数据--只在admin 数据库中可用,因为它提供了更广泛的系统权限。

除了内置的角色,Mongo还允许你定义自定义的角色,让你更多地控制用户可以在系统上访问哪些资源。像用户一样,角色是在一个特定的数据库中添加的。除了在admin 数据库中创建的角色可以包括对系统中任何数据库的权限外,用户定义的角色的权限只适用于创建该角色的数据库。也就是说,一个角色可以在其定义中包括一个或多个现有的角色,而且一个角色可以继承同一数据库中其他角色的权限。

有了这种对用户权限的细粒度控制,你可以设置专门的用户来执行某些功能,比如集群管理员来管理复制集和分片集群,或者用户管理员来创建和管理用户和自定义角色。这种类型的用户管理策略也可以帮助加强系统的安全性,因为它减少了拥有广泛权限的用户数量。

相关资源