此身份验证方法的操作类似于 password,只是它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在使用 LDAP 进行身份验证之前,用户必须已存在于数据库中。
LDAP 身份验证可以有两种模式。第一种模式,我们称之为简单绑定模式,服务器将绑定到由 prefix username suffix 构成的专有名称 (DN)。通常,prefix 参数用于指定 cn=,或者在 Active Directory 环境中指定 DOMAIN\。suffix 用于在非 Active Directory 环境中指定 DN 的其余部分。
在第二种模式,我们称之为搜索+绑定模式,服务器首先使用指定的 ldapbinddn 和 ldapbindpasswd 以固定的用户名和密码绑定到 LDAP 目录,并搜索尝试登录数据库的用户。如果未配置用户和密码,将尝试匿名绑定到目录。搜索将在 ldapbasedn 指定的子树下进行,并尝试精确匹配 ldapsearchattribute 中指定的属性。一旦在搜索中找到该用户,服务器将以该用户身份重新绑定到目录,使用客户端提供的密码来验证登录是否正确。此模式与 PostgreSQL 中的其他软件(如 Apache mod_authnz_ldap 和 pam_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 选项作为替代。
请注意,使用 ldapscheme 或 ldaptls 仅加密 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 必须是 base、one、sub 中的一个,通常是最后一个。(默认值为 base,这在此应用中通常无用。)attribute 可以指定单个属性,在这种情况下,它被用作 ldapsearchattribute 的值。如果 attribute 为空,则 filter 可用作 ldapsearchfilter 的值。
URL 方案 ldaps 选择 LDAPS 方法,用于通过 SSL 进行 LDAP 连接,等同于使用 ldapscheme=ldaps。要使用 StartTLS 操作进行加密的 LDAP 连接,请使用常规 URL 方案 ldap,并在 ldapurl 之外指定 ldaptls 选项。
对于非匿名绑定,ldapbinddn 和 ldapbindpasswd 必须作为单独的选项指定。
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,其中 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 服务器。如果该连接成功,则授予数据库访问权限。
以下是另一个简单绑定配置,它使用 LDAPS 方案和自定义端口号,以 URL 的形式编写
host ... ldap ldapurl="ldaps://ldap.example.net:49151" ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
这比单独指定 ldapserver、ldapscheme 和 ldapport 更紧凑。
以下是一个搜索+绑定配置的示例
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 选项时,通常需要使用双引号括起来的参数值,如示例所示。