对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

用于自管理部署的 LDAP 授权

注意

从MongoDB 8.0 开始并在 9.0 中继续, LDAP身份验证和授权已弃用。 LDAP将在未来发布中删除。

要学习;了解其他身份验证方法,请参阅LDAP身份验证替代方法。

MongoDB Enterprise支持在LDAP服务器中查询经过身份验证的用户所属的LDAP群组。 MongoDB将每个返回群组的标识名 (DN) 映射到admin 数据库上的角色。 MongoDB根据映射的角色及其关联的权限对用户进行授权。

LDAP 授权过程总结如下:

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

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

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

    MongoDB 默认使用简单绑定,但如果在 security.ldap.bind.method 和 security.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 授权:

注意

X.509 身份验证和LDAP授权

默认下, MongoDB对使用LDAP、 Kerberos或 X.509 进行身份验证的客户端使用LDAP授权。从MongoDB 9.0 开始,要改为对经过 X.509 身份验证的客户端使用内部授权,请将 useInternalAuthzForX509 参数设立为 true。

连接到 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 进行授权,请在 mongod 或 mongos 配置文件中指定以下设置:

选项
说明
必需

引号括起来的逗号分隔的 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 记录查询。

是

由MongoDB执行的 RFC4515 和 RFC4516servers LDAP格式的查询URL模板,用于获取用户所属的LDAP群组。该查询是相对于 中指定的一台或多台托管的。

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

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

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

是

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

与 queryPassword 一起使用。

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

是

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

是

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

默认值为 simple。

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

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

默认值为 DIGEST-MD5。

重要提示:在运行 Cyrus SASL 2.1.28 或更高版本的主机上, MongoDB不支持使用 DIGEST-MD5 机制绑定LDAP SASL。

有关详细信息和替代方案,请参阅 Cyrus SASL 2.1.28 及更高版本不支持 DIGEST-MD5。

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

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

否,除非替换 queryUser 和 queryPassword。

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

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

配置LDAP授权后,重新启动 mongod 或 mongos。默认下,服务器对使用LDAP、 Kerberos或 X.509 进行身份验证的客户端使用LDAP授权。要改为对经过 X.509 身份验证的客户端使用内部授权,请将 useInternalAuthzForX509 参数设立为 true。

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 连接的用户必须:

--host包括MongoDB服务器的--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 如果无法将任何返回的群组映射到角色,则不会向该用户授予任何特权。

注意

LDAP 和 kerberos 身份验证通常需要在 $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 数据库上的角色,并且由于不存在匹配的角色,因此不会向用户授予任何其他权限。

从MongoDB 9.0 开始, MongoDB可以根据身份验证机制采用不同的授权行为。

LDAP授权不会影响经过SCRAM身份验证的客户端。 MongoDB始终对SCRAM用户使用内部授权。

useInternalAuthzForX509 参数控制对经过 X.509 身份验证的客户端的授权:

  • 如果该参数设立为 false(默认), MongoDB将使用LDAP授权。

  • 如果该参数设立为 true, MongoDB将根据用户在 $external数据库中的角色使用内部授权。

MongoDB始终对经过Kerberos和LDAP身份验证的客户端使用LDAP授权。

从MongoDB 9.0 开始, MongoDB在使用 OIDC 进行身份验证时不使用LDAP授权。 oidcIdentityProviders.useAuthorizationClaim 控制使用 OIDC 进行身份验证的客户端的授权:

  • 如果该参数设立为 true(默认), MongoDB将使用 OIDC 令牌中的授权声明。

  • 如果该参数设立为 false, MongoDB将根据用户在 $external数据库中的角色使用内部授权。