古いノートPCのバックアップドライブには、いまもSSHの秘密鍵が入っている。VPNがそれを守るのかと尋ねる人がいるが、守らないし、守ったこともない。VPNが守るのは二つのネットワークの間の経路であり、パスフレーズが守るのはファイルであり、エージェントが守るのは実行中のセッションである。三つの異なる仕組み、三つの異なる失敗の形があり、盗まれた複製が気にするのは最初の二つだけだ。

パスフレーズはファイルに属する

SSH鍵のパスフレーズは、保管中の秘密鍵素材を暗号化する。サーバーに送るアカウントのパスワードでもなければ、VPNに接続するための資格情報でもない。両者を混同すると、露出そのものを扱わない変更に終わる。

OpenSSHのssh-keygenのマニュアルはパスフレーズの扱いを説明しており、既存の鍵に新しいパスフレーズを設定する-pスイッチも含まれている。

既存の鍵ならコマンドの形は単純で、ファイルを書き換える。

ssh-keygen -p -f ~/.ssh/id_ed25519

これは検査ではなく書き込みなので、鍵の所有者が承認した保守と復旧の手順に従う。秘密のファイルを公開せず、共有のコマンドラインに実際のパスフレーズを置かない。パスフレーズを変えても、以前に取られた複製は暗号化し直されない。古い複製の場所をチケットに残し、破棄するかどうかを所有者が決められるようにする。

複製はノートPCよりもトンネルよりも長く残る

鍵ファイルが複製された時点で、ノートPCの現在のVPN接続はそのファイルについて何も語らない。重要なのは、ファイルそのものがどれだけ守られているかであり、どのサーバーが対応する公開鍵をいまも信頼しているかだ。

現在のファイルのパスフレーズを変えても複製には触れず、サーバーのauthorized_keysから同じ公開鍵が消えるわけでもない。失効と再暗号化は別の操作である。

したがって、漏れた秘密鍵はネットワークの出来事ではなく身元の出来事として扱う。受け入れられた鍵は、それを所有するサーバーと登録手続きを通じて削除または交換する。VPNを止めるのはある瞬間の一本の経路を制限するだけで、失効ではない。

ロック解除は秘密をエージェントへ移す

エージェントは後続の認証のために復号済みの身元を保持するので、利用者は接続のたびにパスフレーズを打ち直さずに済む。これは独自のセキュリティ境界を持つ利便性の機能である。

ssh-agentは-tオプションで身元を読み込んでおく時間を制限でき、身元ごとの設定がその上限を上書きすることがある。VPNを切断すれば読み込んだ鍵をすべて忘れると決めつけず、実際に動かしているエージェントの方針を選ぶ。

鍵を解錠した後に侵害されるプロセスは、暗号化ファイルが盗まれるのとは別の問題だ。エージェントを別のホストへ転送すると、鍵ファイルを複製せずに認証能力を委譲することになるので、承認された必要がある場合に限って有効にする。

変更の前後で、エージェントがいま何を保持しているかを一覧にする。

ssh-add -l

無人の処理には独自の計画が要る

定時処理は問いかけに答えられない。承認されたマシン資格情報の取り決めが必要であり、解錠の秘密を鍵と同じディレクトリに置き、同じアカウントから読めるようにしても、二つ目の境界にはならない。

サービスの所有者とともに、支援された秘密の配布やハードウェアに根ざした運用を検討し、更新、故障、復旧までを含める。鍵盤の前に人を置きたいという希望は、誰も見ていない状態で起動するホストとは故障の見え方を変える。

サーバーのホスト身元の確認とアカウントの制限も維持する。VPNの経路は私的な道を与えるが、到達できるすべてのSSHリスナーが意図したホストであることを証明はしない。リスナーとホスト鍵の指紋は、鍵そのものと同じ台帳に記録する。

境界は別々に検証する

それぞれの境界を、それぞれの問いで試す。パスフレーズなしでファイルは開くか。切断後もエージェントは身元を保持しているか。サーバーはいまも公開鍵を受け入れるか。

最初と三番目の問いには二つのコマンドが答える。

ssh-keygen -y -f ~/.ssh/id_ed25519
ssh -v [email protected]

ファイルの保護、鍵の許可された用途、サーバー側での削除を、三つの独立した項目として記録する。トンネル、パスフレーズ、エージェントはそれぞれ関係の別の部分を守っており、ネットワークに関わるのはそのうち一つだけである。

関連記事