二つの異なる事象がSSH鍵の漏えいと呼ばれますが、求められる対応は異なります。公開鍵認証が送るのは公開鍵と秘密鍵で作った署名であり、秘密鍵がリクエストの項目になることはありません。エージェント転送が晒すのは別のもので、転送されたエージェントに到達できる遠隔ホストは、鍵を一度も持たずに署名を要求できます。この二つを一つの事象として扱うと、無意味な鍵の入れ替えか、動き続ける委任のどちらかになります。

公開鍵ログインが送るのは鍵ではなく署名である

認証のやり取りが運ぶのは、利用者の公開鍵とセッションデータに対する署名です。サーバーはその署名を、すでに信頼している鍵で検証するので、信頼できないネットワーク越しでも秘密側はクライアントに残せます。トンネルを観察するVPN事業者には、いずれにせよ暗号化されたSSHセッションが見えます。

これはプロトコルの説明であり、経路上のすべての端点の信頼性ではありません。ホスト識別子の検証は、どのホスト鍵でも受け入れるクライアントがここで扱うのとは別の制御を放棄している以上、そのまま維持してください。傍受されたセッションと傍受された鍵は別の所見であり、資格情報の喪失になるのは片方だけです。報告書でも両者を別の文に分けてください。

ssh-keygen -lf ~/.ssh/id_ed25519.pub
ssh -o StrictHostKeyChecking=yes [email protected]

一つ目のコマンドは公開指紋を出力するので、サーバーが示す値と比べられます。二つ目は、誰も読んでいない既定値に頼るのではなく、ホスト鍵の確認を明示します。鍵について何かを変える前に両方を実行し、基準を記録してください。

エージェントを転送することは署名する能力の委任である

転送を有効にすると、遠隔ホストにソケットが現れ、手元のエージェントがそこを通じて届く要求に応答します。セッション中にそのソケットを使える者は誰でも、読み込まれた識別子を受け入れるホストに対してあなたとして認証できます。それが機能するために秘密鍵がネットワークを渡ることはありません。

露出しているのは能力であり、ファイルではありません。だからこそ転送は、ノートPCが張るすべての接続ではなく、名前を付けた作業と名前を付けたホストに属します。転送されたエージェントなしで接続を中継する踏み台ホストは、たいてい必要そのものをなくします。

ssh-add -l
ssh -o ForwardAgent=no [email protected]
ssh -J [email protected] [email protected]

一つ目はエージェントが現在保持する識別子を一覧するので、ソケットを別の機械に渡す前に知っておく価値があります。二つ目は委任なしで接続します。三つ目は、転送をしばしば完全に置き換える踏み台ホストの型を示します。

手元の証拠から対応を選ぶ

露出したと考えられる署名用の識別子には、交換と失効の手続きが必要で、それを信頼していたサービスから受け入れを外す必要があります。ノートPC上のコピーを消しても、他のコピーは手つかずのままです。サービスから始め、その後にクライアントを片付けてください。

一時的な委任の問題はより狭いものです。不要だった転送を終わらせ、どのセッションと識別子を覆っていたかをインシデントの担当者と確認してください。鍵の交換が続くことはありますが、それを決めるのは証拠であり、不安ではありません。

エクスポートが観測されなかったことは、恐れていた仕組みが現れなかったことだけを示します。そのソケットの反対側のホストが他に何をできたかについては何も語りません。

報告書では制御を分けて書く

秘密の材料を守り、誰が署名を要求できるかを制限し、相手の識別子を検証済みに保つ。これは互いを強め合う三つの制御であり、何が起きたかを説明するときにどれも他の代わりにはなりません。

侵害されたノートPCやその上の特権アプリケーションは、影響範囲がはるかに広い第三の事例です。VPNの経路を変えても解決せず、ディスクから読まれた可能性のある鍵への信頼も戻りません。

どの構成要素を信頼したのか、転送が有効だったのか、実際に何を観測したのかを書き留めてください。その記録が、漏えいの意味についての推測ではなく、次の判断を弁護できるものにします。

関連記事