
2026/05/08 20:26
接続初回時に発生する MitM(中間者攻撃)検知の回避方法について、VPS やあらゆるクラウドプロバイダーで一般的な設定手順と注意点を以下にまとめます。 - **原因**: OpenSSH のデフォルト設定では、リモートホストの公開鍵がローカルの `known_hosts` ファイルの内容と一致しない場合、「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(または類似するメッセージ)/ MitM attack potentially in progress」と表示されます。これは重要なセキュリティ機能ですが、新規接続時や IP アドレス変更時などに誤検知が生じる可能性があります。 - **対策方法**: - リモートホストの正しい公開鍵を手動または自動登録ツールを利用して `known_hosts` ファイルに追加する。 - 「Host key checking」を無効にする設定(例:`StrictHostKeyChecking no`)を行う場合は、セキュリティリスクが高まるため非常に慎重に取扱いください。 - **設定変更手順**(`~/.ssh/config` の編集): ```bash echo "Host * StrictHostKeyChecking no" >> ~/.ssh/config ``` その後、SSH コネクショングリフを再度試してください。 - **注意点**: 公開鍵検証の無効化はセキュリティ上の重大な弱点となりますので、信頼できる環境でのみ実施すること強くお勧めします。
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
要旨: 本稿の核心となるメッセージは、Hetzner などのクラウドプロバイダーにおける重要なセキュリティギャップを埋めるための、新しいプロバイダ非依存手法であり、そのためには cloud-init を使用することである。これにより、おそらく漏洩した利用者データに依存することなく、初回の接続ごとに一時的な SSH ホストキーを注入する。このアプローチは、特にクラウドのメタデータサービスが侵害された場合でも、偽物のホスト識別子を利用したりトラフィックを迂回させたりすることを防ぐことで、中間者攻撃(Man-in-the-Middle)に対する防御を実現する。標準的な「最初の使用時に信頼する」(Trust On First Use)モデルとは異なり、この手法は一時的なキーを主の known_hosts ファイルから独立させ、OpenSSH の設定機能である
HashKnownHosts などの機能を活用してデータ漏洩を防ぐ。セキュリティモデルでは、システムが一時的なキーを削除する前に、管理者が直ちにログインし、これらの一過性のキーを自らの長期保有の秘密鍵に置換することを前提としている。したがって、利用者の設定データが漏洩しても、一時的なキーの有効期限が切れるとすぐに無害化する。攻撃者が事前に接続してコマンドを実行することに成功すれば、それでもなおキーを収集することは可能ではあるが、この手法は複雑なインフラストラクチャの変更を必要とせずに、初期の仮想マシン侵害に対して著しく困難度を高めている。本文
この簡易スクリプトは、新規に生成された仮想マシン(VM)に対する最初の SSH 接続で攻撃を検知・遮断します。これは、専用ソリューションを提供していないクラウドプロバイダー(例:Hetzner Cloud など)においても機能します。必要なのは広く標準的にサポートされている「cloud-init」のみです。
【要約(技術者向け;詳細な説明は後述)】
cloud-init を介して仮の SSH 接続先ホストの秘密鍵を注入し、この仮鍵をほんの一瞬だけ信頼するだけで十分です。これにより、「本番用」(長期利用可能な)SSH ホストキーの生成および取得が可能になります。
本スクリプトは、この技術のシンプルかつ堅牢な実装例であり、スクリプト内のコメントで採用された設計判断についても言及されています。なお、この技術自体は新規と考えられます。適切な解説記事や、他のプロバイダー依存ではない解決策に関する資料をまだ見つけることはできませんでした(ただし、訂正のご教示も歓迎いたします)。
本手法は「最初の接続」を守ることに重点を置いており、SSH が表示する「ホストの真正性が確認できません [...] ですか?」という問いに対して単純に「yes」と回答し、Trust On First Use (TOFU) に留まるケースとは異なります。後者では、攻撃者がトラフィックをプロキシ経由へ誘導したり、仮に一時的であってもあなたの VM への接続を試みたりするリスクが依然として残ります。
さらに、この手法は cloud-init のユーザデータ(userdata)の漏洩も無害化します。
cloud-init を介して長期利用可能な SSH ホスト(秘密)鍵を注入することは、「公開鍵の一部を ~/.ssh/known_hosts に追加することで最初の接続を検証可能にする」という目的では機能しますが、貴重な秘密鍵材料が cloud-init の userdata 内に残ることになります。これらは攻撃者がメタデータサービスから入手できる可能性が高く、VM 上で動作する多くのプロセスが通常アクセス可能な情報です。例えば Hetzner VM 上の例示:
curl http://169.254.169.254/hetzner/v1/userdata
攻撃者は、SSRF(サーバーサイドリクエストフォージェリー) exploits を利用して特定のプロセスを欺き、上述のような機密情報を引き出させることが可能です。この SSRF は、プロバイダーが解決策を提供している場合でもブロックされていないことが往々にしてあります。あるいは、クラウド事業者の他のシステム(例:Hetzner が明確に警告する通り「パスワードその他機密情報を保存すること」を避けるべきと指摘)から、あるいは管理者の作業環境から漏洩するリスクも存在します。
セキュリティ分析/脅威モデル
本手法では、(Open)SSH プロトコルおよびその実装の安全性を前提としており、攻撃を検知する能力を管理者(あなた)に依存することはありません。
我々は、以下のようなネットワーク上の攻撃者に対して防御可能です:
- 管理者の作業環境の完全性を保護し、
- VM の完全性も同時に保護する場合において、
攻撃者が以下のいずれかを達成したとしても:
- ネットワークに対して完全な統制権(「中間者攻撃」)を持っている場合、および/または
- スクリプトが終了した時点以降(成功・失敗を問わない)に、cloud-init のユーザデータを入手できた場合においても、
なぜなら、攻撃者は鍵材料を「まだ有効である」という時点で取得することには成功しないからです。
一時的な SSH ホスト鍵の誤用を防ぐため、本スクリプトは該鍵を仮ディレクトリに保存する一方で、~/.ssh/known_hosts には一時的な SSH ホスト鍵を記録しません。
管理者の作業環境がハッキングされたとしても、(長期利用可能な)SSH ホスト(秘密)鍵を取得することはできません。
我々は、**(のみ)**以下の要件を満たす攻撃者に対して VM(およびその長期利用可能な SSH ホスト(秘密)鍵)を守ることができます:
- ネットワークに対して完全な統制権(「中間者攻撃」)を持ち、かつ
- 管理者の作業環境に対して完全な統制権を持っていても、
しかしながら、実際に VM に接続していない場合に限られます(現実的なシナリオでは、ログを確認することでこれが証明され得ます)。これは、長期利用可能な SSH ホスト(秘密)鍵が元々管理者の作業環境上に存在せず、かつ攻撃者が実際には VM への接続を行っていないためです。
(※実際に VM に接続する攻撃者の場合、SSH ホスト鍵を取得してしまう可能性はあります。例:
ssh root@<VM> cat /etc/ssh/ssh_host_* など。)
VM またはクラウドプロバイダーをハッキングされたとしても、管理者の作業環境へのアクセスは得られません。
我々は、**(のみ)**以下の要件を満たす攻撃者に対して管理者の作業環境の完全性を守ることができます:
- ネットワークに対して完全な統制権(「中間者攻撃」)を持ち、かつ
- VM および/またはクラウドプロバイダーに対して完全な統制権を持っている場合においても、
これは、(Open)SSH が安全であると仮定しているためです。
このシナリオに対する追加的な防護策として、本スクリプトは VM からの出力を ~/.ssh/known_hosts に単純に書き込むのではなく、OpenSSH の鍵ローテーション機能を利用して長期利用可能な SSH ホスト鍵をその場所に配置します。これにより以下の利点が得られます:
- 侵害されたホストが ssh の known_hosts パーサーへ悪意のあるデータを注入することを防止し、かつ
- VM が実際に制御する鍵のみを ~/.ssh/known_hosts に書き込むことを保証し、かつ
- HashKnownHosts などの OpenSSH オプション(および将来追加され得る関連オプション)を正しく扱うことを保証します。
アサイド:攻撃者が本当にネットワーク攻撃を成功させられるのでしょうか?
答えは「場合による」です。特に、あなたがすべての接続が過去から現在に至るまで本来の宛先ではなく異なるマシンへ行き続けていることに気づき、パスワード入力(最初の接続か以降のいずれかの接続においても)に応じて拒絶し、SSH エージェント接続または X11 接続を転送しないよう設定していなければ、攻撃者は失敗に終わる可能性が高いです。
以下は簡略化された非包括的なリストであり、ssh-mitm に感謝します:
- 攻撃者が成功する可能性が高いのは、実在のターゲットホストではなく、攻撃者によって制御されているマシンへのアクセスを誤認させることに成功した場合です。そうでない場合、
- 攻撃者があなたの入力により実在のホストへログインすることを可能にする情報を得て、あなたを欺くことに成功する場合です。具体的には:
- あなたがパスワードを使って(攻撃者のマシンへ)ログインした場合;または
- どの認証方法であってもログインした後、プロンプトに従ってパスワードを入力した場合;または
- どの認証方法であってもログインし、かつ SSH エージェント接続を転送した場合。
- ただし上記のいずれでもない場合は、攻撃者は失敗する可能性が高いです:実在のホストへのアクセスが必要でありながら、あなたの入力を用いて実在のホストにログインできなければなりません。
加えて/あるいは代替として、あなたがどの認証方法も使用し X11 接続を転送する場合には、攻撃者があなたの作業環境を攻撃することに成功する可能性もあります。