📕

EC2 Instance Connect で Too many authentication failures が発生した場合の対処

2025/01/17に公開

はじめに

EC2 Instance Connect を用いた作業時に Too many authentication failures でSSH接続ができなくなる問題に遭遇しました。

特に設定を変えたわけでもなく、少し前までは接続できていた状況であったため困惑しましたが、同じ問題に遭遇した方のために解決方法を共有します。

要約

ssh-agent に無効となった一時的な鍵情報が溜まっていることが問題なので、これを ssh-add -D などで削除することで解決します。

解説

前提条件

EC2 Instance Connect Endpoint (以下EICE)を使用してEC2インスタンスに対してSSH接続する状況を想定しています。EICEの準備やセキュリティグループなどの設定はすでに完了しているものとします。

EC2インスタンスは Amazon Linux 2023 (2023.6.20250114) で構築されたLinuxサーバで、デフォルトユーザである ec2-user としてAWS CLIを使用してSSH接続します。

発生した状況

以下のようなコマンドを使用してEICE経由でSSH接続を試みます。

$ aws ec2-instance-connect ssh --instance-id i-0b8bee87952ee1a2d --connection-type eice --region ap-northeast-1

aws ec2-instance-connect ssh コマンドでSSH接続すると、一時的に生成されたキーペアの公開鍵が EC2 Instance Connect API を用いてインスタンスメタデータに60秒間有効なものとして登録されます[1]。これにより秘密鍵を管理することなくEC2インスタンスへ接続できます。

さて、通常であればSSH接続が確立されてLinuxサーバのプロンプトが表示されるところですが、問題が発生した場合には以下のように Too many authentication failures というエラーが表示されて接続に失敗します。

Received disconnect from UNKNOWN port 65535:2: Too many authentication failures
Disconnected from UNKNOWN port 65535

原因の調査

原因を調査するためにデバッグ出力を有効にして再度接続を試みます。デバッグ出力は --debug オプションを付加することで有効化されます。

$ aws ec2-instance-connect ssh --instance-id i-0b8bee87952ee1a2d --connection-type eice --region ap-northeast-1 --debug

通信ログなど大量のメッセージが出力され、 SendSSHPublicKey で公開鍵が転送されていることなどが分かります。ここでは終盤のメッセージに注目します。

...
debug1: get_agent_identities: bound agent to hostkey
debug1: get_agent_identities: agent returned 6 keys
debug1: Will attempt key:  ED25519 SHA256:lz8gzDKHcP9hP8Db+fsU8e/YFpiV8vYMdCIsv40yZZs agent
debug1: Will attempt key:  ED25519 SHA256:B25JBOvkQ05uXzOhtbHWwIA649u+gkanMTxGnVcfwcU agent
debug1: Will attempt key:  ED25519 SHA256:ib0YCbdrfWQAodUzwtCTvOxfcO+hr8xFoJ1/CFJNBAg agent
debug1: Will attempt key:  ED25519 SHA256:ZsmAwTQBD1Rd4ORfmxWkEyY5KrkS3aLtyb/US9UWgjY agent
debug1: Will attempt key:  ED25519 SHA256:YN4ao9v66HoVVCY8V8M4VJQwVC5F322HSRGmnVvEMLU agent
debug1: Will attempt key:  ED25519 SHA256:kiQMdxt2BxYkO8XGB4c0AKpn59Xm2iJtJyr5sUMVEC4 agent
debug1: Will attempt key: /var/folders/f5/dv7p_0kd30j6rrv_vkgzs57w0000gp/T/tmpepkp968u/private-key ED25519 SHA256:0axdUq/JWGvGpQ97pm9rMf4uVik1c6eRL2RYtLCBHZI explicit
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,sk-ssh-ed25519@openssh.com,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ecdsa-sha2-nistp256@openssh.com,webauthn-sk-ecdsa-sha2-nistp256@openssh.com>
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Next authentication method: publickey
debug1: Offering public key:  ED25519 SHA256:lz8gzDKHcP9hP8Db+fsU8e/YFpiV8vYMdCIsv40yZZs agent
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering public key:  ED25519 SHA256:B25JBOvkQ05uXzOhtbHWwIA649u+gkanMTxGnVcfwcU agent
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering public key:  ED25519 SHA256:ib0YCbdrfWQAodUzwtCTvOxfcO+hr8xFoJ1/CFJNBAg agent
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering public key:  ED25519 SHA256:ZsmAwTQBD1Rd4ORfmxWkEyY5KrkS3aLtyb/US9UWgjY agent
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering public key:  ED25519 SHA256:YN4ao9v66HoVVCY8V8M4VJQwVC5F322HSRGmnVvEMLU agent
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Offering public key:  ED25519 SHA256:kiQMdxt2BxYkO8XGB4c0AKpn59Xm2iJtJyr5sUMVEC4 agent
Received disconnect from UNKNOWN port 65535:2: Too many authentication failures
Disconnected from UNKNOWN port 65535

debug1: get_agent_identities: agent returned 6 keys ではssh-agentから6件の鍵情報が返っていることが分かります。これに一時的に作成された秘密鍵 /var/folders/f5/(中略)/T/tmpepkp968u/private-key を加えて全部で7つの鍵が debug1: Will attempt key: ... として表示されています。

続くメッセージを確認すると、これらの鍵を順番に使って接続試行していますが、先頭の6つは過去の接続時に作成された一時的な秘密鍵のため既に有効期間を超過しており接続に失敗します。そして、6回接続試行に失敗した時点で Too many authentication failures を出力して中断されているようです。今回の接続向けに一時的に作成された鍵は使用されませんでした。

ssh-agentが保持している鍵リストを確認すると、先ほどのデバッグメッセージで出力されたFingerprintと同じ鍵を保持していることが分かります。

$ ssh-add -l
256 SHA256:lz8gzDKHcP9hP8Db+fsU8e/YFpiV8vYMdCIsv40yZZs  (ED25519)
256 SHA256:B25JBOvkQ05uXzOhtbHWwIA649u+gkanMTxGnVcfwcU  (ED25519)
256 SHA256:ib0YCbdrfWQAodUzwtCTvOxfcO+hr8xFoJ1/CFJNBAg  (ED25519)
256 SHA256:ZsmAwTQBD1Rd4ORfmxWkEyY5KrkS3aLtyb/US9UWgjY  (ED25519)
256 SHA256:YN4ao9v66HoVVCY8V8M4VJQwVC5F322HSRGmnVvEMLU  (ED25519)
256 SHA256:kiQMdxt2BxYkO8XGB4c0AKpn59Xm2iJtJyr5sUMVEC4  (ED25519)

また、 Amazon Linux 2023 (2023.6.20250114) には OpenSSH 8.7 がインストールされており、接続失敗上限である MaxAuthTries の設定は 6 (初期値)となっていたため、6回の接続失敗でエラーになっている現状とも合致します。

$ sudo sshd -T | grep maxauthtries
maxauthtries 6

以上のことから、この接続失敗は ssh-agentが無効な鍵を保持し続けており、これらの鍵を用いて接続試行するため発生する ことが分かりました。

問題への対処検討

エラー原因の解消

原因が判明したのでエラーを解消していきます。 ssh-agent が無効な鍵を保持しているのであれば、それを削除することで問題は解決するはずです。

ssh-agent の保持している鍵を削除するには ssh-add-D オプションを指定して全ての鍵情報を削除します(キャッシュされた情報が削除されるだけなので元の鍵への影響などはありません)。コマンドを実行後に再度接続してみると元通り接続可能となることが分かるでしょう。

$ ssh-add -D
All identities removed.

なお、 ssh-add には -d オプションで個別に削除する手段も用意されていますが、これには鍵ファイルの指定が必要となり一時的なキーペアのパスの指定が難しいため今回は使えません。

根本的な対策・回避策

本問題への根本対策等が可能であるかも検討してみます。今回の接続失敗については、全ての環境で発生する問題ではなく筆者の環境に固有の条件も存在します。

まずは、筆者の環境では ~/.ssh/config に以下のような設定が記載されており、全てのホストへのSSH接続時に自動で ssh-agent に鍵を追加するようになっています。これによって EC2 Instance Connect での接続時にも毎回鍵が追加されていました。

Host *
  AddKeysToAgent yes

「EC2 Instance Connectで接続時のみ無効」という設定は書きづらいですが、今回のユースケースではVPCのSubnetが限定的であるため以下のような指定で回避できます。なお、SSHの設定ファイルでは先に指定した設定が優先されるため、 Host * などでの指定がある場合にはそれよりも上に記述します。

Host 10.1.*
  AddKeysToAgent no

Host *
  AddKeysToAgent yes

また、ssh-agentが無効な鍵を継続して保持することが問題であるため、これを一定時間で削除などできれば問題ないとも考えられます。最も単純な考えとしてはlaunchdやsystemd,cronなどの定期実行可能な仕組みで ssh-add -D を実行することが考えられますが、不要な場合でも常時動作していることや無関係な鍵情報まで削除されるためあまり良い方法ではないでしょう。

OpenSSH 8.4以降では、 AddKeysToAgentyes / no ではなく鍵の保持期間を指定できるようになったため、先ほどの設定を以下のように修正することで対象ホストへの接続時に使用する鍵は60秒間のみ保持されるようになります[2]。時間指定の記法はsshd_config(5)のTIME_FORMATSに準じます。

Host 10.1.*
  AddKeysToAgent 60s

まとめ

EC2 Instance Connect の仕組みと、OpenSSH設定の相互作用により、この問題は発生します。

  1. EC2 Instance Connectは接続のたびに新しい一時的な鍵を生成する
  2. AddKeysToAgentがyesの場合、これらの鍵が自動的にssh-agentに追加される
  3. 鍵は60秒で無効になるが、ssh-agentからは自動的に削除されない
  4. OpenSSHは認証時に保持している全ての鍵を試行する
  5. MaxAuthTriesの制限(デフォルト6回)に到達してエラーが発生する

この問題に遭遇した場合は、以下のコマンドで鍵情報を消去することで解決できます。

ssh-add -D

また、再発を防ぐためにはSSHの設定ファイルで特定のサブネットに対して AddKeysToAgent 60s (OpenSSH 8.4以降)、あるいは AddKeysToAgent no などを指定することで一時的な鍵を継続的に保持しないようにする対策が有効です。

本記事が、同様の問題で困っている方の助けになれば幸いです。

脚注
  1. https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-connect-methods.html#connect-linux-inst-eic-cli-ssh ↩︎

  2. https://man.openbsd.org/ssh_config#AddKeysToAgent ↩︎

Discussion