SSH OTP
Linux PAM と Google Authenticator の PAM モジュールを使用して、時間ベースのワンタイム コードを SSH ログインに追加します。
実行前の確認
この Ubuntu の例では、追加の PAM モジュールをインストールし、サーバー認証を変更します。既存の管理セッションと独立したコンソールまたは回復アクセスを開いたままにしておきます。適用前に各アカウントを構成してテストします。 OTP シークレットおよび緊急コードは安全に保管し、決して公開しないでください。サーバーの時計を同期します。 SSH クライアントがキーボード対話型プロンプトをサポートしていること、および自動化アカウントと回復アカウントが引き続き使用できることを確認します。サンプル PAM スタックは共通認証を保持します。これには OTP だけでなくシステム パスワードも必要になる場合があります。公開キーとキーボード インタラクティブだけでは、正確に 2 つのプロンプトまたは正確に 2 つの要素を保証しません。 PAM ファイル、ポリシー、サービス名はディストリビューションによって異なります。この例を変更せずに macOS または Windows サーバーに適用しないでください。
変更を適用したら、新しい SSH セッションでログインと期待する動作を確認してください。確認が成功するまで現在のセッションを開いたままにしておくと、必要に応じて設定を復旧できます。
認証アプリ
スマートフォンの TOTP 対応認証アプリで登録用 QR コードを読み取るか、シークレットを手入力します。QR コードとシークレットを保護し、緊急復旧コードを安全に保管してください。認証アプリとサーバーの PAM モジュールは別のソフトウェアです。
2FAS は任意のバックアップに対応し、複数デバイス間の同期は Premium 機能です。対応状況はプラットフォームとプランにより異なります。
使用例
Ubuntu に PAM モジュールをインストールします。このモジュールは OpenSSH とは別のものであり、管理者権限が必要です。
sudo apt update
sudo apt install libpam-google-authenticatorOTP を使用する各アカウントとして登録ツールを実行します。インタラクティブなプロンプトに従い、アカウントを認証アプリに追加し、緊急コードを安全に保存します。表示されたシークレットを共有したり記録したりしないでください。
google-authenticator既存の SSH PAM サービス ファイル (通常は /etc/pam.d/sshd) に、既存のアカウント、セッション、その他のルールをすべて保持しながら、モジュールを認証ルールとして追加します。このフラグメントは共通認証を保持します。 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_configUsePAM 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 設定を調整します。common-auth の削除は SSH サービスを使う全アカウントに影響し、他の認証ポリシーを迂回する可能性があります。管理者と残りの 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) '上記のコマンドで検証して再読み込みします。別のクライアントセッションから登録済みアカウントと秘密鍵で接続し、認証アプリのコードを入力します。必要な鍵またはコードなしではログインできないことを確認してから、元のセッションを閉じてください。
ssh -i ~/.ssh/id_ed25519 alice@server.example.comSecure Pipes は SSH の keyboard-interactive プロンプトに対応し、サーバーが要求するコードを入力できます。アプリのロック解除用 OTP とは別です。OTP の共有シークレットはサーバーと認証アプリにあり、この SSH ログインのために Secure Pipes に保存する必要はありません。
公式リファレンス
確認日:2026年10月27日