使用自管理 SASL 和 LDAP 通过 ActiveDirectory 进行身份验证
注意
从 MongoDB 8.0 开始,LDAP 身份验证和授权已被弃用。LDAP 可用,MongoDB 8.0 的整个生命周期内将保持不变。LDAP 将在未来的主要版本中删除。
有关详细信息,请参阅LDAP 弃用.
MongoDB Enterprise 支持用户代理身份验证。这允许管理员配置 MongoDB 集群通过代理身份验证请求到指定的轻量级目录访问协议(LDAP)服务来进行用户身份验证。
注意
对于与 MongoDB 4.2 Enterprise 二进制文件链接的情况libldap(例如在RHEL上运行时),对libldap的访问是同步的,这会产生一些性能/延迟成本。
对于与libldap_r链接的MongoDB 4.2企业版二进制文件,与早期MongoDB版本的行为没有变化。
注意事项
警告
Windows版本的MongoDB企业版不支持通过saslauthd进行绑定。
Linux MongoDB服务器支持通过
saslauthd守护进程绑定到LDAP服务器。请在客户端和服务器之间、以及在
saslauthd和LDAP服务器之间使用安全的加密或受信任的连接。LDAP服务器使用SASL PLAIN机制,以明文形式发送和接收数据。您应仅使用VPN、TLS/SSL加密的连接或受信任的有线网络等受信任的通道。
配置saslauthd
LDAP对用户身份验证的支持需要正确配置saslauthd守护进程以及MongoDB服务器。
调整缓存行为。
在某些Linux发行版中,saslauthd默认启用认证凭证缓存。在重启或缓存过期之前,saslauthd不会联系LDAP服务器以重新验证其认证缓存中的用户。这允许saslauthd即使在LDAP服务器关闭或缓存用户的凭证被撤销的情况下,也能成功验证其缓存中的用户。
要设置认证缓存的过期时间(以秒为单位),请参阅-t选项的saslauthd。
使用ActiveDirectory配置LDAP选项。
如果saslauthd.conf文件不存在,则创建它。saslauthd.conf文件通常位于/etc文件夹中。如果指定了不同的文件路径,请参阅-O选项的saslauthd。
要与ActiveDirectory一起使用,请在saslauthd.conf文件中设置以下配置选项以启动saslauthd。
ldap_servers: <ldap uri> ldap_use_sasl: yes ldap_mech: DIGEST-MD5 ldap_auth_method: fastbind
对于<ldap uri>,指定ldap服务器的uri。例如,ldap_servers: ldaps://ad.example.net。
有关saslauthd配置的更多信息,请参阅http://www.openldap.org/doc/admin24/guide.html#Configuringsaslauthd。
测试 saslauthd 配置。
使用 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) 权限:
如果不在 saslauthd 目录及其内容上指定权限,mongod 或 mongos 无法通过 saslauthd 成功进行身份验证。
配置 MongoDB
将用户添加到MongoDB以进行身份验证。
将用户添加到MongoDB中的$external数据库。要指定用户的权限,将角色分配给用户。
要使用$external身份验证用户(Kerberos、LDAP或x.509用户)与客户端会话和因果一致性保证,用户名不能超过10k字节。
例如,以下示例将具有只读访问权限的用户添加到records数据库。
db.getSiblingDB("$external").createUser( { user : <username>, roles: [ { role: "read", db: "records" } ] } )
根据需要添加其他主体。有关创建和管理用户的更多信息,请参阅用户管理命令。
配置MongoDB服务器。
要配置MongoDB服务器以使用saslauthd实例进行代理身份验证,在启动mongod时包含以下选项:
--auth命令行选项或security.authorization设置,authenticationMechanisms参数设置为PLAIN,以及saslauthdPath参数设置为saslauthd实例的Unix域套接字路径。重要
指定给
security.sasl.saslauthdSocketPath或--setParameter saslauthdPath的saslauthdUnix 域套接字文件的父目录必须授予对以下内容的读和执行 (r-x) 权限:如果不在
saslauthd目录及其内容上指定权限,mongod或mongos无法通过saslauthd成功进行身份验证。
如果您使用authorization选项强制执行身份验证,则需要创建用户的权限。
使用特定的 saslauthd 套接字路径。
对于 /<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-domain 套接字路径。
要使用默认的 Unix-domain 套接字路径,将 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 设置。
在 mongosh 中进行用户认证。
您可以在连接时从命令行进行认证,或者先连接,然后使用 db.auth() 方法进行认证。
要使用 mongosh 进行连接时进行认证,请使用以下命令行选项运行 mongosh,并用 <host> 和 <user> 替换,然后按提示输入您的密码
mongosh --host <host> --authenticationMechanism PLAIN --authenticationDatabase '$external' -u <user> -p
或者,不提供凭据进行连接,然后在 $external 数据库上调用 db.auth() 方法。在 mechanism 字段中指定值 "PLAIN",分别指定用户名和密码到 user 和 pwd 字段。使用默认的 digestPassword 值 (false),因为服务器必须接收到未加密的密码以转发到 saslauthd,如下例所示
提示
您可以使用 passwordPrompt() 方法与各种用户认证管理方法和命令结合使用,提示输入密码,而不是直接在方法或命令调用中指定密码。但是,您仍然可以直接指定密码,就像在 mongo shell 的早期版本中一样。
db.getSiblingDB("$external").auth( { mechanism: "PLAIN", user: <username>, pwd: passwordPrompt() // or cleartext password } )
按提示输入密码。
服务器以明文形式转发密码。通常,仅在受信任的通道(VPN、TLS/SSL、受信任的有线网络)上使用。参见注意事项。