支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本:12 / 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 服务器之间的流量。除非也在此处使用 SSL,否则 PostgreSQL 服务器和 PostgreSQL 客户端之间的连接仍将保持未加密状态。

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

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 并指定 ldaptls 选项以及 ldapurl

对于非匿名绑定,必须将 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,其中 DOMAIN 是从 ldapbasedn 中提取的。

以下是简单绑定 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 选项时,通常需要使用双引号括起来的参数值,如示例所示。

提交更正

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