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

20.10. LDAP 身份验证 #

这种身份验证方法与 password 类似,只是它使用 LDAP 作为密码验证方法。LDAP 只用于验证用户名/密码对。因此,用户必须在数据库中已存在,才能使用 LDAP 进行身份验证。

LDAP 身份验证可以以两种模式运行。在第一种模式(我们称之为简单绑定模式)中,服务器将绑定到构造为 prefix username suffix 的识别名称。通常,prefix 参数用于指定 cn=,或 Active Directory 环境中的 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。这是通过 SSL 使用 LDAP 的非标准方法,某些 LDAP 服务器实现支持。有关替代方法,另请参见 ldaptls 选项。

ldaptls

设置为 1,使 PostgreSQL 和 LDAP 服务器之间的连接使用 TLS 加密。这将根据 RFC 4513 使用 StartTLS 操作。有关替代方法,另请参见 ldapscheme 选项。

请注意,使用 ldapschemeldaptls 只会加密 PostgreSQL 服务器和 LDAP 服务器之间的流量。PostgreSQL 服务器和 PostgreSQL 客户端之间的连接将仍然未加密,除非在那里也使用 SSL。

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

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 选择 LDAPS 方法通过 SSL 建立 LDAP 连接,等同于使用 ldapscheme=ldaps。要使用使用 StartTLS 操作的加密 LDAP 连接,请使用正常的 URL 方案 ldap,并除 ldapurl 之外还指定 ldaptls 选项。

对于非匿名绑定,必须分别指定 ldapbinddnldapbindpasswd 选项。

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

混合使用简单绑定和搜索+绑定的配置选项会导致错误。

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

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

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 选项时,通常需要使用双引号的参数值,如示例所示。

提交更正

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