我目前正在使用
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
.