21.10. LDAP 身份验证#
此身份验证方法的操作方式类似于password
,不同之处在于它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在 LDAP 可用于身份验证之前,用户必须已存在于数据库中。
LDAP 身份验证可以在两种模式下操作。在第一种模式(我们称之为简单绑定模式)中,服务器将绑定到构造为*prefix
username
suffix
的专有名称。通常,prefix
参数用于指定cn=
,或在 Active Directory 环境中指定DOMAIN
\
。suffix
*用于指定非 Active Directory 环境中 DN 的其余部分。
在第二种模式中,我们称之为搜索+绑定模式,服务器首先使用固定用户名和密码绑定到 LDAP 目录,该用户名和密码由*ldapbinddn
和ldapbindpasswd
指定,并对尝试登录数据库的用户执行搜索。如果未配置用户和密码,将尝试匿名绑定到目录。搜索将在ldapbasedn
的子树上执行,并将尝试对ldapsearchattribute
*中指定的属性执行精确匹配。一旦在此搜索中找到用户,服务器将断开连接并重新绑定到目录,作为此用户,使用客户端指定的密码,以验证登录是否正确。此模式与其他软件(例如 Apachemod_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 2782DNS SRV 记录查找主机名和端口的列表。查找名称_ldap._tcp.DOMAIN
,其中DOMAIN
从ldapbasedn
提取。
以下是简单绑定 LDAP 配置的示例
host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
当请求作为数据库用户someuser
连接到数据库服务器时,PostgreSQL 将尝试使用 DNcn=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 选项时通常需要使用带双引号的参数值,如示例中所示。