这种认证方法与 password
类似,只是它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,用户必须在可以使用 LDAP 进行身份验证之前已经存在于数据库中。
LDAP 认证可以在两种模式下运行。在第一种模式中,我们将其称为简单绑定模式,服务器将绑定到构造为 prefix
username
suffix
的可分辨名称。通常,prefix
参数用于指定 cn=
,或者在 Active Directory 环境中指定 DOMAIN
\
。suffix
用于指定非 Active Directory 环境中 DN 的其余部分。
在第二种模式中,我们将其称为搜索+绑定模式,服务器首先使用固定的用户名和密码(由 ldapbinddn
和 ldapbindpasswd
指定)绑定到 LDAP 目录,并搜索尝试登录到数据库的用户。如果未配置用户和密码,则将尝试对目录进行匿名绑定。搜索将在 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 服务器之间的流量。除非也在此处使用 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
必须是 base
、 one
、 sub
之一,通常是最后一个。(默认值为 base
,在此应用程序中通常没有用处。) attribute
可以指定单个属性,在这种情况下,它将用作 ldapsearchattribute
的值。如果 attribute
为空,则 filter
可以用作 ldapsearchfilter
的值。
URL 方案 ldaps
选择 LDAPS 方法来通过 SSL 建立 LDAP 连接,等效于使用 ldapscheme=ldaps
。要使用 StartTLS
操作的加密 LDAP 连接,请使用正常的 URL 方案 ldap
并指定 ldaptls
选项以及 ldapurl
。
对于非匿名绑定,必须将 ldapbinddn
和 ldapbindpasswd
指定为单独的选项。
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 选项时,通常需要使用双引号括起来的参数值,如示例所示。
如果您在文档中看到任何不正确的内容、与您在特定功能方面的体验不符或需要进一步澄清的内容,请使用此表格报告文档问题。