这种认证方法操作起来类似于password
,只不过它使用 LDAP 作为密码验证方法。LDAP 只被用于验证用户名/口令对。因此,在使用 LDAP 进行认证之前,用户必须已经存在于数据库中。
LDAP 认证可以在两种模式下操作。在第一种模式中(我们将称之为简单绑定模式),服务器将绑定到构造成prefix
username
suffix
的可区分名称。通常,prefix
参数被用于指定 cn=
或者一个活动目录环境中的DOMAIN
\
。suffix
被用来指定非活动目录环境中的DN的剩余部分。
在第二种模式中(我们将称之为搜索与绑定模式),服务器首先用一个固定的用户名和密码(用ldapbinddn
和ldapbindpasswd
指定)绑定到 LDAP 目录 ,并为试图登入该数据库的用户执行一次搜索。如果没有配置用户名和密码, 将尝试一次匿名绑定到目录。搜索将在位于ldapbasedn
的子树上被执行,并将尝试做一次ldapsearchattribute
中指定属性的精确匹配。一旦在这次搜索中找到用户,服务器断开并且作为这个用户重新绑定到目录,使用由客户端指定的口令来验证登录是正确的。这种模式与在其他软件中的 LDAP 认证所使用的相同,例如 Apache mod_authnz_ldap
和 pam_ldap
。这种方法允许位于目录中用户对象的更大灵活性,但是会导致建立两个到 LDAP 服务器的独立连接。
下列配置选项被用于两种模式:
ldapserver
要连接的LDAP服务器的名称或IP地址。可以指定多个服务器,用空格分隔。
ldapport
要连接的LDAP服务器的端口号。如果没有指定端口,LDAP库的默认端口设置将被使用。
ldapscheme
设置为ldaps
可以使用LDAPS。这是一种非标准的在SSL之上使用LDAP的方法,在有一些LDAP服务器实现上可以支持。其他选择还可以参考ldaptls
选项。
ldaptls
设置为1以使PostgreSQL和LDAP服务器之间的连接使用TLS加密。这会按照RFC 4513使用StartTLS
操作。其他选择还可以参考ldapscheme
选项。
注意使用ldapscheme
或ldaptls
仅会加密PostgreSQL服务器和LDAP服务器之间的通信。PostgreSQL服务器和PostgreSQL客户端之间的连接仍是未加密的,除非也在其上使用SSL。
下列选项只被用于简单绑定模式:
ldapprefix
当做简单绑定认证时,前置到用户名形成要用于绑定的DN的字符串。
ldapsuffix
当做简单绑定认证时,前置到用户名形成要用于绑定的DN的字符串。
下列选项只被用于搜索与绑定模式:
ldapbasedn
当做搜索与绑定认证时,开始搜索用户的根DN。
ldapbinddn
当做搜索与绑定认证时,用户要绑定到目录开始执行搜索的DN。
ldapbindpasswd
当做搜索与绑定认证时,用户用于绑定到目录开始执行搜索的口令。
ldapsearchattribute
当做搜索与绑定认证时,在搜索中用来与用户名匹配的属性。如果没有指定属性,将会使用uid
属性。
ldapsearchfilter
在做search+bind认证时使用的搜索过滤器。$username
的出现将被替换为用户名。这允许比ldapsearchattribute
更加灵活的搜索过滤器。
ldapurl
一个RFC 4516 LDAP URL。这是一种用更紧凑和标准的形式书写某些其他LDAP选项的可选方法。格式是
ldap[s]://host
[:port
]/basedn
[?[attribute
][?[scope
][?[filter
]]]]
scope
必须是base
、one
、sub
之一,通常是最后一个(默认是base
,但它在这个应用中通常没啥用)。attribute
可以指定一个属性,在这种情况中它被用作ldapsearchattribute
的一个值。如果attribute
为空,那么filter
可以被用作ldapsearchfilter
的一个值。
URL模式ldaps
选择LDAPS方法来在SSL上建立LDAP连接,等效于使用ldapscheme=ldaps
。要使用StartTLS
操作加密LDAP连接,可以用普通的URL模式ldap
并且在ldapurl
之外指定ldaptls
选项。
对于非匿名绑定,ldapbinddn
和ldapbindpasswd
必须被指定为独立选项。
LDAP URL 当前只支持OpenLDAP,而不支持 Windows。
将简单绑定的选项中混合用于搜索与绑定的选项是一种错误。
在使用search+bind模式时,可以用ldapsearchattribute
指定的单个属性执行搜索,或者使用ldapsearchfilter
指定的自定义搜索过滤器执行搜索。指定ldapsearchattribute=foo
等效于指定ldapsearchfilter="(foo=$username)"
。如果两个选项都没有被指定,则默认为ldapsearchattribute=uid
。
如果PostgreSQL与OpenLDAP一起编译为LDAP客户端库,ldapserver
设置可能被省略。
在这种情况下,主机名和端口列表通过RFC 2782 DNS SRV记录来进行查询。
查询名称_ldap._tcp.DOMAIN
,DOMAIN
是从ldapbasedn
中摘取的。
这里是一个简单绑定 LDAP 配置的例子:
host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
当请求一个作为数据库用户someuser
到数据库服务器的连接时,PostgreSQL 将尝试使用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 格式,因此很容易共享该配置。
这里是一个search+bind配置的例子,它使用ldapsearchfilter
而不是ldapsearchattribute
来允许用用户ID或电子邮件地址进行认证:
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"
这是一个search+bind配置的例子,它使用DNS SRV discovery来查找域名example.net
的LDAP服务的主机名和端口。
host ... ldap ldapbasedn="dc=example,dc=net"
如例子中所示,由于 LDAP 通常使用逗号和空格来分割一个 DN 的不同部分,在配置 LDAP 选项时通常有必要使用双引号包围的参数值。