用于自管理部署的 LDAP 授权
注意
从MongoDB 8.0开始, LDAP身份验证和授权已弃用。 LDAP可用并将在MongoDB 8的整个生命周期内继续运行而不进行更改。 LDAP将在未来的主要发布中删除。
有关详细信息,请参阅 LDAP 弃用。
MongoDB Enterprise 支持在 LDAP 服务器上查询身份已验证用户所属的 LDAP 组群。MongoDB 会将每个返回组群的标识名(DN)映射到 admin
数据库的角色。MongoDB 会根据映射的角色及其关联的特权对用户进行授权。更多信息,请参阅 LDAP 授权。
LDAP 授权过程总结如下:
客户端连接到 MongoDB,并使用任何支持外部身份验证的身份验证机制进行身份验证。
要对
$external
身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,用户名不能大于 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) 映射到c
admin
数据库上的一个角色来授权用户在服务器上执行操作。如果返回的群组 DN 与admin
数据库上现有角色的名称精确匹配,MongoDB 会向用户授予分配给该角色的角色和特权。请参阅针对 LDAP 授权的 MongoDB 角色,了解更多信息。。客户端可以在 MongoDB Server 上执行需要授予经过身份验证的用户的角色或特权的操作。
MongoDB 按照
ldapUserCacheInvalidationInterval
定义的时间间隔刷新$external
缓存。在执行外部授权用户执行的后续操作之前,MongoDB 会从 LDAP 服务器重新获取他们的群组成员身份。
Considerations
对 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
和 libldap_r
对于与 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 上角色的情况,请执行以下步骤:
在没有身份验证和 LDAP 授权的情况下重新启动 MongoDB Server
在
admin
数据库上创建一个角色,其名称与相应的 LDAP 组的标识名相对应。选择组标识名时,请考虑哪个组最适合数据库管理。使用身份验证和 LDAP 授权重新启动 MongoDB 服务器
以具有特定组成员身份的用户身份进行身份验证,该组成员身份与所创建的管理角色相对应。
现有用户
使用 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 服务器列表,格式为 您可以为 LDAP 服务器添加前缀 如果连接字符串指定 如果您的连接字符串指定了 | 是 | |
RFC4515 和 RFC4516 MongoDB 执行的 LDAP 格式查询 URL 模板,用于获取用户所属的 LDAP 群组。查询相对于 您可以在模板中使用以下令牌:
| 是 | |
MongoDB Server 在连接到 LDAP 服务器并在其上执行操作和查询时绑定的身份。 与 指定的用户必须具有相应的特权才能支持从配置的 | 是 | |
使用 queryUser 时用于绑定到 LDAP 服务器的密码。 | 是 | |
用于指定 默认值为 | 否,除非使用 sasl 绑定到 LDAP 服务器。 | |
不,除非将 method 设置为 sasl ,而且您需要不同的或额外的 SASL 机制。 | ||
Windows MongoDB 部署可以使用操作系统档案代替 queryUser 和 queryPassword 进行身份验证或绑定,就像连接 LDAP 服务器时一样。 | 否,除非替换 queryUser 和 queryPassword 。 | |
根据 queryTemplate ,经过身份验证的客户端用户名可能需要转换才能支持 LDAP 查询 URL。userToDNMapping 允许 MongoDB 转换传入的用户名。 | NO,除非客户端用户名需要转换为 LDAP DN。 |
配置 LDAP 授权后,重新启动 mongod
或 mongos
。服务器现在使用 LDAP 授权通过 X.509、Kerberos 或 LDAP 对客户端连接进行身份验证。
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 结构的完整描述超出了本文档的范围。
Tutorials
以下教程包含通过操作系统 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
设置为适当的密码。
包括 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
解释为变量。
针对 LDAP 授权的 MongoDB 角色
MongoDB 将 LDAP query
返回的每个返回群组专有名称 (DN) 映射到 admin
数据库上的一个角色。
如果 MongoDB 获取的群组 DN 与现有角色的名称精确匹配,则 MongoDB 会授予经过身份验证的用户角色和与该现有角色关联的特权。MongoDB 如果无法将任何返回的群组映射到角色,则不会向该用户授予任何特权。
注意
重要
如果使用 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
数据库上的角色,并且由于不存在匹配的角色,因此不会向用户授予任何其他权限。