Pam 身份验证,先尝试本地用户,然后尝试 LDAP

Pam authentication, try first local user and then LDAP

我使用 nslcd deamon 在 RH5 上设置了一个 pam 身份验证,指向 Oracle Unified Directory。

我希望首先尝试对本地用户进行身份验证,如果没有找到用户,则尝试联系 LDAP。所以我以这种方式编辑了 /etc/nsswitch.conf

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

但这似乎不起作用,因为如果 LDAP 服务器关闭,我将无法登录服务器。

我是不是漏掉了什么?

编辑:

这是我的 PAM /etc/pam.d/system-auth(我没有使用 sssd,只使用 nslcd)。

#%PAM-1.0
# This file is auto-generated.
auth      required      pam_env.so
auth      sufficient    pam_unix.so nullok
auth      sufficient    pam_ldap.so  use_first_pass ignore_authinfo_unavail
auth      required      pam_deny.so

account   required      pam_unix.so broken_shadow
account   required      pam_ldap.so ignore_unknown_user ignore_authinfo_unavail
account   required      pam_permit.so

password  requisite     pam_cracklib.so try_first_pass retry=3
password  sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password  required     pam_ldap.so try_first_pass ignore_unknown_user ignore_authinfo_unavail
password  required     pam_deny.so

session   optional      pam_keyinit.so revoke
session   required      pam_limits.so
session   optional      pam_mkhomedir.so skel=/etc/skel umask=077
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   ignore_authinfo_unavail

我将系统身份验证设置为调试,结果如下:

Dec 20 17:46:38 <hostname> nscd: nss_ldap: failed to bind to LDAP server ldap://<dns_1>:3389: Can't contact LDAP server
Dec 20 17:46:38 <hostname> nscd: nss_ldap: failed to bind to LDAP server ldap://<dns_2>:3389: Can't contact LDAP server
Dec 20 17:46:38 <hostname> nscd: nss_ldap: failed to bind to LDAP server ldap://<ip_1>:3389: Can't contact LDAP server
Dec 20 17:46:38 <hostname> nscd: nss_ldap: failed to bind to LDAP server ldap://<ip_2>:3389: Can't contact LDAP server

我还没有找到答案。它仍在尝试联系 LDAP 服务器,但我在 /etc/ldap.conf 中添加了 nss_initgroups_ignoreusers 指令。因此,对于在该指令中声明的用户,即使所有 LDAP SERVICE 都已关闭,您也可以登录机器。

此指令仅在 LDAP 服务已关闭但机器已启动时才有效 & 运行导致它仍然尝试绑定 LDAP 服务器。

为了避免空闲超时,您还必须将此指令 idle_timelimit 添加到 /etc/ldap.conf,以便在 ack 知识失败时使与 LDAP 服务器的连接超时。

无论如何,这是两个解决方法,并不是问题的解决方案。

我发现了问题。

解决方案是更改 /etc/pam.d/systhem-auth-ac 中的这一行:

account   required      pam_unix.so broken_shadow

进入这个:

account   sufficient      pam_unix.so broken_shadow

如果您也有该文件,请务必更改 /etc/pam.d/password-auth-ac 中的相同指令。现在通过 nss_initgroups_ignoreusers 的白名单应该可以正常工作了。

编辑(几年后):问题在于,由于 pam 身份验证是级联的,如果您已经拥有本地帐户,则没有理由继续使用帐户服务。所以第一行 (pam_unix.so) 足以进行身份​​验证。以前堆栈还检查 pam_ldap.so 因为所有三行都需要登录,如果 ldap 服务关闭或无法访问,身份验证堆栈就会中断。

对于 Debian 上的任何人

diff /etc/pam.d/common-account ...
...
+account        [success=done new_authtok_reqd=done default=ignore]     pam_unix.so 
-account        [success=1 new_authtok_reqd=done default=ignore]        pam_unix.so