LDAP 授权
MongoDB 企业版支持向 LDAP 服务器查询经过身份验证的用户所属的 LDAP 组。MongoDB 将每个返回组的可分辨名称 (DN) 映射到数据库中的角色admin
。MongoDB 根据映射的角色及其相关权限对用户进行授权。看 LDAP 授权了解更多信息。
LDAP 授权过程总结如下:
客户端连接到 MongoDB 并使用任何 身份验证机制 执行身份验证支持外部认证。
要对身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,
$external
用户名不能超过 10k 字节。MongoDB 使用 security.ldap.bind.queryUser 和 security.ldap.bind.queryPassword 指定的凭据绑定到 security.ldap.servers 指定的 LDAP 服务器。
MongoDB 默认使用简单绑定,但如果在 security.ldap.bind.method 和security.ldap.bind.saslMechanisms 中配置,则可以使用 sasl 绑定。
MongoDB 使用 security.ldap.authz.queryTemplate 构造一个 LDAP 查询,并查询 LDAP 服务器以获取经过身份验证的用户的组成员身份。
MongoDB 可以使用 security.ldap.userToDNMapping 选项转换用户名以支持查询模板。
LDAP 服务器评估查询并返回经过身份验证的用户所属的组列表。
MongoDB 通过将每个返回组的专有名称 (DN) 映射到数据库中的角色来授权用户在服务器上执行操作
admin
。如果返回的组 DN 与数据库中现有角色的名称完全匹配admin
,则 MongoDB 会授予用户分配给该角色的角色和权限。看 用于 LDAP 授权的 MongoDB 角色了解更多信息。客户端可以在 MongoDB 服务器上执行操作,这些操作需要授予经过身份验证的用户的角色或权限。
在 定义的时间间隔内
ldapUserCacheInvalidationInterval
,MongoDB 刷新$external
缓存。在执行外部授权用户执行的后续操作之前,MongoDB 会从 LDAP 服务器重新获取他们的组成员身份。
注意事项
LDAP 的完整描述超出了本文档的范围。本页假定您事先了解 LDAP。
本文档仅描述 MongoDB LDAP 授权,并不替代 LDAP 上的其他资源。我们鼓励您在配置 LDAP 身份验证之前彻底熟悉 LDAP 及其相关主题。
MongoDB 可以提供专业的服务为您的 MongoDB 部署优化 LDAP 授权配置。
兼容的认证机制
MongoDB 支持使用以下身份验证方法进行 LDAP 授权:
通过此配置,MongoDB 使用 LDAP、X.509 或 Kerberos 授权来验证客户端连接。
连接池
从4.2.0版本开始,在连接LDAP服务器进行认证/授权时,MongoDB默认:
- 如果运行则使用连接池:
- 在 Windows 或
- 在 Linux 上,其中 MongoDB Enterprise 二进制文件与libldap_r链接 。
- 如果运行则不使用连接池:
要更改连接池行为,请更新 ldapUseConnectionPool
参数。
libldap
和libldap_r
对于链接的 MongoDB 4.2 Enterprise 二进制文件 libldap
(例如在 RHEL 上运行时),对 的访问 libldap
是同步的,会产生一些性能/延迟成本。
对于链接到 的 MongoDB 4.2 Enterprise 二进制文件 libldap_r
,与早期 MongoDB 版本相比,行为没有变化。
用户管理
通过 LDAP 授权,用户创建和管理发生在 LDAP 服务器上。MongoDB 需要在数据库上创建角色admin
,每个角色的名称与 LDAP 组专有名称 (DN) 完全匹配。这与 MongoDB 托管授权形成对比,后者需要在$external
数据库上创建用户。
要管理 MongoDB 服务器上的角色,请以其组成员身份对应于具有角色管理权限的数据库角色的用户身份进行身份验证admin
,例如userAdmin
. 创建或更新与 LDAP 组 DN 相对应的角色,以便具有该组成员资格的用户获得适当的角色和权限。
例如,数据库管理员的 LDAP 组可能具有具有管理角色和权限的角色。用于营销或分析用户的 LDAP 组可能具有对某些数据库仅具有读取权限的角色。
重要的:
为相应的 LDAP 组配置角色时,请记住所有 具有该组成员资格的用户都可以获得配置的角色和权限。在配置 MongoDB 角色、LDAP 组或组成员身份时考虑应用最小权限原则。
如果不存在具有角色管理权限的角色并且不存在具有这些权限的非$external
用户,则您实际上无法执行用户管理,因为无法更改新的或现有的角色以反映对 LDAP 服务器上的组或组成员身份的添加或更改。
要解决无法在 MongoDB 服务器上管理角色的情况,请执行以下过程:
- 在没有身份验证和 LDAP 授权的情况下重启 MongoDB 服务器
- 在数据库上创建一个角色
admin
,其名称对应于适当的 LDAP 组专有名称。选择组 DN 时,请考虑哪个组最适合数据库管理。 - 使用身份验证和 LDAP 授权重新启动 MongoDB 服务器
- 作为具有与创建的管理角色相对应的组成员身份的用户进行身份验证。
现有用户
使用 LDAP 进行授权的 MongoDB 服务器使 $external
数据库上的任何现有用户都无法访问。如果数据库中存在现有用户 $external
,则必须对数据库中的每个用户满足以下要求,$external
以确保继续访问:
- 用户在 LDAP 服务器上有对应的用户对象
- 用户对象在适当的 LDAP 组中具有成员资格
- MongoDB 在以用户的 LDAP 组命名的数据库上具有角色
admin
,因此授予的角色和权限与授予非用户的相同$external
。
如果您想继续允许不在数据库上 的用户访问$external
,请确保 authenticationMechanisms
参数包括 SCRAM-SHA-1
和/或SCRAM-SHA-256
适当。或者,应用上面列出的要求将这些用户转换为 LDAP 授权
副本集
对于副本集,在配置 主要成员之前,先在次要成员和仲裁成员上配置 LDAP 授权 。这也适用于分片副本集或配置服务器副本集。一次配置一个副本集成员以维护大多数成员的写入可用性。
分片集群
在分片集群中,您必须在配置服务器上为集群级用户配置 LDAP 授权。您可以选择为分片本地用户在每个分片上配置 LDAP 授权 。
配置
您必须配置以下设置才能使用 LDAP 授权:
要通过操作系统库使用 LDAP 进行授权,请将以下设置指定为您的mongod
或mongos
配置文件的一部分:
选项 | 描述 | 必需的 |
---|---|---|
security.ldap.servers |
以引号括起来的逗号分隔的 LDAP 服务器列表格式host[:port] 。 |
是的 |
security.ldap.authz.queryTemplate |
一个RFC4515和RFC4516MongoDB 执行的 LDAP 格式查询 URL 模板,用于获取用户所属的 LDAP 组。查询是相对于 中指定的一个或多个主机的servers 。您可以在模板中使用以下标记:{USER} 将经过身份验证的用户名或 transformed 用户名替换到 LDAP 查询中。{PROVIDED_USER} 将提供的用户名(即在身份验证或 LDAP 转换之前)替换为 LDAP 查询。(从 4.2 版开始可用)仅mongod 支持该参数。mongos 遵从在其配置服务器上配置的此设置 |
是的 |
security.ldap.bind.queryUser |
MongoDB 服务器在连接到 LDAP 服务器并在其上执行操作和查询时绑定的身份。与 一起使用queryPassword 。指定的用户必须具有适当的权限以支持从配置的 queryTemplate . |
是的 |
security.ldap.bind.queryPassword |
使用 时用于绑定到 LDAP 服务器的密码 queryUser 。 |
是的 |
security.ldap.bind.method |
mongod 用于指定或mongos 用于验证或绑定到 LDAP 服务器的方法。指定sasl 使用 中定义的 SASL 协议之一 security.ldap.bind.saslMechanisms 。默认为simple . |
否,除非用于sasl 绑定到 LDAP 服务器。 |
security.ldap.bind.saslMechanisms |
用于指定 SASL 机制mongod ,或者 mongos 可以在验证或绑定到 LDAP 服务器时使用。MongoDB 和 LDAP 服务器必须就至少一种 SASL 机制达成一致。默认为DIGEST-MD5 . |
否,除非设置method 为 sasl ,并且您需要不同的或额外的 SASL 机制。 |
security.ldap.bind.useOSDefaults |
Windows MongoDB 部署可以使用操作系统凭据代替queryUser 连接 queryPassword 到 LDAP 服务器时进行身份验证或绑定。 |
不,除非替换queryUser and queryPassword 。 |
security.ldap.userToDNMapping |
根据您的queryTemplate ,经过身份验证的客户端用户名可能需要转换以支持 LDAP 查询 URL。 userToDNMapping 允许 MongoDB 转换传入的用户名。 |
否,除非客户端用户名需要转换为 LDAP DN。 |
配置 LDAP 授权后,重新启动mongod
或 mongos
. 服务器现在使用 X.509、Kerberos 或 LDAP 的 LDAP 授权来验证客户端连接。
LDAP 查询模板
MongoDB 使用security.ldap.authz.queryTemplate
创建一个 RFC4516格式化的 LDAP 查询 URL。在模板中,您可以使用:
{USER}
占位符,用于将经过身份验证的用户名替换为 LDAP 查询 URL。如果 MongoDB 使用 转换用户名userToDNMapping
,MongoDB{USER}
在构造 LDAP 查询 URL 时用转换后的用户名替换令牌。{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 授权连接到 MongoDB 服务器
使用 LDAP 进行授权时,用户通过 mongosh
必须:
放
--authenticationDatabase
到$external
。放
--authenticationMechanism
到适当的身份验证机制。如果使用LDAP 身份验证,请将其设置为
PLAIN
。如果使用Kerberos 身份验证,请将其设置为
GSSAPI
。如果使用x.509,请将其设置为
MONGODB-X.509
。放
--username
到尊重security.ldap.authz.queryTemplate
或任何配置security.ldap.userToDNMapping
模板的用户名。放
--password
到适当的密码。
包括--host
和--port
MongoDB 服务器的配置,以及与您的部署相关的任何其他选项。
例如,以下操作向使用 LDAP 身份验证和授权运行的 MongoDB 服务器进行身份验证:
mongosh --username alice@dba.example.com --password --authenticationDatabase '$external' --authenticationMechanism "PLAIN" --host "mongodb.example.com" --port 27017
如果您不指定密码--password
命令行选项,mongosh
提示输入密码。
重要的:
参数
$external
必须放在单引号中,而不是双引号中,以防止 shell 解释$external
为变量。
用于 LDAP 授权的 MongoDB 角色
MongoDB 将 LDAP 返回的每个返回组专有名称 (DN) 映射到数据库中的query
一个 角色admin
。
如果 MongoDB 获得一个组,其 DN与现有角色的名称 完全匹配,MongoDB 将授予经过身份验证的用户角色和与该角色关联的权限。如果 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" } ] }
alice@dba.example.com
根据数据库对 用户进行身份验证后$external
,MongoDB 服务器执行从配置中派生的查询query template
,以检索包含经过身份验证的用户作为成员的组。在此示例中,MongoDB 服务器为用户检索以下组 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 服务器使用查询模板中提供的用户名重复查询过程。在此示例中,MongoDB 服务器为用户检索以下组 DN:dn:cn=analytics,CN=Users,dc=example,dc=com
MongoDB 将这些组 DN 映射到数据库中的角色
admin
,并授予经过身份验证的用户第二个角色的角色和特权。新用户
workstation@guest.example.com
对$external
数据库进行身份验证。MongoDB 服务器使用查询模板中提供的用户名重复查询过程。在此示例中,MongoDB 服务器为用户检索以下组 DN:dn:cn=guest,CN=Users,dc=example,dc=com
MongoDB 将组映射到
admin
数据库中的一个角色,并且由于不存在匹配的角色,因此不会授予用户额外的权限。
译者:韩鹏帅