我试图了解 FreeBSD 10.0 上的 PAM 配置中哪些行为出现了错误
该机器配置了两个不同的身份验证领域,一个是默认的 Unix 身份验证,另一个使用系统安全服务守护进程(sssd)。
此时我正在使用此配置,/etc/pam.d/sshd
因为我只想允许 sssd 从 ssh 登录。
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_sss.so
#auth sufficient pam_krb5.so no_warn try_first_pass
#auth sufficient pam_ssh.so no_warn try_first_pass
auth required pam_unix.so no_warn use_first_pass
# account
account required pam_nologin.so
#account required pam_krb5.so
account required pam_login_access.so
account required /usr/local/lib/pam_sss.so ignore_unknown_user
account required pam_unix.so
# session
#session optional pam_ssh.so want_agent
session optional /usr/local/lib/pam_sss.so
session optional /usr/local/lib/pam_mkhomedir.so mode=0700
session required pam_permit.so
# password
password sufficient /usr/local/lib/pam_sss.so use_authtok
#password sufficient pam_krb5.so no_warn try_first_pass
password required pam_unix.so no_warn try_first_pass
如果我理解正确的话,当 sssd 用户登录机器时,它会碰到这条auth sufficient /usr/local/lib/pam_sss.so
线,因此sufficient
它会毫无问题地登录。当本地用户帐户尝试登录时,它会在 sssd 检查中失败,但会成功pam_unix.so
使用第一次输入的密码,而无需再次输入密码。
但事实并非如此。要成功以本地帐户身份登录,我必须use_first_pass
从pam_unix.so
auth realm 中的选项中删除,当用户登录时,系统首先要求输入 sssd 帐户,但由于本地用户不存在于外部身份验证服务中,因此失败。然后系统再次要求输入相同的密码,但在模块上进行身份验证pam_unix.so
。最后授予访问权限。
例如,它的行为方式如下:
ssh sssd-test.example.com -l local-user-account
Password:
Password for [email protected]:
Last login: Sat May 24 16:22:40 2014 from 192.168.1.100
FreeBSD 10.0-RELEASE-p1 (GENERIC) #0: Tue Apr 8 06:45:06 UTC 2014
Welcome to FreeBSD!
$
我不太清楚为什么会发生这种情况,也不清楚这是否与会话有关account
。就我对 PAM 的理解而言,配置应该是正确的。
提前致谢,
答案1
嗯,我关于 PAM 工作原理的前提是正确的。
该pam_sss.so
模块期望该参数forward_pass
传递到其他 PAM 模块的密码,就像该pam_unix.so
模块一样。因此,只需使用此选项即可完成工作。结果行是:
auth sufficient /usr/local/lib/pam_sss.so forward_pass
这又导致了另一个问题。如果 sssd 或 sssd 的身份验证域关闭,您将无法登录,因为模块pam_sss.so
将无法正常工作,因此密码将无法转发。
因此,显而易见的选择是将其放在pam_unix.so
前面pam_sss.so
,让一切都“充分”,并在末尾加上 nicely pam_deny.so
。这是 Linux 解决问题的方法,但这似乎在 FreeBSD 上不起作用。
在通过邮件列表进行搜索后,我们发现在 FreeBSD 上执行此操作的正确方法是使用 PAM 中的奇怪顺序:
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
auth sufficient pam_unix.so no_warn
auth sufficient /usr/local/lib/pam_sss.so use_first_pass
auth required pam_unix.so no_warn use_first_pass
因此,pam_unix.so
在 PAM 中输入两次,第一次输入 as,sufficient
最后一次输入 as,这样required
就成功了。我不知道为什么会发生这种情况,但它确实有效,而且似乎是正确的做法。