选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

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。这是一种非标准的使用LDAP 进行SSL加密的方式,受一些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指定为单独的选项。

目前只有 OpenLDAP 支持 LDAP URL,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 和客户端提供的密码绑定到 LDAP 服务器。如果连接成功,就会授予数据库访问权限。

下面是搜索加绑定配置的示例:

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

当请求以数据库用户 someuser 的身份连接数据库服务器时,PostgreSQL 会尝试匿名绑定到 LDAP 服务器(因为没有指定 ldapbinddn),并在指定的基础 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))"

Tip

如示例中所示,由于 LDAP 通常使用逗号和空格来分割一个 DN 的不同部分,在配置 LDAP 选项时通常有必要使用双引号包围的参数值。