Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

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

在此页面上

  • Considerations
  • 配置 saslauthd
  • 配置 MongoDB

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、受信任的有线网络)上使用。请参阅注意事项。

后退

使用 ActiveDirectory