「Too many authentication failures」の解決 - 鍵の送りすぎ
「Too many authentication failures」とは何が起きているのか?
結論: サーバが許す認証試行回数(
MaxAuthTries、既定6回)を、正しい鍵に到達する前に使い切って切断された状態。鍵が間違っているのではなく「送りすぎ」が原因。
このエラーは SSH の接続自体は成立し、サーバの sshd まで会話が届いている。ネットワークの問題でも、鍵そのものが無効なわけでもない。
Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures Disconnected from 203.0.113.10 port 22
sshd は1接続あたりの認証試行回数に上限(MaxAuthTries、デフォルト 6)を設けている。公開鍵認証では、クライアントが鍵を1つ提示するたびに1回の試行としてカウントされる。ssh-agent に大量の鍵を抱えていると、ssh は接続先が受け付けるかどうかに関係なく手持ちの鍵を順に提示し、正しい鍵にたどり着く前に上限へ達する。
前提(対象環境)
- クライアント: Ubuntu / macOS(考え方は共通)
- サーバ: Ubuntu(OpenSSH server)
MaxAuthTriesのデフォルトは6(OpenSSHsshd_configの既定値)
まず何を確認すべきか?
結論:
ssh -vでOffering public key:の行数を数える。切断前に何個の鍵を提示しているかが、そのまま原因の証拠になる。
最初にやることは「自分がいくつ鍵を送っているか」の可視化だ。
$ ssh -v user@server.example.com
注目する行:
debug1: Offering public key: /home/user/.ssh/id_rsa RSA SHA256:... debug1: Offering public key: /home/user/.ssh/id_ed25519 ED25519 SHA256:... debug1: Offering public key: ssh-ed25519 SHA256:... agent debug1: Offering public key: ssh-rsa SHA256:... agent ... Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures
Offering public key が6回前後並んだ直後に切断されていれば、原因は確定だ。提示している鍵が多すぎて、正しい鍵を出す前に MaxAuthTries を超えている。
末尾に agent と付く行は ssh-agent が保持している鍵、ファイルパスが出る行は設定や既定の鍵ファイルに由来する。両方が合算されて提示回数になる。
なぜ鍵を送りすぎると拒否されるのか?
結論:
sshdは1接続で許す認証試行をMaxAuthTries回に制限する。公開鍵は提示するだけで1回消費するため、鍵が多いと「正しい鍵を試す前に」枠が尽きる。
仕組みを整理すると次のとおり。
- クライアントは利用可能な鍵を順番にサーバへ提示する。
- サーバは提示された鍵が
authorized_keysにあるか確認し、無ければ「次へ」と促す。 - この1往復が1試行としてカウントされる。
- 試行回数が
MaxAuthTriesに達した時点で、サーバは認証成功を待たずに切断する。
つまり、鍵が10個あって正解が9番目にある場合、6回目で打ち切られて正解に届かない。これが「送りすぎ」の正体だ。
| 観点 | Permission denied (publickey) |
Too many authentication failures |
|---|---|---|
| 何が起きたか | 正しい鍵が見つからず認証失敗 | 正しい鍵に到達する前に試行枠が尽きた |
| 主因 | 鍵不一致 / 権限 / 設定 | 提示する鍵が多すぎる |
| 典型的な切り分け | authorized_keys を確認 |
提示鍵を1つに絞る |
ssh-add -l で大量の鍵が登録されていると、どのサーバへ接続してもまず agent の鍵が全部提示される。1台のサーバ専用の鍵でも、agent 経由で他の鍵が先に消費されてしまう点に注意する。
今すぐ繋ぐ応急処置は?
結論:
-o IdentitiesOnly=yesと-i 鍵を併用して、提示する鍵を1つだけに限定する。これで試行回数が1回に収まり、その場で接続できる。
$ ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@server.example.com
IdentitiesOnly=yes が要だ。これが無いと、-i で鍵を指定しても ssh は ssh-agent の鍵を追加で提示してしまい、提示回数は減らない。ここが最大の落とし穴になる。
-i だけでは不十分。-i ~/.ssh/id_ed25519 を付けても IdentitiesOnly=yes が無ければ、ssh は「指定鍵 + agent の全鍵」を提示する。応急処置では必ず両方をセットで使う。
正しい鍵が分からない場合は、-v を併用して1つずつ試す。
$ ssh -v -o IdentitiesOnly=yes -i ~/.ssh/id_rsa user@server.example.com
Authentication succeeded (publickey) が出れば、その鍵が正解だ。次の手順で恒久設定に落とし込む。
~/.ssh/config で恒久対処するには?
結論: 接続先ごとに
IdentityFileとIdentitiesOnly yesを~/.ssh/configに書く。以後は鍵が自動で1つに絞られ、コマンドにオプションを付ける必要がなくなる。
Host myserver
HostName server.example.com
User user
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
これで ssh myserver だけで、指定した鍵のみを提示する接続になる。
複数のサーバを使い分けるなら、ホストごとにブロックを分ける。
Host prod
HostName prod.example.com
User deploy
IdentityFile ~/.ssh/id_prod
IdentitiesOnly yes
Host gitlab
HostName gitlab.example.com
User git
IdentityFile ~/.ssh/id_gitlab
IdentitiesOnly yes
IdentitiesOnly yes は「config と -i で明示した鍵だけを使う」という意味。agent の中身に引きずられなくなるため、鍵が多い環境ほど効果が大きい。
ssh-agent の鍵を整理するには?
結論:
ssh-add -lで登録数を確認し、多すぎるならssh-add -Dで一旦全削除して必要な鍵だけ入れ直す。agent の肥大化が「送りすぎ」の根本原因になりやすい。
まず現状を確認する。
$ ssh-add -l
256 SHA256:... user@host (ED25519) 3072 SHA256:... old-key (RSA) 256 SHA256:... another (ED25519) ...
ここに6個以上並んでいれば、IdentitiesOnly を使わない限りどのサーバでも試行枠を食い潰す。不要な鍵を消す。
# 全削除して入れ直す $ ssh-add -D $ ssh-add ~/.ssh/id_ed25519
特定の鍵だけ外す場合:
$ ssh-add -d ~/.ssh/id_rsa
agent への鍵の自動ロード(AddKeysToAgent yes やログイン時スクリプト)が設定されていると、削除してもすぐ戻ることがある。再発するなら、ロード元の設定(~/.ssh/config の AddKeysToAgent、シェルの起動スクリプト)も見直す。
サーバ側で MaxAuthTries を調整すべきか?
結論: サーバを管理しているなら
MaxAuthTriesを上げて回避できるが、総当たり耐性が下がる対症療法。原則はクライアント側で鍵を絞るのが正攻法。
サーバの実効値は sshd -T で確認する。
$ sudo sshd -T | grep -i maxauthtries
maxauthtries 6
どうしても多数の鍵を提示する運用が避けられない場合のみ、/etc/ssh/sshd_config で値を上げる。
MaxAuthTries 10
$ sudo systemctl reload ssh
MaxAuthTries を上げると、1接続あたりに許す認証試行が増え、パスワード総当たり・鍵総当たりに対する耐性が下がる。公開向けサーバでは安易に上げない。まずクライアント側の IdentitiesOnly で解決できないかを優先する。
サーバ側で根本対処するなら、MaxAuthTries を上げるより、対象ユーザーの authorized_keys を整理し、クライアントに正しい鍵を1つだけ提示させる運用へ寄せるほうが安全だ。
再発を防ぐチェックリスト
結論: 「提示鍵を1つに絞る」が解決の本質。
configのIdentitiesOnly、agent の整理、サーバ設定の確認を順に潰せば再発しない。
- [ ]
ssh -vでOffering public keyの数がMaxAuthTries(既定6)を超えていないか - [ ] 応急処置として
-o IdentitiesOnly=yes -i 鍵で接続できるか - [ ]
~/.ssh/configの対象 Host にIdentityFileとIdentitiesOnly yesを書いたか - [ ]
ssh-add -lの登録鍵が多すぎないか(不要ならssh-add -D) - [ ] 鍵が自動で戻る場合、
AddKeysToAgentや起動スクリプトを確認したか - [ ] サーバ管理者の場合、
sshd -Tでmaxauthtriesの実効値を確認したか