Redrock Postgres 搜索 英文
版本: 11 / 12 / 13 / 14 / 15 / 16 / 17

20.10. LDAP 认证 #

此认证方法与 password 的工作方式类似,但它使用 LDAP 作为密码验证方法。LDAP 仅用于验证用户名/密码对。因此,在 LDAP 可用于认证之前,用户必须已存在于数据库中。

LDAP 认证可以在两种模式下进行。在第一种模式中(我们称之为简单绑定模式),服务器将绑定到以 prefix username suffix 形式构建的特定名称。通常,prefix 参数用于指定 cn=,或 DOMAIN\ 在 Active Directory 环境中。在非 Active Directory 环境中,suffix 用于指定 DN 中的其余部分。

在第二种模式中,我们将称之为搜索+绑定模式,服务器首先使用固定用户名和密码绑定到 LDAP 目录,用 ldapbinddnldapbindpasswd 指定,并执行搜索,以查找试图登录到数据库的用户。如果没有配置用户和密码,将尝试对目录进行匿名绑定。搜索将在 ldapbasedn 中的子树中执行,并将尝试对 ldapsearchattribute 中指定的属性进行精确匹配。一旦在此搜索中找到用户,服务器将使用客户端指定的密码重新绑定到目录作为此用户,以验证登录是否正确。此模式与其他软件中 LDAP 认证方案使用的模式相同,例如 Apache mod_authnz_ldappam_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

在进行 search+bind 身份验证时,开始搜索用户的根 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 2782 DNS SRV 记录查找主机名和端口列表。查找名为 _ldap._tcp.DOMAIN 的名称,其中将从 ldapbasedn 提取 DOMAIN

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