21.10. LDAP 身份验证#
此身份验证方法的操作方式类似于password,不同之处在于它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在 LDAP 可用于身份验证之前,用户必须已存在于数据库中。
LDAP 身份验证可以在两种模式下操作。在第一种模式(我们称之为简单绑定模式)中,服务器将绑定到构造为*prefixusernamesuffix的专有名称。通常,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更灵活的搜索过滤器。ldapurlRFC 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 选项时通常需要使用带双引号的参数值,如示例中所示。
