SSH鍵のパスフレーズが守るのはファイルであり経路ではない
パスフレーズは秘密鍵ファイルを暗号化するもので、身元を取り消すものでも経路を守るものでもありません。保管場所の分離、エージェントの寿命、無人での利用が論点です。
古いノート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]
ファイルの保護、鍵の許可された用途、サーバー側での削除を、三つの独立した項目として記録する。トンネル、パスフレーズ、エージェントはそれぞれ関係の別の部分を守っており、ネットワークに関わるのはそのうち一つだけである。