我出於個人興趣而嘗試使用 MFA,但遇到了一個我無法解決的問題。我最近設定了 PAM(使用 Google Authenticator),並希望將其與另一種類型的身份驗證結合。
我有幾個帳戶和 sshd_config 如下:
PasswordAuthentication no
PermitEmptyPasswords no
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
UsePAM yes
Match User user2
PasswordAuthentication yes
AuthenticationMethods password,keyboard-interactive
對於除“user2”之外的所有用戶,我可以使用金鑰和驗證碼正確進行身份驗證。然而,嘗試與“user2”連接時出現問題。嘗試從客戶端連線時,我正確地收到了密碼和驗證碼提示。但預期的密碼不是「user2」帳號密碼(假設是「hunter2」),而是在應用程式中看到的驗證碼:
$ ssh user2@machine -p port
user2@machine's password:
當我在密碼提示中輸入“hunter2”時,我被拒絕了。但是,如果我輸入應用程式中看到的驗證碼,我會看到下一個提示:
$ ssh user2@machine -p port
user2@machine's password:
Verification Code:
當然,這需要再次輸入驗證碼。然後我就全部登入了。
我在 user2-block 中嘗試了幾種不同的組合:
Match User user2
PasswordAuthentication yes
AuthenticationMethods password
上面需要在密碼提示中輸入驗證碼,如上,這使我在驗證碼提示之前成功登入。
我的 /etc/pam.d/sshd 檔案完全不受影響,除了新增:
auth required pam_google_authenticatior.so
並註解掉
@include common-auth
->
#@include common-auth
auth required pam_google_authenticatior.so
答案1
這是 OpenSSH 的正常結果。兩者password
和keyboard-interactive
在設計上使用 PAM,並且它們都呼叫完全相同的 PAM 堆疊。(畢竟,您確實有“UsePAM yes”,這意味著您告訴它使用 PAM 進行密碼驗證,因此它會盡職盡責地調用 PAM 來驗證它認為的密碼。)因此,它們都將接受相同的輸入。
這兩種機制之間的唯一區別在於,只有「鍵盤互動」實際上允許 PAM 連續顯示多個提示,或更改正在顯示的提示文字。同時,「密碼」是一種固定格式的機制——有不發送到 SSH 客戶端的實際「提示」;它只要求您輸入一個密碼,僅此而已。
換句話說,結合這兩種機制是沒有用的——你無法讓 OpenSSH 單獨驗證密碼和令牌,要么全有要么全無。 (儘管已經多次提出在 OpenSSH 中指定兩個不同 PAM 堆疊的能力,但到目前為止還沒有接受此類補丁。)