受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

20.10. LDAP 认证 #

这种认证方法的工作方式与 password 类似,只不过它使用 LDAP 作为密码验证方法。LDAP 只用于验证用户名/密码对。因此,在使用 LDAP 进行认证之前,用户必须已经存在于数据库中。

LDAP 认证可以在两种模式下工作。第一种模式称为简单绑定模式,服务器会绑定到按 prefix username suffix 形式构造出的可分辨名称。通常,prefix 参数用于指定 cn=,或在 Active Directory 环境中指定 DOMAIN\suffix 则用于指定非 Active Directory 环境中 DN 的剩余部分。

第二种模式称为搜索+绑定模式,服务器首先使用由 ldapbinddnldapbindpasswd 指定的固定用户名和密码绑定到 LDAP 目录,并搜索试图登录数据库的用户。如果没有配置用户名和密码,则会尝试对目录进行匿名绑定。搜索会在 ldapbasedn 指定的子树上进行,并尝试对 ldapsearchattribute 指定的属性做精确匹配。一旦在搜索中找到了该用户,服务器就会作为该用户重新绑定到目录,并使用客户端指定的密码来验证登录是否正确。这种模式与 Apache mod_authnz_ldappam_ldap 等软件中的 LDAP 认证方案相同。这种方法使目录中用户对象的位置更具灵活性,但会对 LDAP 服务器额外发起两次请求。

以下配置选项在两种模式下都使用:

ldapserver #

要连接的LDAP服务器的名称或IP地址。可以指定多个服务器,用空格分隔。

ldapport #

要连接的LDAP服务器的端口号。如果未指定端口,则将使用LDAP库的默认端口设置。

ldapscheme #

设置为ldaps以使用LDAPS。这是一种非标准的使用LDAP 进行SSL加密的方式,受一些LDAP服务器实现支持。另请参阅ldaptls 选项作为替代。

ldaptls #

设置为1以使PostgreSQL和LDAP服务器之间的连接使用TLS加密。这使用 StartTLS操作,参见RFC 4513。 另请参阅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选择了通过SSL进行LDAP连接的LDAPS方法,相当于使用ldapscheme=ldaps。要使用StartTLS操作进行加密LDAP连接,请使用正常的URL方案ldap并另外指定ldaptls选项。

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

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

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

在使用搜索+绑定模式时,可以用ldapsearchattribute 指定的单个属性执行搜索,也可以用ldapsearchfilter 指定的自定义搜索过滤器执行搜索。指定 ldapsearchattribute=foo等价于指定 ldapsearchfilter="(foo=$username)"。如果这两个选项都未 指定,默认值是ldapsearchattribute=uid

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

下面是一个简单绑定 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将尝试匿名绑定到 LDAP 服务器 (因为未指定ldapbinddn),并在指定的基础 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"

Tip

如示例中所示,由于 LDAP 通常使用逗号和空格来分割一个 DN 的不同部分,在配置 LDAP 选项时通常有必要使用双引号包围的参数值。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。