此身份验证方法的操作方式类似于 password
,不同之处在于它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在 LDAP 可用于身份验证之前,用户必须已存在于数据库中。
LDAP 身份验证可以在两种模式下操作。在第一种模式(我们称之为简单绑定模式)中,服务器将绑定到构造为 prefix
username
suffix
的专有名称。通常,prefix
参数用于指定 cn=
,或在 Active Directory 环境中指定 DOMAIN
\
。 suffix
用于指定非 Active Directory 环境中 DN 的其余部分。
在第二种模式中,我们称之为搜索+绑定模式,服务器首先使用固定用户名和密码绑定到 LDAP 目录,该用户名和密码由 ldapbinddn
和 ldapbindpasswd
指定,并对尝试登录数据库的用户执行搜索。如果未配置用户和密码,将尝试匿名绑定到目录。搜索将在 ldapbasedn
的子树上执行,并将尝试对 ldapsearchattribute
中指定的属性执行精确匹配。一旦在此搜索中找到用户,服务器将断开连接并重新绑定到目录,作为此用户,使用客户端指定的密码,以验证登录是否正确。此模式与其他软件(例如 Apache mod_authnz_ldap
和 pam_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
选项以获取替代方案。
请注意,使用 ldapscheme
或 ldaptls
仅加密 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
必须是 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
,其中 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 选项时通常需要使用带双引号的参数值,如示例中所示。