PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

VPSやクラウドの「最初のSSH接続」でMITMを防ぐ、ちょっと賢い方法

キーポイント

そもそも何が問題なのか

SSH は、リモートのサーバーに安全にログインするための定番ツールです。
ただし、新しいサーバーに初めて接続するときだけは、話が少しややこしい。

なぜなら、その時点では「相手が本当にそのサーバーか」を確認するための情報が、手元にまだないからです。
SSH はここで、

“The authenticity of host … can't be established. Are you sure you want to continue connecting (yes/no/[fingerprint])?”

のように聞いてきます。

多くの人は yes を押してしまいます。
これは TOFU (Trust On First Use)、つまり「最初は信じる、次から覚えて照合する」という考え方です。

これ、実用上は便利です。正直、毎回厳密に確認していたら面倒すぎる。
でも問題は、​最初の1回だけは攻撃者が横取りできることです。
もしネットワークを支配されたら、攻撃者は本物のサーバーのふりをして、あなたを別の機械へ誘導できるかもしれません。

著者はここを強く指摘しています。
​「yes を押すだけでは、初回接続を守れていない」​と。これはかなり重要なポイントだと思います。

著者の提案: 一時鍵でまず接続し、そこで本物の鍵を回収する

記事の核心はシンプルです。

  1. cloud-init を使って、VM に一時的な SSH host key を注入する
  2. 管理者はその一時鍵を使って、​最初の接続を安全に行う
  3. その接続の中で、VM から本物の長期 SSH host key を取得する
  4. 以後は、その本物の鍵で通常通り確認する

つまり、最初から本命の鍵を渡すのではなく、​**“使い捨ての信用切符”で入場して、本物の本人確認書類をもらう**イメージです。
この発想はかなりきれいです。地味ですが、筋がいい。

しかもこの記事の手法では、単に鍵を手で見て known_hosts に書くのではなく、​OpenSSH の key rotation をうまく使って、長期鍵が自然に known_hosts に入るようにしている点が面白いです。
これにより、HashKnownHosts のような設定にもちゃんと対応しやすくなります。こういう「雑に見えて、実は細部が丁寧」な設計は好きです。

なぜ「長期鍵を cloud-init に入れる」だけではダメなのか

ここはかなり大事です。

「じゃあ、最初から本物の SSH host key を cloud-init で配ればいいのでは?」
と思うかもしれません。実際、そうすれば初回接続の認証自体はできます。

でも、著者はそれを危険だと説明しています。なぜなら、cloud-init の user-data に秘密鍵(private key)​が入ってしまうからです。

秘密鍵は“秘密”であることが命です。
ところが cloud-init の user-data は、状況によっては漏れやすい。

たとえば記事では、以下のような経路が挙げられています。

つまり、「最初の認証のために秘密鍵を埋め込む」と、​認証のために置いたはずのものが、むしろ新たな弱点になるわけです。
これはかなりイヤな話ですが、現実的でもあります。

この手法の守備範囲はどこまでか

著者はかなり丁寧に threat model(脅威モデル、どういう攻撃まで想定するか)を書いています。
ここが誠実で好感が持てます。

守れるもの1: ネットワーク攻撃者から管理者端末とVMを守る

この方法は、次のような相手に強いです。

でも、鍵の扱いがうまく設計されているので、​攻撃者が“価値ある鍵素材”を持ち去るタイミングがない
ここが肝です。

守れるもの2: 管理者のPCが乗っ取られても、長期 host key を渡さない

ちょっと面白いのがここです。
攻撃者が管理者端末を完全に支配していても、​VMに実際に接続しない限り、VM の長期 host key を盗めないケースを想定しています。

要するに、「管理者端末がやられたら全部終わり」ではなく、​少なくとも鍵の所在を限定するわけです。
鍵を管理者端末に置かない設計は、やっぱり強い。

守れるもの3: VMやプロバイダが怪しくても、管理者端末への汚染を抑える

逆に、VMやクラウド事業者が悪い/怪しい場合でも、管理者端末におかしなデータを食わせにくくする工夫もしています。
特に、単にサーバーの出力をそのまま ~/.ssh/known_hosts に書くのではなく、​OpenSSH が鍵として認識できるものだけを使う流れにしているのがポイントです。

これは地味ですが、かなり大事です。
「信じて書き込む」ではなく、​OpenSSH の仕組みに沿って安全に取り込む。こういう堅実さ、好きです。

では、攻撃者は本当に初回SSH接続を乗っ取れるのか

著者は少し横道として、「実際、MITM 攻撃はどこまで成功するのか」も考察しています。
ここはかなり現場感があります。

ざっくり言うと、攻撃者が成功しやすいのはこんな場合です。

逆に、もしあなたが

なら、攻撃者はかなり苦しくなる、としています。

ここでの教訓はシンプルで、
SSH は安全そうに見えて、設定次第で攻撃面がかなり広がるということです。
個人的には、特に agent forwarding は便利さと危険さが同居していて、いつも少し怖い機能だと思っています。

この手法が面白い理由

このアイデアの面白さは、​**“初回接続問題”を真正面から解きにいっている**点です。

SSH の初回接続は、長年「まあ、yes 押して運用している」ことが多かった領域です。
でもそれって、実はセキュリティ的にはかなりモヤっとしている。
著者はそこを、プロバイダ独自機能に頼らず、​cloud-init だけで解くというのがいい。

しかも、

という、かなり実用寄りの美しさがあります。

「派手な新技術」ではないけれど、​現場で効く工夫という感じです。
こういうのは派手さはないですが、実際にはとても価値があると思います。

まとめ: 初回SSH接続の“ぬるさ”を減らす発想

この記事は、SSH の初回接続でよくある
​「とりあえず yes」問題 に対して、かなり筋の良い解決策を提示しています。

ポイントは、

という流れです。

個人的には、こういう「誰もがなんとなく妥協していた部分」を、ちゃんと設計し直す記事はとても好きです。
派手ではないけれど、セキュリティの現場ではこういう一手がすごく効く。そう思います。


参考: Stop MITM on the first SSH connection, on any VPS or cloud provider | Cryptography, Technology | Joachim Schipper

同じ著者の記事