LDAP 授权

在本页面

version 3.4 中的新增内容:MongoDB 企业版支持查询经过身份验证的用户所属的 LDAP 组的 LDAP 服务器。 MongoDB _在admin数据库上将每个返回的 group 的可分辨名称(DN)映射到角色。 MongoDB 根据映射的角色及其相关权限授权用户。有关更多信息,请参见LDAP 授权

LDAP 授权进程总结如下:

更改 version 3.6.3:要与$external身份验证用户(i.e.Kerberos,LDAP,x.509 用户)使用会话,用户名不能超过 10k 字节。

MongoDB 默认使用简单的 binding,但如果在security.ldap.bind.methodsecurity.ldap.bind.saslMechanisms中配置,则可以使用sasl binding。

MongoDB 可以使用security.ldap.userToDNMapping选项转换用户名以支持查询模板。

  • LDAP 服务器评估查询并返回经过身份验证的用户所属的组列表。

  • MongoDB 授权用户通过将每个返回的 group 的 Distinguished Name(DN)映射到admin数据库上的角色来对服务器执行操作。如果返回的 group DN 与admin数据库上现有角色的 name 完全匹配,则 MongoDB 会授予用户分配给该角色的角色和权限。有关更多信息,请参见MongoDB 用于 LDAP 授权的角色

  • client 可以在 MongoDB 服务器上执行操作,这些操作需要授予经过身份验证的用户的角色或特权。

  • ldapUserCacheInvalidationInterval定义的时间间隔内,MongoDB 刷新$external缓存。在执行外部授权用户执行的后续操作之前,MongoDB re-acquires 他们的 group 成员来自 LDAP 服务器。

注意事项

LDAP 的完整描述超出了本文档的范围。本页假定事先了解 LDAP。

本文档仅介绍 MongoDB LDAP 授权,不替换 LDAP 上的其他资源。在配置 LDAP 身份验证之前,我们建议您彻底熟悉 LDAP 及其相关主题。

MongoDB 可以为 MongoDB 部署提供专业的服务以优化 LDAP 授权配置。

兼容的认证机制

以下身份验证机制与 MongoDB LDAP 授权兼容:

用户管理

通过 LDAP 授权,用户创建和 management 在 LDAP 服务器上进行。 MongoDB 需要在admin数据库上创建角色,每个角色的 name 与 LDAP group Distinguished Name(DN)完全匹配。这与 MongoDB 托管授权形成对比,后者需要在$external数据库上创建用户。

要管理 MongoDB 服务器上的角色,请以 group 成员身份对应具有角色管理权限的admin数据库角色的用户身份进行身份验证,例如userAdmin提供的权限。创建或更新与 LDAP group DN 对应的角色,以使具有该 group 成员资格的用户获得相应的角色和权限。

例如,数据库管理员的 LDAP group 可能具有管理角色和权限的角色。用于营销或分析用户的 LDAP group 可能具有仅对某些数据库具有读取权限的角色。

重要 为相应的 LDAP Group 配置角色时,请记住该 group 中具有成员身份的所有用户都可以接收配置的角色和权限。在配置 MongoDB 角色,LDAP 组或 group 成员资格时,请考虑应用最小权限原则。

如果不存在具有角色管理权限的角色且不存在具有这些权限的非$external用户,则实际上无法执行用户管理,因为不能更改新角色或现有角色以反映对 LDAP 服务器上的组或 group 成员身份的添加或更改。

要修复无法管理 MongoDB 服务器上的角色的方案,请执行以下过程:

  • 无需身份验证和 LDAP 授权即可重新启动 MongoDB 服务器

  • admin数据库上创建一个角色,其 name 对应于相应的 LDAP group Distinguished Name。选择 group DN 时,请考虑哪个 group 最适合数据库管理。

  • 使用身份验证和 LDAP 授权重新启动 MongoDB 服务器

  • 作为具有与创建的管理角色对应的 group 中的成员身份的用户进行身份验证。

现有用户

使用 LDAP 进行授权的 MongoDB 服务器使$external数据库上的任何现有用户都无法访问。如果$external数据库中存在现有用户,则必须满足$external数据库上每个用户的以下要求,以确保继续访问:

  • 用户在 LDAP 服务器上有相应的用户 object

  • 用户 object 拥有相应 LDAP 组的成员资格

  • MongoDB 在admin数据库上具有为用户的 LDAP 组命名的角色,这样授予的角色和权限与授予非$external用户的角色和权限相同。

如果要继续允许不在$external数据库上的用户访问,请确保authenticationMechanisms参数包含SCRAM-SHA-1。或者,应用上面列出的要求将这些用户转换为 LDAP 授权。

副本 Sets

对于副本 sets,在配置之前,首先在次要仲裁者成员上配置 LDAP 授权。这也适用于分片副本 sets配置服务器副本 sets。在 time 配置一个副本集成员以维护大多数成员的写入可用性。

Sharded Clusters

分片簇中,必须在配置服务器上为 cluster-level 用户配置 LDAP 授权。对于 shard-local 用户,您可以选择为每个碎片配置 LDAP 授权。

组态

您必须配置以下设置才能使用 LDAP 授权:

要通过操作系统 libraries 使用 LDAP 进行授权,请将以下设置指定为mongodmongos configuration 文件的一部分:

选项描述需要
security.ldap.serversQuote-enclosed comma-separated host[:port]格式的 LDAP 服务器列表。
security.ldap.authz.queryTemplate由 MongoDB 执行的RFC4515RFC4516 LDAP 格式的查询 URL 模板,用于获取用户所属的 LDAP 组。该查询与服务器中指定的 host 或主机相关。
使用{USER}特殊占位符将经过身份验证的用户名或改造用户名替换为 LDAP 查询。
mongod支持此参数。 mongos按照其配置服务器配置的此设置延迟
security.ldap.bind.queryUserMongoDB 服务器在连接到 LDAP 服务器上并执行操作和查询时绑定的标识。
queryPassword一起使用。
指定的用户必须具有相应的权限才能支持从配置的queryTemplate生成的 LDAP 查询。
security.ldap.bind.queryPassword使用queryUser时用于绑定到 LDAP 服务器的密码。
security.ldap.bind.method用于指定mongodmongos用于对 LDAP 服务器进行身份验证或绑定的方法。指定sasl以使用security.ldap.bind.saslMechanisms中定义的 SASL 协议之一。
默认为simple
,除非使用sasl进行 binding 到 LDAP 服务器。
security.ldap.bind.saslMechanisms用于指定_L或mongos可以在对 LDAP 服务器进行身份验证或 binding 时使用的 SASL 机制。 MongoDB 和 LDAP 服务器必须就至少一种 SASL 机制达成一致。
默认为DIGEST-MD5
NO,除非将bindMethod设置为sasl,并且您需要不同的或额外的 SASL 机制。
security.ldap.bind.useOSDefaultsWindows MongoDB 部署可以使用操作系统凭据代替queryUserqueryPassword进行身份验证或 binding,就像连接到 LDAP 服务器时一样。,除非替换queryUserqueryPassword
security.ldap.userToDNMapping根据您的queryTemplate,经过身份验证的 client 用户名可能需要转换才能支持 LDAP 查询 URL。 userToDNMapping允许 MongoDB 转换传入的用户名。,除非 client 用户名需要转换为 LDAP DN。

LDAP 查询模板

MongoDB 使用security.ldap.authz.queryTemplate创建RFC4516格式的 LDAP 查询 URL。在模板中,使用{USER}占位符将经过身份验证的用户名替换为 LDAP 查询 URL。设计查询模板以检索经过身份验证的用户的组。如果 MongoDB 使用userToDNMapping转换了用户名,MongoDB 在构造 LDAP 查询 URL 时用转换后的用户名替换{USER}标记。

"{USER}?memberOf?base"

LDAP 查询 URL 必须符合RFC4516中定义的格式:

[ dn  [ ? [attributes] [ ? [scope] [ ? [filter] [ ? [Extensions] ] ] ] ] ]

考虑每个 component 的定义,引自 RFC4516:

The ``dn`` is an LDAP Distinguished Name using the string format described
in `RFC4514 <https://tools.ietf.org/html/rfc4514>`_. It identifies the base
object of the LDAP search or the target of a non-search operation.

The ``attributes`` construct is used to indicate which attributes should be
returned from the entry or entries.

The ``scope`` construct is used to specify the scope of the search to perform
in the given LDAP server. The allowable scopes are "base" for a base object
search, "one" for a one-level search, or "sub" for a subtree search.

The ``filter`` is used to specify the search filter to apply to entries
within the specified scope during the search. It has the format specified
in [RFC4515].

The ``extensions`` construct provides the LDAP URL with an extensibility
mechanism, allowing the capabilities of the URL to be extended in the
future.

如果查询包含attribute,则 MongoDB 假定查询检索此实体所属的 DN。

如果查询不包含属性,则 MongoDB 假定查询检索用户所属的所有实体。

MongoDB 当前忽略 LDAP 查询中指定的任何 extensions。

重要 RFC4516 或 LDAP 查询 URL 构造的完整说明超出了本文档的范围。

教程

以下教程包含通过操作系统 LDAP libraries 连接到 LDAP 服务器的过程:

使用 LDAP 授权连接到 MongoDB 服务器

使用 LDAP 进行授权时,通过mongo shell 连接的用户必须:

如果使用LDAP 身份验证,请将其设置为PLAIN

如果使用Kerberos 身份验证,请将其设置为GSSAPI

如果使用x.509,请将其设置为MONGODB-X.509

包括 MongoDB 服务器的--host--port,以及与部署相关的任何其他选项。

对于 example,以下操作使用 LDAP 身份验证和授权对 MongoDB 服务器进行身份验证 running:

mongo --username alice@dba.example.com --password "secret123" --authenticationDatabase '$external' --authenticationMechanism "PLAIN"  --host "mongodb.example.com" --port 27017

重要 $external参数必须放在单引号中,而不是 double 引号,以防止 shell 将$external解释为变量。

MongoDB 用于 LDAP 授权的角色

MongoDB maps 将 LDAP query返回的 group distinguished name(DN)返回到admin数据库上的角色

如果 MongoDB 获取其 DN 现有角色的 name 匹配的 group,则 MongoDB 将授予经过身份验证的用户角色以及与该角色关联的特权。如果 MongoDB 无法将任何返回的组 map 映射到角色,则 MongoDB 不会向用户授予任何权限。

注意 LDAPKerberos身份验证通常需要在$external数据库中创建 creating 用户。如果还使用 LDAP 进行授权,则无需在$external数据库中创建用户。您只需要在admin数据库中创建适当的角色。用户仍然对$external数据库进行身份验证。

重要 如果您使用 LDAP 进行授权且 LDAP group DN 包含RFC4514 escaped sequences,则您在admin数据库中创建的角色也必须在 RFC4514 之后进行转义。

MongoDB maps group 到admin数据库上的角色,因为不存在匹配的角色,所以不授予用户额外的权限。