如何实现条件PAM认证?

如何实现条件PAM认证?

我目前正在使用

auth required pam_unix.so try_first_pass nullok
auth optional pam_ssh.so  use_first_pass

(加上 Arch Linux 默认添加的其他一些可能不相关的条目),这意味着我的登录密码也用于尝试解锁任何存储(或链接到)的 ssh 密钥,这要~/.ssh/login-keys.d/归功于pam_ssh(如果我的登录密码没有解锁 ssh 密钥,我也可以使用try_first_pass它来获取密码提示)。

只要 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

然而,在真实的文件中还有一些其他required下列的 required pam_unix.so,例如required pam_env.so,现在将被忽略!那么我怎样才能真的解决这个问题吗?

答案1

感谢另外两篇 SE 帖子(一个就这样,顺丰一号),答案在于使用高级control语法。这

auth required pam_unix.so try_first_pass nullok
# and sometime later
auth optional pam_ssh.so  use_first_pass

因此应该成为

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

现在该行必须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

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


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

login -> system-local-login -> system-login -> system-auth

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

相关内容