# 21.10.LDAP身份验证
此身份验证方法的操作与暗语
只是它使用LDAP作为密码验证方法。LDAP仅用于验证用户名/密码对。因此,在使用LDAP进行身份验证之前,用户必须已经存在于数据库中。
LDAP身份验证可以在两种模式下运行。在第一种模式中,我们称之为简单绑定模式,服务器将绑定到构造为*前缀
* 用户名
后缀
.通常情况下*前缀
参数用于指定cn=
或领域
\
在Active Directory环境中。后缀
*用于指定非Active Directory环境中DN的剩余部分。
在第二种模式中,我们称之为搜索+绑定模式,服务器首先使用一个固定的用户名和密码绑定到LDAP目录,使用*ldapbinddn
和ldapbindpasswd
,并对试图登录数据库的用户执行搜索。如果未配置用户和密码,将尝试匿名绑定到该目录。搜索将在以下位置的子树上执行: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
另一种选择。
注意,使用ldapscheme
或ldaptls
仅加密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
.
对于非匿名绑定,ldapbinddn
和ldapbindpasswd
必须指定为单独的选项。
目前只有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选项时,通常需要使用双引号参数值,如示例所示。