Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

用于自管理部署的 LDAP 授权

在此页面上

  • Considerations
  • 配置
  • Tutorials
  • 使用 LDAP 授权连接到 MongoDB 服务器
  • 针对 LDAP 授权的 MongoDB 角色

注意

从MongoDB 8.0开始, LDAP身份验证和授权已弃用。 LDAP可用并将在MongoDB 8的整个生命周期内继续运行而不进行更改。 LDAP将在未来的主要发布中删除。

有关详细信息,请参阅 LDAP 弃用。

MongoDB Enterprise 支持在 LDAP 服务器上查询身份已验证用户所属的 LDAP 组群。MongoDB 会将每个返回组群的标识名(DN)映射到 admin 数据库的角色。MongoDB 会根据映射的角色及其关联的特权对用户进行授权。更多信息,请参阅 LDAP 授权

LDAP 授权过程总结如下:

  1. 客户端连接到 MongoDB,并使用任何支持外部身份验证身份验证机制进行身份验证。

    要对 $external 身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 10k 字节。

  2. MongoDB 会使用 security.ldap.bind.queryUsersecurity.ldap.bind.queryPassword 指定的档案绑定到 security.ldap.servers 指定的 LDAP 服务器。

    MongoDB 默认使用简单绑定,但如果在 security.ldap.bind.methodsecurity.ldap.bind.saslMechanisms 中进行了配置,则可以使用 sasl 绑定。

  3. MongoDB 使用 security.ldap.authz.queryTemplate 构造 LDAP 查询,并在 LDAP 服务器中查询经过身份验证的用户的群组成员身份。

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

  4. LDAP 服务器会对查询进行评估,并返回已通过身份验证的用户所属的群组列表。

  5. MongoDB 通过将每个返回群组的标识名 (DN) 映射到cadmin 数据库上的一个角色来授权用户在服务器上执行操作。如果返回的群组 DN 与 admin 数据库上现有角色的名称精确匹配,MongoDB 会向用户授予分配给该角色的角色和特权。请参阅针对 LDAP 授权的 MongoDB 角色,了解更多信息。。

  6. 客户端可以在 MongoDB Server 上执行需要授予经过身份验证的用户的角色或特权的操作。

  7. MongoDB 按照 ldapUserCacheInvalidationInterval 定义的时间间隔刷新 $external 缓存。在执行外部授权用户执行的后续操作之前,MongoDB 会从 LDAP 服务器重新获取他们的群组成员身份。

对 LDAP 的完整描述已超出本文档的范围。本页假定您已了解 LDAP。

本文档仅介绍 MongoDB LDAP 授权,而不会替代有关 LDAP 的其他资源。我们鼓励您在配置 LDAP 身份验证之前透彻了解 LDAP 及其相关主题。

MongoDB 可以提供专业服务,为您的 MongoDB 部署提供最佳的 LDAP 授权配置。

MongoDB 支持使用以下身份验证方法进行 LDAP 授权:

通过此配置,MongoDB 使用 LDAP、X.509 或 Kerberos 授权来对客户端连接进行身份验证。

连接到 LDAP 服务器进行身份验证/授权时,MongoDB 默认:

  • 如果在以下平台上运行,则使用连接池化:

    • 在 Windows 平台上或

    • 在 Linux 上,其中 MongoDB Enterprise 二进制文件与 libldap_r 相关联。

  • 如果在以下平台上运行,则不使用连接池化:

    • 在 Linux 上运行时,MongoDB Enterprise 二进制文件与 libldap 相关联。

如需更改连接池行为,请更新 ldapUseConnectionPool 参数。

对于与 libldap 链接的 MongoDB 4.2 企业版二进制文件(例如在 RHEL 上运行时),对 libldap 的访问是同步进行的,会产生一些性能/延迟成本。

对于链接到 libldap_r MongoDB 4.2 Enterprise 二进制文件,与早期 MongoDB 版本相比,行为没有变化。

通过 LDAP 授权,可在 LDAP 服务器上创建和管理用户。MongoDB 需要在 admin 数据库上创建角色,每个角色的名称与 LDAP 组的标识名 (DN) 完全匹配。这与 MongoDB 托管授权形成鲜明对比,后者需要在 $external 数据库上创建用户。

要管理 MongoDB Server 上的角色,请以具有角色管理特权(例如 userAdmin 提供的特权)且对应于 admin 数据库角色的群组用户进行身份验证。创建或更新与 LDAP 群组专有满城对应的角色,以便具有该群组成员资格的用户接收适当的角色和特权。

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

重要

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

如果不存在具有角色管理特权的角色,并且不存在具有这些权限的非 $external 用户,那么您实际上无法执行用户管理,因为无法通过更改新角色或现有角色来反映 LDAP 服务器上群组或群组成员的添加或更改。

要解决无法管理 MongoDB server 上角色的情况,请执行以下步骤:

  1. 在没有身份验证和 LDAP 授权的情况下重新启动 MongoDB Server

  2. admin 数据库上创建一个角色,其名称与相应的 LDAP 组的标识名相对应。选择组标识名时,请考虑哪个组最适合数据库管理。

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

  4. 以具有特定组成员身份的用户身份进行身份验证,该组成员身份与所创建的管理角色相对应。

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

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

  • 用户对象在相应 LDAP 群组中具有成员资格

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

如果要继续允许$external 数据库中的用户进行访问,请确保 authenticationMechanisms 参数根据情况包括 SCRAM-SHA-1 和/或 SCRAM-SHA-256。或者,应用上面列出的要求将这些用户转换到 LDAP 授权。

对于副本集,先对辅助节点仲裁节点成员配置 LDAP 授权,然后再配置主节点。这也适用于分片副本集配置服务器副本集。一次配置一个副本集成员可维持大多数成员的写入可用性。

分片集群中,您必须在配置服务器上为集群级用户配置 LDAP 授权。您可以选择在每个分片上为分片本地用户配置 LDAP 授权。

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

要通过操作系统库使用 LDAP 进行授权,请在 mongodmongos 配置文件中指定以下设置:

选项
说明
必需

引号括起来的逗号分隔的 LDAP 服务器列表,格式为 host[:port]

您可以为 LDAP 服务器添加前缀 srv:srv_raw:

如果连接字符串指定 "srv:<DNS_NAME>",则 mongod 将验证 "_ldap._tcp.gc._msdcs.<DNS_NAME>" 是否存在,以使 SRV 支持 Active Directory。如果未找到,mongod 将验证 SRV 是否存在 "_ldap._tcp.<DNS_NAME>"。如果找不到 SRV 记录,则 mongod 会警告您用 "srv_raw:<DNS_NAME>" 代替。

如果您的连接字符串指定了 "srv_raw:<DNS_NAME>"mongod 会对 "<DNS NAME>" 执行 SRV 记录查询。

RFC4515 RFC4516 MongoDB 执行的 LDAP 格式查询 URL 模板,用于获取用户所属的 LDAP 群组。查询相对于servers中指定的一个或多个主机。

您可以在模板中使用以下令牌:

  • {USER}
    在 LDAP 查询中使用经过身份验证的用户名或 transformed 用户名进行替换。
  • {PROVIDED_USER}
    在 LDAP 查询中替换为提供的用户名(即在身份验证或 LDAP 转换之前)。

只有 mongod 支持该参数。mongos 按照其配置服务器上的配置,进行此设置

MongoDB Server 在连接到 LDAP 服务器并在其上执行操作和查询时绑定的身份。

queryPassword 一起使用。

指定的用户必须具有相应的特权才能支持从配置的 queryTemplate 生成的 LDAP 查询。

使用 queryUser 时用于绑定到 LDAP 服务器的密码。

用于指定 mongodmongos 用于身份验证或绑定到 LDAP 服务器的方法。指定 sasl 以使用在 security.ldap.bind.saslMechanisms 中定义的 SASL 协议之一。

默认值为 simple

,除非使用 sasl 绑定到 LDAP 服务器。

用于指定在验证或绑定 LDAP 服务器时可以使用的 SASL 机制 mongodmongos。MongoDB 和 LDAP 服务器必须就至少一种 SASL 机制达成一致。

默认值为 DIGEST-MD5

,除非将 method 设置为 sasl,而且您需要不同的或额外的 SASL 机制。

Windows MongoDB 部署可以使用操作系统档案代替 queryUserqueryPassword 进行身份验证或绑定,就像连接 LDAP 服务器时一样。

,除非替换 queryUserqueryPassword

根据 queryTemplate,经过身份验证的客户端用户名可能需要转换才能支持 LDAP 查询 URL。userToDNMapping 允许 MongoDB 转换传入的用户名。

NO,除非客户端用户名需要转换为 LDAP DN。

配置 LDAP 授权后,重新启动 mongodmongos。服务器现在使用 LDAP 授权通过 X.509、Kerberos 或 LDAP 对客户端连接进行身份验证。

MongoDB 使用 security.ldap.authz.queryTemplate 创建 RFC4516 格式的 LDAP 查询 URL。在模板中,您可以使用以下任一项:

  • {USER} 占位符,用于将通过身份验证的用户名替换到 LDAP 查询 URL 中。如果 MongoDB 使用 userToDNMapping 转换了用户名,则在构造 LDAP 查询 URL 时,MongoDB 会将 {USER} 令牌替换为转换后的用户名。

  • {PROVIDED_USER} 占位符可在 LDAP 查询中替换为提供的用户名(即在身份验证或 LDAP 转换之前)。

设计查询模板以检索用户的群组。

例子

以下查询模板返回 LDAP 用户对象的 memberOf 属性中列出的所有群组。此查询假定存在 memberOf 属性 - 您的特定 LDAP 部署可能使用不同的属性或方法来跟踪群组成员身份。此查询还假设用户使用其完整 LDAP DN 作为用户名进行身份验证。

"{USER}?memberOf?base"

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

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

考虑每个组件的定义(如 RFC4516 中所引用):

dn是一个 LDAP 标识名,使用 RFC4514 中描述的字符串格式。它标识 LDAP 搜索的基本对象或非搜索操作的目标。

attributes 结构用于指示应从一个或多个条目返回哪些属性。

scope 构造指定要在给定 LDAP 服务器中执行的搜索范围。允许的范围包括:base(针对基本对象搜索)、one(针对一级搜索)或 sub(针对子树搜索)。

filter 用于指定搜索过滤器,以在搜索期间应用于指定范围内的条目。它的格式在 [RFC4515] 中指定。

extensions 构造为 LDAP URL 提供了可扩展性机制,允许将来扩展该 URL 的功能。

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

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

MongoDB 当前会忽略 LDAP 查询中指定的任何扩展名。

重要

RFC4516 或 LDAP 查询 URL 结构的完整描述超出了本文档的范围。

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

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

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

例如,以下操作对使用 LDAP 身份验证和授权运行的 MongoDB Server 进行身份验证:

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

如果您没有为 --password 命令行选项指定密码,mongosh 会提示输入密码。

重要

$external 参数必须放在单引号中,而非双引号中,防止 shell 将 $external 解释为变量。

MongoDB 将 LDAP query 返回的每个返回群组专有名称 (DN) 映射到 admin 数据库上的一个角色

如果 MongoDB 获取的群组 DN 与现有角色的名称精确匹配,则 MongoDB 会授予经过身份验证的用户角色和与该现有角色关联的特权。MongoDB 如果无法将任何返回的群组映射到角色,则不会向该用户授予任何特权。

注意

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

重要

如果使用 LDAP 进行授权,且 LDAP 组 DN 包含 RFC4514 转义序列,则在 admin 数据库中创建的角色也必须按照 RFC4514 转义。

例子

数据库在 admin 数据库上配置了以下角色:

{
role: "CN=dba,CN=Users,DC=example,DC=com",
privileges: [],
roles: [ "dbAdminAnyDatabase", "clusterAdmin" ]
}
{
role: "CN=analytics,CN=Users,DC=example,DC=com"
privileges: [],
roles: [
{ role : "read", db : "web_statistics" },
{ role : "read", db : "user_statistics" }
]
}

根据 $external 数据库对用户 alice@dba.example.com 进行身份验证后,MongoDB Server 执行从配置的 query template 派生的查询,以检索包含经过身份验证的用户作为成员的群组。在此示例中,MongoDB Server 将检索用户的以下群组 DN:

dn:CN=dba,CN=Users,dc=example,dc=com
dn:CN=admin,CN=Users,dc=example,dc=com

MongoDB 将这些组 DN 映射到 admin 数据库上的角色。第一个组 DN 与第一个角色匹配,MongoDB 向通过身份验证的用户授予其角色和特权。第二组 DN 与服务器上的任何角色都不匹配,因此 MongoDB 不会授予其他权限。

新用户 bob@analytics.example.com 根据 $external 数据库进行身份验证。MongoDB Server 使用查询模板中提供的用户名重复查询过程。在此示例中,MongoDB Server 将检索用户的以下组 DN:

dn:cn=analytics,CN=Users,dc=example,dc=com

MongoDB 将这些组 DN 映射到 admin 数据库上的角色,并向经过身份验证的用户授予这些角色以及第二个角色的特权。

新用户 workstation@guest.example.com 根据 $external 数据库进行身份验证。MongoDB Server 使用查询模板中提供的用户名重复查询过程。在此示例中,MongoDB Server 将检索用户的以下组 DN:

dn:cn=guest,CN=Users,dc=example,dc=com

MongoDB 将群组映射到 admin 数据库上的角色,并且由于不存在匹配的角色,因此不会向用户授予任何其他权限。

后退

集合级别访问权限