此认证方法与 password
的工作方式类似,但它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在 LDAP 可用于认证之前,用户必须已存在于数据库中。
LDAP 认证可以在两种模式下进行。在第一种模式中(我们称之为简单绑定模式),服务器将绑定到以 prefix
username
suffix
形式构建的特定名称。通常,prefix
参数用于指定 cn=
,或 DOMAIN
\
在 Active Directory 环境中。在非 Active Directory 环境中,suffix
用于指定 DN 中的其余部分。
在第二种模式中,我们将称之为搜索+绑定模式,服务器首先使用固定用户名和密码绑定到 LDAP 目录,用 ldapbinddn
和 ldapbindpasswd
指定,并执行搜索,以查找试图登录到数据库的用户。如果没有配置用户和密码,将尝试对目录进行匿名绑定。搜索将在 ldapbasedn
中的子树中执行,并将尝试对 ldapsearchattribute
中指定的属性进行精确匹配。一旦在此搜索中找到用户,服务器将使用客户端指定的密码重新绑定到目录作为此用户,以验证登录是否正确。此模式与其他软件中 LDAP 认证方案使用的模式相同,例如 Apache mod_authnz_ldap
和 pam_ldap
。此方法允许用户对象在目录中的位置具有更大的灵活性,但将导致向 LDAP 服务器发出两个额外的请求。
两种模式都使用以下配置选项
ldapserver
要连接的 LDAP 服务器的名称或 IP 地址。可以指定多个服务器,用空格分隔。
ldapport
要连接的 LDAP 服务器上的端口号。如果未指定任何端口,将使用 LDAP 库的默认端口设置。
ldapscheme
设置为 ldaps
以使用 LDAPS。这是通过 SSL 使用 LDAP 的非标准方式,受一些 LDAP 服务器实现支持。另请参阅 ldaptls
选项以获得其他选择。
ldaptls
设置为 1 以使 PostgreSQL 与 LDAP 服务器之间的连接使用 TLS 加密。这使用 RFC 4513 中的 StartTLS
操作。另请参阅 ldapscheme
选项以获得其他选择。
请注意,使用 ldapscheme
或 ldaptls
仅加密 PostgreSQL 服务器和 LDAP 服务器之间的通信。PostgreSQL 服务器和 PostgreSQL 客户端之间的连接仍将处于未加密状态,除非在那里也使用 SSL。
仅在简单绑定模式中使用以下选项
ldapprefix
在进行简单绑定身份验证时,在形成 DN 之前附加到用户名上的字符串。
ldapsuffix
在进行简单绑定身份验证时,在形成 DN 之前附加到用户名上的字符串。
仅在搜索+绑定模式中使用以下选项
ldapbasedn
在进行 search+bind 身份验证时,开始搜索用户的根 DN。
ldapbinddn
用于执行搜索并绑定到目录以便进行搜索和绑定身份验证的用户 DN。
ldapbindpasswd
用于执行搜索并绑定到目录以便进行搜索和绑定身份验证的用户密码。
ldapsearchattribute
在执行搜索并绑定身份验证时与搜索中的用户名进行匹配的属性。如果未指定属性,则会使用 uid
属性。
ldapsearchfilter
在执行搜索并绑定身份验证时要使用的搜索过滤器。 $username
的出现将替换为用户名。这允许搜索过滤器比 ldapsearchattribute
更灵活。
ldapurl
RFC 4516 LDAP URL。这是以更紧凑和标准化的格式编写其他一些 LDAP 选项的另一种方法。格式为
ldap[s]://host
[:port
]/basedn
[?[attribute
][?[scope
][?[filter
]]]]
scope
必须是 base
、one
、sub
之一,通常是最后一个。(默认设置为 base
,而这通常在本应用程序中没有用。)attribute
可以指定一个属性,在这种情况下,它被用作 ldapsearchattribute
的值。如果 attribute
为空,则 filter
可用作 ldapsearchfilter
的值。
URL 方案 ldaps
选择 LDAPS 方法来通过 SSL 建立 LDAP 连接,相当于使用 ldapscheme=ldaps
。若要使用 StartTLS
操作加密 LDAP 连接,请使用常规的 URL 方案 ldap
,并指定 ldaptls
选项以及 ldapurl
。
对于非匿名绑定,必须将 ldapbinddn
和 ldapbindpasswd
分别指定为不同的选项。
当前仅在 OpenLDAP 中支持 LDAP URL,在 Windows 中不支持。
将简单绑定的配置选项与搜索和绑定的选项混合在一起会出错。
使用搜索和绑定模式时,可以使用通过 ldapsearchattribute
指定的单个属性执行搜索,或使用通过 ldapsearchfilter
指定的自定义搜索筛选器执行搜索。指定 ldapsearchattribute=foo
等效于指定 ldapsearchfilter="(foo=$username)"
。如果未指定任一选项,则默认设置为 ldapsearchattribute=uid
。
如果 PostgreSQL 使用 OpenLDAP 作为 LDAP 客户端程序库进行编译,则可以省略 ldapserver
设置。在这种情况下,将通过 RFC 2782 DNS SRV 记录查找主机名和端口列表。查找名为 _ldap._tcp.DOMAIN
的名称,其中将从 ldapbasedn
提取 DOMAIN
。
下面是简单绑定 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 选项时经常需要使用双引号参数值,如示例中所示。