使用自管理 SASL 和LDAP与 ActiveDirectory 进行身份验证
注意
从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 版本相比,行为没有变化。
Considerations
警告
MongoDB Enterprise for Windows 不支持通过 saslauthd
绑定。
Linux MongoDB 服务器支持通过
saslauthd
守护进程绑定到 LDAP 服务器。在客户端和服务器之间以及
saslauthd
和 LDAP 服务器之间使用安全加密或可信连接。LDAP 服务器使用SASL PLAIN
机制,以明文形式发送和接收数据。您应该只使用可信通道,如 VPN、使用 TLS/SSL 加密的连接或可信有线网络。
配置 saslauthd
LDAP对用户身份验证的支持需要正确配置 saslauthd
守护进程以及 MongoDB 服务器。
调整缓存行为。
在某些 Linux 发行版中,saslauthd
启动时默认启用身份验证身份验证档案的缓存。在重新启动或缓存过期之前,saslauthd
不会联系 LDAP 服务器以重新认证其身份验证缓存中的用户。这样,即使 LDAP 服务器宕机或缓存用户的档案被撤销,saslauthd
也能成功验证缓存中的用户。
要设置身份验证缓存的过期时间(以秒为单位),请参阅 -t 选项 的saslauthd
。
使用 ActiveDirectory 配置 LDAP 选项。
如果saslauthd.conf
文件不存在,则创建该文件。 saslauthd.conf
文件通常位于/etc
文件夹中。 如果指定了其他文件路径,请参阅 -O 选项 的saslauthd
。
要与 ActiveDirectory 一起使用,请启动 saslauthd
,并在 saslauthd.conf
文件中设置以下配置选项:
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 Server。
要配置 MongoDB 服务器以将 saslauthd
实例用于代理身份验证,请在启动 mongod
时包含以下选项:
--auth
命令行选项或security.authorization
设置,authenticationMechanisms
参数设置为PLAIN
,以及saslauthdPath
参数设置为saslauthd
实例的 Unix 域套接字路径。重要
为
security.sasl.saslauthdSocketPath
或--setParameter saslauthdPath
指定的saslauthd
Unix 域套接字文件的父目录必须授予以下任一项读取和执行 (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 域套接字路径。
要使用默认的 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
设置。
在 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、受信任的有线网络)上使用。请参阅注意事项。