我刚刚将 Arch Linux 工作站链接到我为公司设置的 Samba AD。我测试了一下,它成功了,至少我以为是这样。它接受了我的密码,创建了我的主目录和所有内容,并让我登录。我忘记测试的是它不会接受。事实证明,只要用户名有效(AD 或本地,无所谓),它就会接受任何密码。有人能指出我做错了什么吗?
我正在使用 SSSD 来管理 AD 连接。这是我的/etc/pam.d/system-auth
:
#%PAM-1.0
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_sss.so use_first_pass
auth required pam_env.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_sss.so
account required pam_permit.so
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session optional pam_mkhomedir.so umask=0077
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so
答案1
让我们详细分析您的 PAM 配置的身份验证部分。
auth sufficient pam_unix.so nullok try_first_pass
第一行内容是:“如果此测试成功,则停止进一步检查并接受登录;如果失败,则继续检查。检查配置的用户/密码/etc/passwd
。/etc/shadow
如果用户存在且密码字段为空,则允许用户进入。”这是对本地用户帐户的身份验证检查。
auth requisite pam_succeed_if.so uid >= 500 quiet
第二行内容是:“如果此测试失败,则停止进一步检查并拒绝登录;如果成功,则继续检查。用户的 UID 值必须为 500 或更大。”这可以防止使用 AD 或其他共享用户数据库中的密码登录系统帐户。
auth sufficient pam_sss.so use_first_pass
第三行写着:“如果此测试成功,则停止进一步检查并接受登录;如果失败,则继续检查。使用 SSSD 检查。”这是对 AD 帐户的检查。
auth required pam_env.so
第四行写道:“如果此行失败,则拒绝登录;但无论如何继续检查至本节末尾。设置/etc/security/pam_env.conf
和/或中描述的任何环境变量/etc/environment
。”
现在想想如果用户存在(在 AD 中或本地/etc/passwd
)但密码检查失败会发生什么。首先,pam_unix.so
失败;但这不会导致拒绝,因为这会阻止您使用任何基于 AD 的用户帐户。
因此,流程进入第二行。如果用户具有有效的 UID 映射,并且 UID 号为 500 或更大,此操作也会成功。唯一会失败的情况是 UID 小于 500。
第三行进行 AD 检查;这也失败了。但同样,“sufficient”用于允许在此之后配置任何其他身份验证方法,因此该过程继续,就像 一样pam_unix.so
。
此时,必须成功执行第四行才能允许用户进入。但这只是设置环境变量。man pam_env
告诉我pam_env.so
如果环境变量设置成功,模块将返回 PAM_SUCCESS 值。但因为这是此堆栈中的最后一个 PAM 模块,并且到目前为止其他模块都没有绝对拒绝,所以该模块的结果将成为身份验证阶段的总体结果。
为了解决这个问题,身份验证阶段需要pam_deny.so
在最后进行一个操作,当所有实际的身份验证机制都无法接受用户时,停止任何登录尝试。
此外,pam_env.so
应该在流程的早期阶段进行,以便环境变量初始化对所有有效用户都以相同的方式进行。如果这在阶段开始时不起作用auth
,那么pam_env.so
应该转到阶段session
;man pam_env
表示它将在auth
或session
阶段中起作用。
因此,我最初的建议是将auth
PAM 配置部分更改为以下内容:
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_sss.so use_first_pass
auth requisite pam_deny.so
因此,其功能如下:
- 为用户设置环境变量。如果失败,则说明存在严重问题。
- 检查本地密码;如果成功,则接受登录并结束此阶段。
- 此时拒绝任何 UID 小于 500 的用户(= 没有 root 或系统帐户使用 AD 帐户登录!)
- 在 AD 中检查密码;如果成功,则接受登录并结束此阶段。
- 如果我们到达这一点,没有任何真正的身份验证机制接受密码,因此无条件拒绝登录尝试。
如果发现将其pam_env.so
放置在阶段开始时会导致问题auth
,您可以尝试将其注释掉;似乎之前在任何有效登录时它都被跳过了。
与更改 PAM 配置时一样,首先打开系统会话并确保它sudo
已分配给 root 或具有完整的 root 权限:然后备份当前配置。进行更改但不要退出测试它:相反,通过打开另一个会话来测试它。如果失败,您仍然有原始会话登录,因此您可以在必要时轻松恢复旧配置。如果这是生产系统或其他关键系统,请打开二根会话,只是为了防止手指比大脑更快的错误。