Skip to content

21.10. LDAP 身份验证#

此身份验证方法的操作方式类似于password,不同之处在于它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在 LDAP 可用于身份验证之前,用户必须已存在于数据库中。

LDAP 身份验证可以在两种模式下操作。在第一种模式(我们称之为简单绑定模式)中,服务器将绑定到构造为*prefixusernamesuffix的专有名称。通常,prefix参数用于指定cn=,或在 Active Directory 环境中指定DOMAIN\suffix*用于指定非 Active Directory 环境中 DN 的其余部分。

在第二种模式中,我们称之为搜索+绑定模式,服务器首先使用固定用户名和密码绑定到 LDAP 目录,该用户名和密码由*ldapbinddnldapbindpasswd指定,并对尝试登录数据库的用户执行搜索。如果未配置用户和密码,将尝试匿名绑定到目录。搜索将在ldapbasedn的子树上执行,并将尝试对ldapsearchattribute*中指定的属性执行精确匹配。一旦在此搜索中找到用户,服务器将断开连接并重新绑定到目录,作为此用户,使用客户端指定的密码,以验证登录是否正确。此模式与其他软件(例如 Apachemod_authnz_ldappam_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 选项以获取替代方案。

请注意,使用ldapschemeldaptls仅加密 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 必须是 baseonesub 之一,通常是最后一个。(默认值为 base,在该应用程序中通常没有用。)attribute 可以指定单个属性,在这种情况下,它用作 ldapsearchattribute 的值。如果 attribute 为空,则 filter 可用作 ldapsearchfilter 的值。

URL 方案 ldaps 选择 LDAPS 方法通过 SSL 建立 LDAP 连接,等效于使用 ldapscheme=ldaps。要使用 StartTLS 操作使用加密的 LDAP 连接,请使用普通 URL 方案 ldap,并指定 ldaptls 选项以及 ldapurl

对于非匿名绑定,必须将 ldapbinddnldapbindpasswd 指定为单独的选项。

目前仅在 OpenLDAP 中支持 LDAP URL,在 Windows 中不支持。

将简单绑定配置选项与搜索+绑定选项混合使用是错误的。

使用搜索+绑定模式时,可以使用ldapsearchattribute指定的单个属性执行搜索,或使用ldapsearchfilter指定的自定义搜索过滤器执行搜索。指定ldapsearchattribute=foo等效于指定ldapsearchfilter="(foo=$username)"。如果未指定任何选项,则默认值为ldapsearchattribute=uid

如果PostgreSQL使用OpenLDAP作为 LDAP 客户端库进行编译,则可以省略ldapserver设置。在这种情况下,将通过RFC 2782DNS SRV 记录查找主机名和端口的列表。查找名称_ldap._tcp.DOMAIN,其中DOMAINldapbasedn提取。

以下是简单绑定 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 选项时通常需要使用带双引号的参数值,如示例中所示。