在 freebsd 上,使用正确的凭据进行 PAM_LDAP 身份验证失败

在 freebsd 上,使用正确的凭据进行 PAM_LDAP 身份验证失败

我需要让我们的 freebsd 服务器通过 AD 进行身份验证,但这给我带来了问题。

环境:AD 后端(Win 2k8r2)。这适用于通过 SSSD
FreeBSD 9.1 为客户端服务器进行身份验证的其他 Linux 主机

我已经配置了我能想到的所有内容,并且我认为它是正确的,但是当我尝试使用 AD 帐户登录时,它失败并显示:

pam_ldap: error trying to bind as user "CN=testuser,CN=Users,DC=example,DC=com" (Invalid credentials)

所以我知道它已经通过了初始绑定,因为它带回的 DN 是正确的,并且来自 AD 服务器。当它尝试与该 DN 绑定时,它无法绑定,这导致身份验证失败。我已经在 AD 服务器上测试了测试用户的凭据,使用 ldapsearch,甚至将其设置为 ldap.conf 中的默认绑定 DN,它适用于所有测试。

我无论如何也想不通为什么初始绑定有效,但用户的绑定却失败了。

作为参考,以下是我的配置文件:

/usr/local/etc/ldap.conf

pam_login_attribute uid
base dc=example,dc=com
uri ldap://xxx.xxx.xxx.xxx/
ssl no
binddn CN=ro_user,CN=Users,DC=example,DC=com
bindpw somerandompw

/usr/local/etc/openldap/ldap.conf

pam_login_attribute uid
base dc=example,dc=com
uri ldap://xxx.xxx.xxx.xxx/
ssl no

sshd 配置文件

auth        sufficient  pam_opie.so     no_warn no_fake_prompts
auth        requisite   pam_opieaccess.so   no_warn allow_local
auth        sufficient  /usr/local/lib/pam_ldap.so  no_warn debug
auth        required    pam_unix.so     no_warn try_first_pass

account     required    pam_nologin.so
account     required    pam_login_access.so
account     required    pam_unix.so
account         required        /usr/local/lib/pam_ldap.so      no_warn ignore_authinfo_unavail ignore_unknown_user

session     required    pam_permit.so

password    required    pam_unix.so     no_warn try_first_pass

编辑:我有个想法 - 有人知道 pam_ldap 是否确实对初始绑定和身份验证绑定使用相同的绑定/身份验证过程吗?我很难理解为什么初始绑定时绑定可以成功,而身份验证绑定时绑定却失败。

答案1

我整天都在为与上述非常相似的错误而苦苦挣扎。就我而言,我看到了如下消息:

Nov 26 15:19:25 digitalocean sshd[2373]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=60.196-30-62.static.virginmediabusiness.co.uk
Nov 26 15:19:25 digitalocean sshd[2373]: pam_ldap: error trying to bind as user "cn=dan.howard,ou=users,dc=example,dc=com" (Invalid credentials)
Nov 26 15:19:27 digitalocean sshd[2373]: Failed password for invalid user dan.howard from 62.30.196.60 port 63534 ssh2

“无效凭证”在这里有点儿像是一个转移注意力的话题,而重点是“无效用户 dan.howard”。显然,NSS 会首先查找用户名,如果它无法识别该名称,那么发送到 LDAP 服务器的密码将是文字字符串“INCORRECT”,这当然是错误的,而且在我看来,这似乎是一种非常奇怪的行为(更多信息https://unix.stackexchange.com/questions/163213/while-trying-to-ssh-pam-ldap-always-sends-the-password-incorrect-causing-bind

我已看到许多教程指导我将“ldap”放入我的 /etc/nsswitch.conf 文件中的 passwd、group 和 shadow 行,然后重新启动 nscd。

我这样做了,它显示[ok],所以我看不出出了什么问题。

事实证明我根本没有安装 ldap nss 模块。我需要做的就是这样做:

apt-get 安装 libnss-ldap

然后 NSS 能够识别 LDAP 用户,这意味着 PAM 将发送正确的密码,然后我就能够登录。希望这能够对其他人有所帮助。

答案2

有几件事:

1.) 如果您对仅存在于 ldap 中的用户执行 getent passwd $username,它会拉回正确的条目吗?

2.) 您的 /etc/pam.d/system-auth 文件是什么样的。

3.) 它是否正确返回结果

ldapsearch -D $BINDDN -W -H ldap://$HOST 'uid=$RANDOM_USER'

最后,看起来你在 /usr/local/etc/ldap.conf 中的 binddn 使用的是 ro_user,而 pam 正在使用 testuser 进行身份验证。为什么会有差异。确保两者都适用于 ldapsearch

答案3

就我的情况来说,如果它能有所帮助,我忘了将ldap模块添加到/etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap
gshadow:        files ldap

相关内容