# 21.10.LDAP身份验证

此身份验证方法的操作与暗语只是它使用LDAP作为密码验证方法。LDAP仅用于验证用户名/密码对。因此,在使用LDAP进行身份验证之前,用户必须已经存在于数据库中。

LDAP身份验证可以在两种模式下运行。在第一种模式中,我们称之为简单绑定模式,服务器将绑定到构造为*前缀* 用户名 后缀.通常情况下*前缀参数用于指定cn=领域\在Active Directory环境中。后缀*用于指定非Active Directory环境中DN的剩余部分。

在第二种模式中,我们称之为搜索+绑定模式,服务器首先使用一个固定的用户名和密码绑定到LDAP目录,使用*ldapbinddnldapbindpasswd,并对试图登录数据库的用户执行搜索。如果未配置用户和密码,将尝试匿名绑定到该目录。搜索将在以下位置的子树上执行:ldapbasedn,并将尝试与中指定的属性进行精确匹配ldapsearchattribute*。一旦在此搜索中找到该用户,服务器将断开连接,并使用客户端指定的密码重新绑定到该用户所在的目录,以验证登录是否正确。此模式与其他软件(如Apache)中LDAP身份验证方案使用的模式相同mod_authnz_ldap帕姆。此方法允许用户对象在目录中的位置具有更大的灵活性,但会导致与LDAP服务器建立两个单独的连接。

以下配置选项用于两种模式:

ldapserver

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

阿尔达波特

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

ldapscheme

开始ldaps使用LDAP。这是一种通过SSL使用LDAP的非标准方式,受一些LDAP服务器实现的支持。另见ldaptls另一种选择。

ldaptls

设置为1可使PostgreSQL和LDAP服务器之间的连接使用TLS加密。这使用了StartTLS操作perRFC 4513 (opens new window).另见ldapscheme另一种选择。

注意,使用ldapschemeldaptls仅加密PostgreSQL server和LDAP服务器之间的通信量。PostgreSQL服务器和PostgreSQL客户端之间的连接仍将是未加密的,除非在那里也使用SSL。

以下选项仅在简单绑定模式下使用:

ldapprefix

在形成要绑定为的DN时,在执行简单绑定身份验证时,要在用户名前加上的字符串。

ldapsuffix

在进行简单绑定身份验证时,在形成要绑定为的DN时附加到用户名的字符串。

以下选项仅在搜索+绑定模式下使用:

ldapbasedn

在执行搜索+绑定身份验证时,使用Root DN开始搜索中的用户。

ldapbinddn

进行搜索+绑定身份验证时,要绑定到目录以执行搜索的用户的DN。

ldapbindpasswd

用户在执行搜索+绑定身份验证时绑定到目录以执行搜索的密码。

ldapsearchattribute

属性,以便在执行搜索+绑定身份验证时与搜索中的用户名匹配。如果未指定属性,则液体属性将被使用。

ldapsearchfilter

执行搜索+绑定身份验证时要使用的搜索筛选器。发生$username将替换为用户名。这使得搜索过滤器比搜索过滤器更灵活ldapsearchattribute.

ldapurl

RFC 4516 (opens new window)LDAP URL。这是以更紧凑和标准的形式编写其他一些LDAP选项的另一种方法。格式是

ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]

*范围一定是其中之一基础, , 附属的,通常是最后一个。(默认为基础,这在该应用程序中通常不有用。)属性可以指定单个属性,在这种情况下,它将用作ldapsearchattribute如果属性那是空的吗滤器*可以用作ldapsearchfilter.

URL方案ldaps选择LDAPS方法通过SSL建立LDAP连接,相当于使用ldapscheme=ldaps。要使用加密的LDAP连接,请使用StartTLS操作时,请使用正常的URL方案ldap并指定ldaptls除了ldapurl.

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

目前只有OpenLDAP支持LDAP URL,Windows不支持。

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

使用搜索+绑定模式时,可以使用指定的单个属性执行搜索ldapsearchattribute,或使用指定的自定义搜索筛选器ldapsearchfilter.具体说明ldapsearchattribute=foo相当于指定ldapsearchfilter=“(foo=$username)”.如果未指定任何选项,则默认为ldapsearchattribute=uid.

如果PostgreSQL是使用OpenLDAP作为LDAP客户端库编译的,则ldapserver可以省略设置。在这种情况下,主机名和端口列表通过RFC 2782 (opens new window)DNS SRV记录。名字_ldap_tcp。领域向上看,在哪里领域是从ldapbasedn.

下面是一个简单的绑定LDAP配置示例:

host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"

当以数据库用户身份连接到数据库服务器时某个用户请求时,PostgreSQL将尝试使用DN绑定到LDAP服务器cn=someuser,dc=example,dc=net以及客户端提供的密码。如果连接成功,将授予数据库访问权限。

以下是搜索+绑定配置的示例:

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid

当以数据库用户身份连接到数据库服务器时某个用户请求时,PostgreSQL将尝试匿名绑定(自ldapbinddn(未指定)对LDAP服务器执行搜索(uid=someuser)在指定的基本DN下。如果找到条目,它将尝试使用找到的信息和客户端提供的密码进行绑定。如果第二次连接成功,将授予数据库访问权限。

以下是作为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))"

下面是一个search+bind配置的示例,该配置使用DNS SRV发现来查找域名的LDAP服务的主机名和端口实例网:

host ... ldap ldapbasedn="dc=example,dc=net"

# 提示

由于LDAP通常使用逗号和空格分隔DN的不同部分,因此在配置LDAP选项时,通常需要使用双引号参数值,如示例所示。