我需要让我们的 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