20.10. LDAP 认证

除了使用 LDAP 作为密码验证方法之外,此身份验证方法的操作与password相似。 LDAP 仅用于验证用户名/密码对。因此,用户必须已经存在于数据库中,然后才能使用 LDAP 进行身份验证。

LDAP 身份验证可以两种方式运行。在第一种模式下,我们将其称为简单绑定模式,服务器将绑定到以* prefix * * username * * suffix 构造的专有名称。通常, prefix 参数用于在 Active Directory 环境中指定cn= DOMAIN * \。 * suffix *用于指定非 Active Directory 环境中 DN 的其余部分。

在第二种模式(我们将其称为搜索绑定模式)中,服务器首先使用固定的用户名和密码(由* ldapbinddn ldapbindpasswd 指定)绑定到 LDAP 目录,然后对尝试登录的用户执行搜索进入数据库。如果未配置用户名和密码,则将尝试匿名绑定到目录。搜索将在 ldapbasedn 的子树上进行,并将尝试与 ldapsearchattribute *中指定的属性完全匹配。在此搜索中找到用户后,服务器将使用 Client 端指定的密码以该用户身份断开连接并重新绑定到目录,以验证登录名是否正确。此模式与其他软件(例如 Apache mod_authnz_ldappam_ldap)中的 LDAP 认证方案所使用的模式相同。该方法在用户对象在目录中的位置上提供了极大的灵 Active,但是会导致与 LDAP 服务器构建两个单独的连接。

在两种模式下都使用以下配置选项:

  • ldapserver

    • 要连接的 LDAP 服务器的名称或 IP 地址。可以指定多个服务器,以空格分隔。
  • ldapport

    • LDAP 服务器上要连接的端口号。如果未指定端口,则将使用 LDAP 库的默认端口设置。
  • ldapscheme

    • 设置为ldaps以使用 LDAPS。这是通过 SSL 使用 LDAP 的非标准方式,某些 LDAP 服务器实现支持这种方式。另请参见ldaptls选项。
  • ldaptls

    • 设置为 1 可使 PostgreSQL 和 LDAP 服务器之间的连接使用 TLS 加密。这使用 RFC 4513 的StartTLS操作。另请参见ldapscheme选项。

请注意,使用ldapschemeldaptls仅加密 PostgreSQL 服务器和 LDAP 服务器之间的通信。除非在那里也使用 SSL,否则 PostgreSQL 服务器与 PostgreSQLClient 端之间的连接仍然不会被加密。

以下选项仅在简单绑定模式下使用:

  • ldapprefix

    • 进行简单绑定身份验证时,形成要绑定的 DN 时要在用户名前添加的字符串。
  • ldapsuffix

    • 进行简单绑定身份验证时,在形成要绑定的 DN 时追加到用户名的字符串。

以下选项仅在搜索绑定模式下使用:

  • ldapbasedn

    • 进行搜索绑定身份验证时,要在其中搜索用户的根 DN。
  • ldapbinddn

    • 执行搜索绑定身份验证时要绑定到目录的用户的 DN。
  • ldapbindpasswd

    • 用户进行搜索绑定身份验证时绑定到目录以执行搜索的密码。
  • ldapsearchattribute

    • 在执行搜索绑定身份验证时与搜索中的用户名匹配的属性。如果未指定任何属性,则将使用uid属性。
  • ldapsearchfilter

    • 执行搜索绑定身份验证时要使用的搜索过滤器。出现$username时将替换为用户名。与ldapsearchattribute相比,这提供了更灵活的搜索过滤器。
  • ldapurl

    • RFC 4516 LDAP URL。这是一种以更紧凑,更标准的形式编写其他一些 LDAP 选项的替代方法。格式为
ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]
  • scope 必须是baseonesub之一,通常是最后一个。 (默认值为base,通常在此应用程序中没有用.) attribute 可以指定单个属性,在这种情况下,它用作ldapsearchattribute的值。如果 attribute 为空,则 filter *可用作ldapsearchfilter的值。

URL 方案ldaps选择用于通过 SSL 构建 LDAP 连接的 LDAPS 方法,等同于使用ldapscheme=ldaps。要使用StartTLS操作使用加密的 LDAP 连接,请使用常规 URL 方案ldap并指定ldaptls选项和ldapurl

对于非匿名绑定,必须将ldapbinddnldapbindpasswd指定为单独的选项。

LDAP URL 当前仅受 OpenLDAP 支持,Windows 上不支持。

将简单绑定的配置选项与搜索绑定的选项混合使用是错误的。

使用搜索绑定模式时,可以使用ldapsearchattribute指定的单个属性或ldapsearchfilter指定的自定义搜索过滤器执行搜索。指定ldapsearchattribute=foo等效于指定ldapsearchfilter="(foo=$username)"。如果未指定任何选项,则默认值为ldapsearchattribute=uid

以下是简单绑定 LDAP 配置的示例:

host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"

当请求以数据库用户someuser的身份连接到数据库服务器时,PostgreSQL 将尝试使用 DN cn=someuser, dc=example, dc=net和 Client 端提供的密码绑定到 LDAP 服务器。如果该连接成功,则将授予数据库访问权限。

这是搜索绑定配置的示例:

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid

当请求以数据库用户someuser的身份与数据库服务器构建连接时,PostgreSQL 将尝试匿名绑定(由于未指定ldapbinddn)到 LDAP 服务器,并在指定的基本 DN 下执行(uid=someuser)的搜索。如果找到条目,它将尝试使用找到的信息和 Client 端提供的密码进行绑定。如果第二个连接成功,则将授予数据库访问权限。

这是写为 URL 的相同搜索绑定配置:

host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"

其他一些支持 LDAP 身份验证的软件使用相同的 URL 格式,因此共享配置会更加容易。

这是一个搜索绑定配置示例,该配置使用ldapsearchfilter而不是ldapsearchattribute来允许通过用户 ID 或电子邮件地址进行身份验证:

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"

Tip

由于 LDAP 通常使用逗号和空格来分隔 DN 的不同部分,因此在配置 LDAP 选项时通常需要使用双引号参数值,如示例所示。