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

在本页面

MongoDB Enterprise 提供对用户代理身份验证的支持。这样,Management 员可以将 MongoDB 集群配置为通过将身份验证请求代理到指定的轻型目录访问协议(LDAP)服务来对用户进行身份验证。

Considerations

Warning

Windows 的 MongoDB 企业版不支持通过saslauthd进行绑定。

  • Linux MongoDB 服务器支持通过saslauthd守护程序绑定到 LDAP 服务器。

  • 在 Client 端与服务器之间以及saslauthd与 LDAP 服务器之间使用安全的加密或信任连接。 LDAP 服务器使用SASL PLAIN机制,以“纯文本”形式发送和接收数据。您应仅使用可信通道(例如 VPN),使用 TLS/SSL 加密的连接或可信有线网络。

Configure saslauthd

LDAP 对用户身份验证的支持要求正确配置saslauthd守护进程以及 MongoDB 服务器。

指定机制。

在使用/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"

调整缓存行为。

在某些 Linux 发行版中,saslauthd从缓存身份验证凭据* enabled *开始。在重新启动或直到缓存过期之前,saslauthd不会与 LDAP 服务器联系以重新认证其身份验证缓存中的用户。这使saslauthd能够成功验证其缓存中的用户,即使 LDAP 服务器已关闭或已缓存的用户的凭据被撤消也是如此。

要设置身份验证缓存的到期时间(以秒为单位),请参阅saslauthd中的-t option

使用 OpenLDAP 配置 LDAP 选项。

如果saslauthd.conf文件不存在,请创建它。 saslauthd.conf文件通常位于/etc文件夹中。如果指定其他文件路径,请参见saslauthd-O option

要连接到 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 Example

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)examplecom下的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"表示用户名,密码或配置错误。

相对于主机 os 上的saslauthd目录的位置,修改文件路径。

Important

security.sasl.saslauthdSocketPath--setParameter saslauthdPath指定的saslauthd Unix 域套接字文件的父目录必须授予以下任一项的读取和执行(r-x)权限:

  • 用户启动mongodmongos

  • 该用户所属的组。

没有对saslauthd目录及其内容的指定权限,mongodmongos无法通过saslauthd成功认证。

Configure MongoDB

将用户添加到 MongoDB 进行身份验证。

将用户添加到 MongoDB 中的$external数据库。要指定用户的特权,请为用户分配roles

在版本 3.6.3 中更改:要与$external个身份验证用户(即 Kerberos,LDAP,x.509 用户)一起使用会话,用户名不能超过 10k 字节。

例如,以下代码添加了对records数据库具有只读访问权限的用户。

db.getSiblingDB("$external").createUser(
    {
      user : <username>,
      roles: [ { role: "read", db: "records" } ]
    }
)

根据需要添加其他主体。有关创建和 Management 用户的更多信息,请参阅用户 Management 命令

配置 MongoDB 服务器。

要将 MongoDB 服务器配置为使用saslauthd实例进行代理身份验证,请在启动mongod时包括以下选项:

Important

security.sasl.saslauthdSocketPath--setParameter saslauthdPath指定的saslauthd Unix 域套接字文件的父目录必须授予以下任一项的读取和执行(r-x)权限:

  • 用户启动mongodmongos

  • 该用户所属的组。

没有对saslauthd目录及其内容的指定权限,mongodmongos无法通过saslauthd成功认证。

如果使用authorization选项强制执行身份验证,则将需要特权来创建用户。

使用特定的 saslauthd 套接字路径。

对于/<some>/<path>/saslauthd的套接字路径,将saslauthdPath设置为/<some>/<path>/saslauthd/mux,如以下命令行示例所示:

mongod --auth --setParameter saslauthdPath=/<some>/<path>/saslauthd/mux --setParameter authenticationMechanisms=PLAIN

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip。有关更多信息,请参见Localhost 绑定兼容性更改

或者,如果使用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

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip。有关更多信息,请参见Localhost 绑定兼容性更改

或者,如果使用YAML 格式配置文件,则在文件中指定以下设置:

security:
   authorization: enabled

setParameter:
   saslauthdPath: ""
   authenticationMechanisms: PLAIN

或者,如果使用较旧的配置文件格式

auth=true
setParameter=saslauthdPath=""
setParameter=authenticationMechanisms=PLAIN

包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改

在 mongo shell 中验证用户身份。

要在与mongo shell 连接时进行身份验证,请使用以下选项运行mongo,用<host><user>代替,并在出现提示时 Importing 密码:

mongo --host <host> --authenticationMechanism PLAIN --authenticationDatabase '$external' -u <user> -p

或者,在不提供凭据的情况下进行连接,然后在$external数据库上调用db.auth()方法。

mechanism字段中指定值"PLAIN",在userpwd字段中分别指定用户和密码,在digestPassword字段中指定值false。您必须**为digestPassword指定false,因为服务器必须收到未消化的密码才能转发到saslauthd,如以下示例所示:

db.getSiblingDB("$external").auth(
   {
     mechanism: "PLAIN",
     user: <username>,
     pwd:  <cleartext password>,
     digestPassword: false
   }
)

服务器以纯文本形式转发密码。通常,仅在受信任的通道(VPN,TLS/SSL,受信任的有线网络)上使用。请参阅注意事项。