Docs 菜单

使用自管理 SASL 和LDAP与 OpenLDAP 进行身份验证

注意

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

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

MongoDB Enterprise 支持用户的代理身份验证。这允许管理员配置 MongoDB 集群,通过将身份验证请求代理到指定的轻量级目录访问协议 (LDAP) 服务来对用户进行身份验证。

注意

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

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

警告

MongoDB Enterprise for Windows 不支持通过 saslauthd 绑定。

  • Linux MongoDB 服务器支持通过 saslauthd 守护进程绑定到 LDAP 服务器。

  • 在客户端和服务器之间以及 saslauthd 和 LDAP 服务器之间使用安全加密或可信连接。LDAP 服务器使用 SASL PLAIN 机制,以明文形式发送和接收数据。您应该只使用可信通道,如 VPN、使用 TLS/SSL 加密的连接或可信有线网络。

LDAP对用户身份验证的支持需要正确配置 saslauthd 守护进程以及 MongoDB 服务器。

1

在使用 /etc/sysconfig/saslauthd 文件配置 saslauthd 的系统,如 Red Hat Enterprise Linux、Fedora、CentOS 和 Amazon Linux AMI 等上,将机制 MECH 设置为 ldap

MECH=ldap

在使用 /etc/default/saslauthd 文件配置 saslauthd 的系统(例如 Ubuntu)上,将 MECHANISMS 选项设置为 ldap

MECHANISMS="ldap"
2

在某些 Linux 发行版中,saslauthd 启动时默认启用身份验证身份验证档案的缓存。在重新启动或缓存过期之前,saslauthd 不会联系 LDAP 服务器以重新认证其身份验证缓存中的用户。这样,即使 LDAP 服务器宕机或缓存用户的档案被撤销,saslauthd 也能成功验证缓存中的用户。

要设置身份验证缓存的过期时间(以秒为单位),请参阅 -t 选项saslauthd

3

如果saslauthd.conf文件不存在,则创建该文件。 saslauthd.conf文件通常位于/etc文件夹中。 如果指定了其他文件路径,请参阅 -O 选项saslauthd

要连接 OpenLDAP 服务器,请使用以下配置选项更新 saslauthd.conf 文件:

ldap_servers: <ldap uri>
ldap_search_base: <search base>
ldap_filter: <filter>

ldap_servers 指定用于身份验证的 LDAP 服务器的 uri。通常,对于安装在本地计算机上的 OpenLDAP,您可以指定值 ldap://localhost:389,或者如果使用基于 TLS/SSL 的 LDAP,则可以指定值 ldaps://localhost:636

ldap_search_base 指定与搜索相关的可分辨名称。搜索包括以下基础或对象。

ldap_filter 指定搜索筛选器。

这些配置选项的值应与特定于测试的值相对应。例如,要筛选电子邮件,请改为指定 ldap_filter: (mail=%n)

OpenLDAP 的示例 saslauthd.conf 文件包含以下内容:

ldap_servers: ldaps://ad.example.net
ldap_search_base: ou=Users,dc=example,dc=com
ldap_filter: (uid=%u)

要使用此示例 OpenLDAP 配置,请创建具有 uid 属性(登录名)的用户,并将其放置在域组件(dcexamplecom 下的 Users 组织单位(ou)下。

有关saslauthd 配置的更多信息,请参阅 http://www.openldap.org/doc/admin24 /guide.html#Configuringsaslauthd

4

使用 testsaslauthd 实用程序测试 saslauthd 配置。例如:

testsaslauthd -u testuser -p testpassword -f /var/run/saslauthd/mux
  • 0: OK "Success" 表示身份验证成功。

  • 0: NO "authentication failed" 表示用户名、密码或配置错误。

根据主机操作系统上 saslauthd 目录的位置修改文件路径。

重要

security.sasl.saslauthdSocketPath--setParameter saslauthdPath 指定的 saslauthd Unix 域套接字文件的父目录必须授予以下任一项读取和执行 (r-x) 的权限:

  • 启动 mongodmongos 的用户,或者

  • 该用户所属的组。

如果没有指定 saslauthd 目录及其内容的权限,mongodmongos 无法通过 saslauthd 成功进行身份验证。

1

将用户添加到 MongoDB 中的 $external 数据库。要指定用户的权限,请为用户分配角色

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

例如,以下操作在 records 数据库中添加具有只读访问权限的用户。

db.getSiblingDB("$external").createUser(
{
user : <username>,
roles: [ { role: "read", db: "records" } ]
}
)

根据需要添加其他主体。有关创建和管理用户的更多信息,请参阅用户管理命令。

2

要配置 MongoDB 服务器以将 saslauthd 实例用于代理身份验证,请在启动 mongod 时包含以下选项:

如果使用 authorization 选项执行身份验证,则需要具有创建用户的权限。

对于 /<some>/<path>/saslauthd 的套接字路径,请将 saslauthdPath 设置为 /<some>/<path>/saslauthd/mux,如以下命令行示例所示:

mongod --auth --setParameter saslauthdPath=/<some>/<path>/saslauthd/mux --setParameter authenticationMechanisms=PLAIN

根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip

如果使用 YAML 格式的配置文件,请在文件中指定以下设置:

security:
authorization: enabled
setParameter:
saslauthdPath: /<some>/<path>/saslauthd/mux
authenticationMechanisms: PLAIN

或者,如果使用较旧的配置文件格式:

auth=true
setParameter=saslauthdPath=/<some>/<path>/saslauthd/mux
setParameter=authenticationMechanisms=PLAIN

要使用默认的 Unix 域套接字路径,请将 saslauthdPath 设置为空字符串 "",如以下命令行示例所示:

mongod --auth --setParameter saslauthdPath="" --setParameter authenticationMechanisms=PLAIN

根据配置要求包括其他选项。例如,如果希望远程客户端连接到您的部署,或是您的部署成员运行在不同主机上,请指定 --bind_ip

如果使用 YAML 格式的配置文件,请在文件中指定以下设置:

security:
authorization: enabled
setParameter:
saslauthdPath: ""
authenticationMechanisms: PLAIN

或者,如果使用较旧的配置文件格式:

auth=true
setParameter=saslauthdPath=""
setParameter=authenticationMechanisms=PLAIN

根据配置要求包括其他选项。例如,如果您希望远程客户端连接到部署,或者部署节点运行在不同的主机上,请指定 net.bindIp 设置。

3

您可以在连接时通过命令行进行身份验证,也可以先连接,然后使用 db.auth() 方法进行身份验证。

要在使用mongosh连接时进行身份验证,请使用以下命令行选项运行mongosh ,替换<host><user> ,并在出现提示时输入密码:

mongosh --host <host> --authenticationMechanism PLAIN --authenticationDatabase '$external' -u <user> -p

或者,在不提供档案的情况下进行连接,然后对$external数据库调用db.auth()方法。 在mechanism字段中指定值"PLAIN" ,分别在userpwd字段中指定用户和密码。 使用默认的digestPassword值 ( false ),因为服务器必须接收未消化的密码才能转发到saslauthd ,如以下示例所示:

提示

您可以将 passwordPrompt() 方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。不过,您仍然可以像使用早期版本的 mongo shell 一样直接指定密码。

db.getSiblingDB("$external").auth(
{
mechanism: "PLAIN",
user: <username>,
pwd: passwordPrompt() // or cleartext password
}
)

根据提示输入密码。

服务器以纯文本形式转发密码。通常,仅在受信任的渠道(VPN、TLS/SSL、受信任的有线网络)上使用。请参阅注意事项。