用于自管理部署的 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 服务器添加前缀 如果连接字符串指定 如果您的连接字符串指定了 | 是 | |
是 | ||
MongoDB Server 在连接到 LDAP 服务器并在其上执行操作和查询时绑定的身份。 与 指定的用户必须具有相应的特权才能支持从配置的 | 是 | |
使用 | 是 | |
用于指定 默认值为 | 否,除非使用 | |
不,除非将 | ||
Windows 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
数据库上的角色,并且由于不存在匹配的角色,因此不会向用户授予任何其他权限。