使用OpenLDAP自管理SASL和LDAP进行认证
注意
从MongoDB 8.0开始,LDAP认证和授权已被弃用。LDAP仍然可用,MongoDB 8.0的整个生命周期内将保持不变。LDAP将在未来的一个主要版本中删除。
详细信息,请参阅LDAP弃用.
MongoDB企业版提供对用户代理认证的支持。这允许管理员配置MongoDB集群通过代理认证请求到指定的轻量级目录访问协议(LDAP)服务来认证用户。
注意
对于链接到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
。
使用 OpenLDAP 配置 LDAP 选项。
如果 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 示例
以下是一个 OpenLDAP 的 saslauthd.conf
文件示例
ldap_servers: ldaps://ad.example.net ldap_search_base: ou=Users,dc=example,dc=com ldap_filter: (uid=%u)
要使用此 OpenLDAP 配置示例,请创建具有 uid
属性(登录名)的用户,并将其放置在域名组件(dc
) example
和 com
下的 Users
组织单元(ou
)中。
有关 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
目录的位置修改文件路径。
重要
saslauthd
Unix域套接字文件的父目录,指定于security.sasl.saslauthdSocketPath
或--setParameter saslauthdPath
,必须授予读取和执行(r-x
)权限给以下任一:
配置MongoDB
将用户添加到MongoDB以进行认证。
将用户添加到MongoDB中的$external
数据库。要指定用户的权限,请将roles
分配给用户。
要使用与$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-domain Socket 路径。重要
saslauthd
Unix域套接字文件的父目录,指定于security.sasl.saslauthdSocketPath
或--setParameter saslauthdPath
,必须授予读取和执行(r-x
)权限给以下任一:
如果您使用 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、受信任的有线网络)上使用。见注意事项。