pam_ldap 在对用户进行身份验证时不尝试简单绑定

pam_ldap 在对用户进行身份验证时不尝试简单绑定

我正在尝试制作一个测试服务器,以便根据 389 目录服务器 LDAP 对用户进行身份验证。我已经安装了 nscd 和 nslcd,并让它们正常工作。类似命令getent passwd工作正常。

现在我需要配置 pam_ldap.so PAM 模块来验证用户身份。说明man ldap_conf如下:

在对用户进行身份验证或授权时,pam_ldap 首先通过搜索目录服务器将用户的登录名映射到专有名称。这必须使用在 pam_ldap.conf 中指定的本地系统身份来实现。(请注意,目前仅支持在此初始步骤中使用简单身份验证进行身份验证。)为了验证用户身份,pam_ldap 会尝试使用用户的专有名称(先前检索到)绑定到目录服务器。支持简单和 SASL 身份验证机制;在前一种情况下,应该小心使用传输安全性,以防止用户的密码以明文形式传输。

但是,在尝试验证用户身份时,pam_ldap 模块不会针对 LDAP 服务器执行 BIND 来尝试验证用户身份。

/etc/nslcd.conf:

# nslcd daemon
uid nslcd
gid ldap

# ldap servers
uri ldaps://127.0.0.1:1636/
uri ldaps://127.0.0.1:1637/
ldap_version 3

# CA certificates for server certificate verification
ssl yes
tls_cacertfile /etc/ca.pem

#TODO: for testing only
tls_reqcert never

# limits
bind_timelimit 30
timelimit 30
idle_timelimit 600

# bind and globals
binddn uid=proxytest,ou=proxies,c=gb
bindpw 123456789
base o=company,c=gb
scope sub

# users
base passwd ou=people,o=company,c=gb
scope passwd sub
filter passwd (objectClass=posixAccount)

# groups
base group ou=group,o=company,c=gb
scope group sub
filter group (objectClass=posixGroup)

/etc/openldap/ldap.conf(它有默认值,应该很好,因为我覆盖了 pam_ldap.conf 中的所有内容):

# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#URI        ldap://localhost:1389 ldap://localhost:1390
#SIZELIMIT  12
#TIMELIMIT  15
#DEREF      never
TLS_CACERTDIR   /etc/openldap/certs

/etc/pam_ldap.conf:

# @(#)$Id: ldap.conf,v 1.38 2006/05/15 08:13:31 lukeh Exp $
#
# The man page for this file is pam_ldap(5)
#
# PADL Software
# http://www.padl.com
#

base ou=people,o=company,c=gb

uri ldaps://127.0.0.1:1636/
uri ldaps://127.0.0.1:1637/
ldap_version 3

binddn uid=proxytest,ou=proxies,c=gb
bindpw 123456789

scope sub
timelimit 30
bind_timelimit 30

bind_policy hard
idle_timelimit 600

pam_filter objectclass=posixAccount
pam_login_attribute uid

# Group member attribute
pam_member_attribute memberUid

ssl on
#TODO: for testing only
tls_checkpeer no

# CA certificates for server certificate verification
tls_cacertfile /etc/ca.pem

/etc/nsswitch.conf:

...
passwd:     files ldap
shadow:     files ldap
group:      files ldap
...

使用此配置,身份验证工作正常。问题是服务器使用 pam_unix 模块(通过 nss)从 LDAP 服务器读取用户的影子信息 - 这实际上意味着模块从 LDAP 中读取用户密码并在本地进行比较。这是我所不希望发生的事情。查看 LDAP 日志(以及未加密的网络流量)时,没有证据表明系统尝试在尝试登录的用户下进行绑定:

[19/May/2017:15:20:19 +0200] conn=213 op=0 BIND dn="uid=proxytest,ou=proxies,c=gb" method=128 version=3
[19/May/2017:15:20:19 +0200] conn=213 op=0 RESULT err=0 tag=97 nentries=0 etime=0 dn="uid=proxytest,ou=proxies,c=gb"

[19/May/2017:15:20:19 +0200] conn=213 op=1 SRCH base="ou=people,o=company,c=gb" scope=2 filter="(&(objectClass=posixAccount)(uid=test))" attrs="userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory"
[19/May/2017:15:20:19 +0200] conn=213 op=1 RESULT err=0 tag=101 nentries=1 etime=0

[19/May/2017:15:20:19 +0200] conn=205 op=12 SRCH base="ou=people,o=company,c=gb" scope=2 filter="(&(objectClass=posixAccount)(uid=test))" attrs="uid"
[19/May/2017:15:20:19 +0200] conn=205 op=12 RESULT err=0 tag=101 nentries=1 etime=0

[19/May/2017:15:20:19 +0200] conn=205 op=13 SRCH base="ou=group,o=company,c=gb" scope=2 filter="(&(objectClass=posixGroup)(|(memberUid=test)(uniqueMember=uid=test,ou=people,o=company,c=gb)))" attrs="cn userPassword memberUid gidNumber uniqueMember"
[19/May/2017:15:20:19 +0200] conn=205 op=13 RESULT err=0 tag=101 nentries=0 etime=0 notes=U

即使重新排列 PAM 模块,使pam_ldap.so前面的模块运行pam_unix.so也不会影响此行为。我正在 CentOS 6.8 x86_64 上尝试使用此方法pam_ldap-185-11.el6.x86_64,以及其他库:

rpm -qa | grep -E "ldap|nss|nscd|nslc"
apr-util-ldap-1.3.9-3.el6_0.1.x86_64
openldap-2.4.40-16.el6.x86_64
pam_ldap-185-11.el6.x86_64
nss-util-3.28.4-1.el6_9.x86_64
nss-sysinit-3.28.4-1.el6_9.x86_64
nss-pam-ldapd-0.7.5-32.el6.x86_64
openldap-clients-2.4.40-16.el6.x86_64
nss-3.28.4-1.el6_9.x86_64
nss-tools-3.28.4-1.el6_9.x86_64
nscd-2.12-1.209.el6_9.1.x86_64
nss-softokn-freebl-3.14.3-23.3.el6_8.x86_64
nss-softokn-3.14.3-23.3.el6_8.x86_64

另外,相关的pam.d配置:

cat /etc/pam.d/password-auth
#%PAM-1.0
auth        required      pam_warn.so
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so

有没有办法强制 pam_ldap.so 模块在用户下进行 LDAP 绑定uid=test,ou=people,o=company,c=gb?我知道库将首先在 LDAP 中查找其 DN,我对此完全没意见。我目前没有主意,所以即使是提示也值得赞赏。:)

答案1

这实际上是“周末”问题。有问题的配置运行正常。

这里的重点是,有两个 LDAP 服务器,并且碰巧的是,操作是BIND uid=test,ou=people,o=company,c=gb针对我正在研究的另一个 ldap 执行的(实际上有 20 次或更多次;运气不好)。也没有出现在网络转储中,因为我设法在 tcpdump 的 BPF 中犯了一个错误。

相关内容