SSH OTP

使用 Linux PAM 和 Google Authenticator 的 PAM 模組為 SSH 登入新增基於時間的一次性程式碼。

執行前須知

此 Ubuntu 範例安裝了額外的 PAM 模組並變更了伺服器驗證。保持現有管理會話和獨立控制台或恢復存取開啟。執行前配置並測試每個帳戶;安全儲存 OTP 秘密和緊急代碼,切勿公開。同步伺服器時鐘。確認您的 SSH 用戶端支援鍵盤互動提示,並且自動化和恢復帳戶仍然可用。範例 PAM 堆疊保留通用身份驗證,這可能需要係統密碼以及 OTP:公鑰加上鍵盤互動本身並不能保證恰好兩個提示或恰好兩個因素。 PAM 檔案、政策和服務名稱因發行版而異;請勿將此範例原封不動地套用至 macOS 或 Windows 伺服器。

變更生效後,請先透過新的 SSH 工作階段確認能正常登入,並驗證預期功能。確認成功之前,請保持目前工作階段開啟,以便必要時還原設定。

驗證器應用程式

在手機上使用支援 TOTP 的驗證器掃描註冊 QR 碼,或手動輸入密鑰。請保護 QR 碼和密鑰,並妥善保存緊急復原碼。手機驗證器與伺服器上的 PAM 模組是不同的軟體。

2FAS 提供選用備份;多裝置同步屬於 Premium 功能,支援情況取決於平台與方案。

使用範例

在 Ubuntu 上安裝 PAM 模組。該模組獨立於 OpenSSH,並且需要管理員權限。

sudo apt update
sudo apt install libpam-google-authenticator

作為將使用 OTP 的每個帳戶運行註冊工具。按照互動式提示,將帳戶新增至身份驗證器應用程序,並安全地儲存緊急代碼。不要分享或記錄顯示的秘密。

google-authenticator

在現有的 SSH PAM 服務文件(通常為 /etc/pam.d/sshd)中,新增模組作為驗證規則,同時保留所有現有帳戶、會話和其他規則。該片段保留common-auth;您的 PAM 政策也可能會要求系統密碼。需要 OTP 時請勿新增 nullok。

使用 nano 開啟檔案:

sudo nano /etc/pam.d/sshd
@include common-auth
auth required pam_google_authenticator.so

將這些設定合併到有效的 SSH 伺服器配置中。這需要公鑰和 PAM 鍵盤互動驗證;現有的 Include order 或 Match 區塊可以更改結果。不要覆蓋整個配置。

使用 nano 開啟檔案:

sudo nano /etc/ssh/sshd_config
UsePAM yes
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive:pam

在應用系統的 SSH 服務重新載入程序之前驗證語法並檢查有效策略。當符合規則適用時,將 sshd -T -C 與相關使用者和位址一起使用。在關閉原始會話之前,從單獨的會話中驗證金鑰和所有提示因素。

sudo sshd -t && sudo sshd -T && sudo systemctl reload ssh

選用:公鑰加 OTP

若要在公鑰之後只輸入 OTP,須調整 SSH 的 PAM auth 規則。從 SSH PAM 服務移除 common-auth 會影響所有使用該服務的帳號,並可能略過其他驗證政策。請與管理員檢查其餘 auth 規則,保留 account 和 session 規則,以及現有登入和獨立復原管道。

以下為 Ubuntu SSH PAM 服務的示意片段,並非完整檔案。確認影響後才註解現有 common-auth;不要加入 nullok。其他 auth 規則仍可能要求額外驗證。

使用 nano 開啟檔案:

sudo nano /etc/pam.d/sshd
# /etc/pam.d/sshd: auth fragment only
# @include common-auth
auth required pam_google_authenticator.so

合併上述 SSH 設定後,檢查實際生效值;輸出鍵名為小寫。Include 順序和 Match 區塊可能影響結果;有 Match 時使用 sshd -T -C 指定連線條件。

sudo sshd -T | grep -E '^(usepam|pubkeyauthentication|kbdinteractiveauthentication|passwordauthentication|authenticationmethods) '

使用上述指令驗證並重新載入。從另一部用戶端的新工作階段,以已註冊帳號和私鑰連線,再輸入驗證器代碼。確認缺少必要金鑰或代碼時無法登入,才關閉原工作階段。提示取決於完整 PAM 政策。

ssh -i ~/.ssh/id_ed25519 alice@server.example.com

Secure Pipes 支援 SSH keyboard-interactive 提示,可輸入伺服器要求的代碼;這與 Secure Pipes 應用程式解鎖 OTP 不同。OTP 共用密鑰存在伺服器和驗證器應用程式中;Secure Pipes 不需要為此 SSH 登入儲存密鑰。

權威參考

核對日期:2026 年 10 月 27 日