如何實現條件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(我也可以使用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
但是,在實際文件中,後面還有一些其他
required
行,例如,現在將被忽略!那麼我該如何真正解決這個問題呢?required pam_unix.so``required pam_env.so
感謝另外兩篇 SE 文章(一篇關於 SO,一篇關於 SF),答案在於使用高級
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
before includesystem-auth
,所以你不能簡單地auth [success=1 default=ignore] pam_ssh.so try_first_pass
輸入 beforelogin
’sauth include system-local-login
- 你會跳過錯誤required
並且感謝pam_unix.so use_first_pass
(而不是try_first_pass
)你仍然只能使用你的登錄密碼登錄!另一方面,通過修改system-auth
,您還允許其他服務,例如sshd
使用您的 SSH 密鑰作為登錄密碼的身份驗證選項。如果你真的只想讓你login
使用它,你幾乎必須打破include
鏈條並手動將所有auth
s 複製到login
.