此身份验证方法的操作类似于 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 选项时,通常需要使用双引号括起来的参数值,如示例所示。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。