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
我使用 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