如何实现有条件的PAM认证?

Tob*_*ler 5 password pam

我目前正在使用

auth required pam_unix.so try_first_pass nullok
auth optional pam_ssh.so  use_first_pass
Run Code Online (Sandbox Code Playgroud)

(加上 Arch Linux 默认添加的其他一些可能不相关的条目),这意味着我的登录密码也用于尝试解锁任何存储(或链接到)的 ssh 密钥,~/.ssh/login-keys.d/感谢pam_ssh(我也可以使用它try_first_pass来代替密码提示不应该通过我的登录密码解锁 ssh 密钥)。

只要 SSH 密钥密码与登录密码相同,此方法就可以正常工作。不过,我会实现的是,我基本上可以用两种方法之一登录不同的密码-无论是我的登录一个SSH密钥之一。

所以我认为pam_ssh应该首先尝试解锁我的 SSH 密钥,并且只有在失败时才pam_unix需要,否则应该跳过。这可以以某种方式实现吗?


起初我认为解决方案在于pam_ssh先放,但另外它必须被制作sufficient而不是optional

auth sufficient pam_ssh.so  try_first_pass
auth required pam_unix.so try_first_pass nullok
Run Code Online (Sandbox Code Playgroud)

但是,在实际文件中,后面还有一些其他required行,例如,现在将被忽略!那么我怎样才能真正解决这个问题呢? required pam_unix.sorequired pam_env.so

Tob*_*ler 7

感谢另外两篇 SE 帖子(一篇在 SO 上一篇在 SF 上),答案在于使用高级control语法。这

auth required pam_unix.so try_first_pass nullok
# and sometime later
auth optional pam_ssh.so  use_first_pass
Run Code Online (Sandbox Code Playgroud)

因此应该成为

auth [success=1 new_authtok_reqd=1 ignore=ignore default=ignore] pam_unix.so try_first_pass nullok
auth required pam_ssh.so use_first_pass
Run Code Online (Sandbox Code Playgroud)

现在,该pam_ssh行必须正好位于该行之前pam_unix,因为这success=N意味着跳过N后面的模块。

另外,不要忘记session pam_ssh.so排队!


在我的第一次尝试中,我使用了

auth [success=1 default=ignore] pam_ssh.so try_first_pass
auth required pam_unix.so use_first_pass nullok
Run Code Online (Sandbox Code Playgroud)

相反,但这种方法会锁定所有没有 SSH 密钥的用户!事实证明这default=ignore还不够,auth_err=ignore必须添加,因为这显然被视为default. 此外,这种尝试意味着根据用户是否拥有SSH 密钥,将出现“密码”或“SSH 密码”提示!


请注意,在 Arch Linux 中,所pam_unix使用的行login位于include链中

login -> system-local-login -> system-login -> system-auth
Run Code Online (Sandbox Code Playgroud)

system-login有一些其他的required 之前,包括system-auth,所以你不能简单地把auth [success=1 default=ignore] pam_ssh.so try_first_pass之前loginauth include system-local-login-你会跳过错误的required,并感谢pam_unix.so use_first_pass(而不是try_first_pass),你仍然可以只与您的登录密码登录!另一方面,通过修改system-auth,您还允许其他服务,例如sshd使用您的 SSH 密钥作为登录密码的身份验证选项。如果你真的只想你login使用它,你必须打破include链并手动将所有auths复制到login.