SSHDはパスワード+ Google認証の組み合わせを使用してアクセスを拒否します。

SSHDはパスワード+ Google認証の組み合わせを使用してアクセスを拒否します。

私はProxMox 5.3(Debian 9stretch)ハイパーバイザーを実行しており、ハイパーバイザーへのSSHアクセスを保護したいと思います。私が見つけた文書に従いました。ここopensshにMFAを追加するために少し修正しました。つまり、次の認証方法を許可したいと思います。

  • パスワードの後に​​OATH-TOTP(google-authenticator)が続きます。
  • 公開鍵の後にOATH-TOTP(google-authenticator)が続きます。

ただし、何らかの理由で仮想マシンの1つがSSHでハイパーバイザーに接続してこの構成をテストしようとしたときにgoogle-authenticatorコードを入力するように求められませんでした。これが私が見るものです/var/log/auth.log

[root@vm1 ~]# ssh 192.168.86.2
[email protected]'s password: 
Permission denied, please try again.
root@hypervisor:~# tail -f /var/log/auth.log
...
Apr 17 08:58:53 pve1-gkh8ww1 sshd(pam_google_authenticator)[8971]: Invalid verification code
Apr 17 08:58:54 pve1-gkh8ww1 sshd[8971]: Failed password for root from 192.168.86.3 port 54948 ssh2

パスワードでログインしたので、パスワードを正しく入力したことを知っています。だから、もう少し詳細な出力のためにクライアントとサーバーの両方で実行してみました。

お客様から

debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /root/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /root/.ssh/id_dsa
debug1: Trying private key: /root/.ssh/id_ecdsa
debug1: Trying private key: /root/.ssh/id_ed25519
debug1: Next authentication method: password
[email protected]'s password: 
debug1: Authentications that can continue: publickey,password
Permission denied, please try again.

サーバー上

debug1: KEX done [preauth]
debug1: userauth-request for user root service ssh-connection method none [preauth]
debug1: attempt 0 failures 0 [preauth]
debug1: authentication methods list 0: password,keyboard-interactive
debug1: authentication methods list 1: publickey,keyboard-interactive
debug1: authentication methods list 0: password,keyboard-interactive [preauth]
debug1: authentication methods list 1: publickey,keyboard-interactive [preauth]
debug1: PAM: initializing for "root"
debug1: PAM: setting PAM_RHOST to "192.168.86.3"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: userauth-request for user root service ssh-connection method publickey [preauth]
debug1: attempt 1 failures 0 [preauth]
debug1: userauth_pubkey: test whether pkalg/pkblob are acceptable for RSA SHA256:5OtnlHMBJnFp75gii09+T8zQdJcFoHlI0wHZoL8i8wU [preauth]
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys2
debug1: Could not open authorized keys '/root/.ssh/authorized_keys2': No such file or directory
debug1: restore_uid: 0/0
Failed publickey for root from 192.168.86.3 port 54954 ssh2: RSA SHA256:5OtnlHMBJnFp75gii09+T8zQdJcFoHlI0wHZoL8i8wU

debug1: userauth-request for user root service ssh-connection method password [preauth]
debug1: attempt 2 failures 1 [preauth]
debug1: PAM: password authentication failed for root: Authentication failure
Failed password for root from 192.168.86.3 port 54954 ssh2

特に、私は顧客のこの言葉に混乱しています。

debug1: Authentications that can continue: publickey,password

これはサーバーのデバッグ出力と一致しないようです。

debug1: authentication methods list 0: password,keyboard-interactive
debug1: authentication methods list 1: publickey,keyboard-interactive

/etc/ssh/sshd_config他の必須ディレクティブとともに、サーバーに AuthenticationMethods ディレクティブを明示的に設定しました。

AuthenticationMethods password,keyboard-interactive publickey,keyboard-interactive

ChallengeResponseAuthentication yes 

PermitRootLogin yes

PasswordAuthentication yes

UsePAM yes

これは私の関連部分です/etc/pam.d/sshd

# Standard Un*x authentication.
@include common-auth
...
...
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so

ベストアンサー1

答えは簡単です。パスワード認証では2つの要素を要求することはできませんが、操作に役立つ説明を提供することができます。パスワード認証はパスワードを使用すると思います。これは正確ではありません。

「パスワード認証」は、単一のパスワードに対する簡単な要求です。サーバーがクライアントに特定のメッセージを送信していません。クライアントはプロンプトを表示する方法を選択します(たとえば、「user@hostのパスワードを入力してください」と尋ねる場合)。

「キーボードインタラクション」は、情報量に関係なく、より複雑な要求である。各メッセージについて、サーバーはリマインダータグを送信します。さらに、サーバーは予想される応答形式の説明を提供できます。サーバーは、どの入力が秘密であるか(パスワードは画面上で難読化する必要があります)、そうでないもの(OTP)を指定できます。

ほとんどの場合、キーボード対話型認証は単一の「パスワード」パスワードプロンプトを要求するために使用されるため、エンドユーザーのパスワード認証と事実上区別できません。

キーボードインタラクションは、サーバーが複数の質問/回答のペアを送信できるようにする認証メカニズムなので、Google Authenticator PAMプラグインにはパスワードとOTPという2つの質問を送信する必要があります。

したがって、パスワード認証は複数のメッセージを表示できないため、Google Authenticatorでは絶対に使用されません。 Google OTPは秘密鍵とOTPを使用してパスワードプロンプトを入力します(理想的ではありませんが)。 Google Authenticatorはキーボードを介してパスワードやOTPと対話します。 Google OTP は正しい情報を要求できないため、パスワード プロンプトを使用できません。

クライアントソフトウェアがパスワードよりもキーボード対話を優先すると、現在の設定に応じて2つのプロンプトが表示されます。これを防ぐために、パスワード認証を完全に無効にすることができます。

回避策:

サポートされている認証方法からパスワードを削除し、パスワード認証にキーボードインタラクションを使用します。/etc/ssh/sshd_config で「PasswordAuthentication no」を設定します。

だから: /etc/ssh/sshd_config

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
PubkeyAuthentication yes
# I don't use AuthenticationMethods at all and rely on my yes/no's

/etc/pam.d/sshd(下部)

auth required pam_google_authenticator.so nullok

おすすめ記事