2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不受支持的版本: 12 / 11

20.10. LDAP 身份验证 #

此身份验证方法的操作类似于 password,只是它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在使用 LDAP 进行身份验证之前,用户必须已存在于数据库中。

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

在第二种模式,我们称之为搜索+绑定模式,服务器首先使用指定的 ldapbinddnldapbindpasswd 以固定的用户名和密码绑定到 LDAP 目录,并搜索尝试登录数据库的用户。如果未配置用户和密码,将尝试匿名绑定到目录。搜索将在 ldapbasedn 指定的子树下进行,并尝试精确匹配 ldapsearchattribute 中指定的属性。一旦在搜索中找到该用户,服务器将以该用户身份重新绑定到目录,使用客户端提供的密码来验证登录是否正确。此模式与 PostgreSQL 中的其他软件(如 Apache mod_authnz_ldappam_ldap)中的 LDAP 身份验证方案所使用的模式相同。此方法在用户对象位于目录中的位置方面提供了更大的灵活性,但会导致对 LDAP 服务器进行两次额外的请求。

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

ldapserver

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

ldapport

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

ldapscheme

设置为 ldaps 以使用 LDAPS。这是一种非标准的 LDAP over SSL 使用方式,受某些 LDAP 服务器实现支持。另请参阅 ldaptls 选项作为替代。

ldaptls

设置为 1 以使 PostgreSQL 和 LDAP 服务器之间的连接使用 TLS 加密。这会使用 RFC 4513 中定义的 StartTLS 操作。另请参阅 ldapscheme 选项作为替代。

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

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

ldapprefix

在执行简单绑定身份验证时,用于构成要绑定的 DN 的用户名字符串前缀。

ldapsuffix

在执行简单绑定身份验证时,用于构成要绑定的 DN 的用户名字符串后缀。

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

ldapbasedn

执行搜索+绑定身份验证时,用于开始搜索用户的根 DN。

ldapbinddn

执行搜索+绑定身份验证时,用于绑定到目录以执行搜索的用户 DN。

ldapbindpasswd

执行搜索+绑定身份验证时,用于绑定到目录以执行搜索的用户的密码。

ldapsearchattribute

执行搜索+绑定身份验证时,用于在搜索中匹配用户名的属性。如果未指定属性,则使用 uid 属性。

ldapsearchfilter

执行搜索+绑定身份验证时使用的搜索过滤器。$username 的所有出现都将替换为用户名。这允许比 ldapsearchattribute 更灵活的搜索过滤器。

以下选项可作为一种更简洁、更标准的替代方式来编写上述某些 LDAP 选项

ldapurl

一个 RFC 4516 LDAP URL。格式为:

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 必须作为单独的选项指定。

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

混合使用简单绑定模式的配置选项和搜索+绑定模式的选项是错误的。要在简单绑定模式下使用 ldapurl,URL 不能包含 basedn 或查询元素。

使用搜索+绑定模式时,可以通过 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 服务器。如果该连接成功,则授予数据库访问权限。

以下是另一个简单绑定配置,它使用 LDAPS 方案和自定义端口号,以 URL 的形式编写

host ... ldap ldapurl="ldaps://ldap.example.net:49151" ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"

这比单独指定 ldapserverldapschemeldapport 更紧凑。

以下是一个搜索+绑定配置的示例

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

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

以下是以 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))"

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

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

提示

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

提交更正

如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。