Postgresql 中文操作指南

21.10. LDAP Authentication #

此身份验证方法与 password 的运行方式很相似,但它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,用户必须在数据库中已存在,然后才能使用 LDAP 进行身份验证。

LDAP 身份验证可以在两种模式下运行。在第一种模式中(称之为简单绑定模式),服务器会绑定到作为 prefix username suffix 构建的 DN。通常,prefix 参数用于在 Active Directory 环境中指定 cn=DOMAIN__。_suffix_ 用于在非 Active Directory 环境中指定 DN 的其余部分。

在第二种模式中(称之为搜索 + 绑定模式),服务器首先使用 ldapbinddnldapbindpasswd 指定的固定用户名和密码绑定到 LDAP 目录,并对试图登录数据库的用户执行搜索。如果未配置任何用户和密码,将尝试匿名绑定到目录。搜索将在 ldapbasedn 的子树上进行,并将尝试对 ldapsearchattribute 中指定属性进行精确匹配。此搜索找到用户后,服务器将断开连接,并使用客户端指定的密码重新绑定到目录作为此用户,以验证登录是否正确。此模式与其他软件(如 Apache mod_authnz_ldappam_ldap)中 LDAP 身份验证方案使用的方法相同。此方法大幅提高了用户对象在目录中的存储位置的灵活性,但会导致与 LDAP 服务器建立两个单独的连接。

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

  • ldapserver

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

  • ldapport

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

  • ldapscheme

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

  • ldaptls

    • 将 PostgreSQL 和 LDAP 服务器之间的连接设置为 1 以使用 TLS 加密。它每个 LDAP 请求使用 StartTLS 操作。另请参阅 ldapscheme 选项,了解备择方案。

请注意,使用 ldapschemeldaptls 仅加密 PostgreSQL 服务器和 LDAP 服务器之间的流量。除非在 PostgreSQL 服务器和 PostgreSQL 客户端之间也使用 SSL,否则 PostgreSQL 服务器和 PostgreSQL 客户端之间的连接仍将保持未加密状态。

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

  • ldapprefix

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

  • ldapsuffix

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

使用 search+bind 模式时,仅使用以下选项:

  • ldapbasedn

    • 在执行 search+bind 认证时,作为在其中开始搜索用户的根 DN。

  • ldapbinddn

    • 在执行 search+bind 认证时,将用户 DN 绑定到执行搜索的目录上。

  • ldapbindpasswd

    • 在执行 search+bind 认证时,将用户密码绑定到执行搜索的目录上。

  • ldapsearchattribute

    • 在执行 search+bind 认证时,针对搜索中的用户名进行匹配的属性。如果不指定属性,将使用 uid 属性。

  • ldapsearchfilter

    • 在执行 search+bind 认证时,使用的搜索过滤器。$username 的出现将替换为用户名。这允许使用比 ldapsearchattribute 更灵活的搜索过滤器。

  • ldapurl

    • RFC 4516 LDAP 网址。这是以更紧凑的标准形式编写其他某些 LDAP 选项的备择方式。格式为

ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]
  • scope 必须是对 baseonesub 的其中一个(通常是最后一个)。(默认值是 base,在这个应用程序中通常没有用。)attribute 可以指定一个单个属性,在这种情况下,它用作 ldapsearchattribute 的值。如果 attribute 为空,则 filter 可用作 ldapsearchfilter 的值。

  • URL 方案 ldaps 使用 LDAPS 方法通过 SSL 进行 LDAP 连接,等效于使用 ldapscheme=ldaps。要使用 StartTLS 操作使用加密的 LDAP 连接,请使用常规 URL 方案 ldap,并在 ldapurl 中指定 ldaptls 选项。

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

  • 目前仅在 OpenLDAP 上支持 LDAP URL,在 Windows 上不支持。

将简单绑定的配置选项与 search+bind 的选项混合使用是一种错误。

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

如果 PostgreSQL 使用 OpenLDAP 编译为 LDAP 客户机库,则可以省略 ldapserver 设置。在此情况下,将通过 RFC 2782 DNS SRV 记录查找主机名和端口的列表。将查找该名称 _ldap._tcp.DOMAIN,其中 DOMAINldapbasedn 中提取。

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

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

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

以下是 search+bind 配置示例:

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

当请求连接到数据库用户 someuser 的数据库服务器时,PostgreSQL 将尝试匿名绑定(因为未指定 ldapbinddn)到 LDAP 服务器,在指定的基 DN 下搜索 (uid=someuser)。如果找到条目,它将使用找到的信息和客户端提供的密码再次尝试绑定。如果第二次连接成功,则授予数据库访问权限。

以下是作为 URL 编写的相同 search+bind 配置:

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

一些其他支持基于 LDAP 的身份验证的软件使用相同的 URL 格式,这样便于共享配置。

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

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

以下是一个使用 DNS SRV 发现来查找域名 example.net 的 LDAP 服务的主机名和端口的搜索+绑定配置示例:

host ... ldap ldapbasedn="dc=example,dc=net"

Tip

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