使用自管理 SASL 和LDAP与 ActiveDirectory 进行身份验证
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、受信任的有线网络)上使用。请参阅注意事项。