Password

如何實現條件PAM認證?

  • October 29, 2015

我目前正在使用

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 include system-auth,所以你不能簡單地auth [success=1 default=ignore] pam_ssh.so try_first_pass輸入 before login’s auth include system-local-login- 你會跳過錯誤required並且感謝pam_unix.so use_first_pass(而不是try_first_pass)你仍然只能使用你的登錄密碼登錄!另一方面,通過修改system-auth,您還允許其他服務,例如sshd使用您的 SSH 密鑰作為登錄密碼的身份驗證選項。如果你真的只想讓你login使用它,你幾乎必須打破include鏈條並手動將所有auths 複製到login.

引用自:https://unix.stackexchange.com/questions/239485