接続ダイアログにはログインを記憶するチェックボックスがあり、チェックを入れるとアカウント情報は利用者の頭からマシンへ移る。画面はその場所を決して教えない。Windowsでは、現在のユーザーのレジストリ領域、ログインをすでに含むプロファイルファイル、自動化スクリプトが行うことの三つが候補になる。場所ごとに読み手も障害の仕方も後始末も違うので、役に立つ問いは「どのプロセスが秘密を取り戻せるのか、そしていつまでか」である。ダイアログからチェックボックスを外側へたどり、失ったノートPCが実際に何をさらすのかを決めよう。

接続ダイアログのチェックボックスから始める

記憶された値はプロファイルごと、Windowsアカウントごとに、共有のマシンストアではなくユーザーハイブに保存される。そのため同じPCの別ユーザーには保存されたログインが見えず、クライアントを再インストールしても保存済みの項目が必ず消えるわけではない。

プロファイルファイル自体はサーバー、ポート、設定を保持するが秘密は持たないため、人はまず間違った対象を調べる。したがってプロファイルを削除すると接続は消えるが、資格情報は残る。これが後始末で最もよくある驚きだ。片方ではなく二つとも消すこと。

レジストリの値が明かすもの

アカウント名は読めるテキストなので、そのユーザーとして動くものは特別な呼び出しなしに復号できる。パスワードは違うが、Windows DPAPIで封印され、アカウントに、フラグ次第では特定のマシンにも結び付いている。封印された塊を別のPCへ移して再生しても、使える秘密にはならない。

値を一覧するだけで、秘密そのものに触れずに運用上の問いに答えられる。項目の存在を確かめるのに復号は要らない。この一覧は後始末の前後の記録にもなる。

reg query "HKCU\Software\OpenVPN-GUI\configs" /s
cmdkey /list | findstr /i vpn
reg query "HKCU\Software\OpenVPN-GUI" /s | findstr /i "username password"

二つの限界は率直に言うべきだ。同じログオンセッション内のプロセスは、クライアントが使うのと同じ保護解除ルーチンを呼べるため、封印は保存時の保護であり、侵害されたデスクトップへの防御ではない。そしてディスク全体の暗号化がなければ、封印された値の秘匿性はディスクと同じ程度でしかない。

プロファイルファイルにすでにログインがある場合

ポータルの中には、アカウント名とパスワードを書き込んだ設定を配るところがあり、クライアントは黙って接続する。その時点でファイルは有効な資格情報であり、その複製はどれも同じ扉のもう一本の鍵になる。

そうしたファイルはバックアップ、チャットのやり取り、同期フォルダに残り、元を消しても複製は動き続ける。手元のファイルを編集しても他は何も変わらない。アクセスを取り消すにはサーバー側でパスワードを変える必要があり、しかも早く行うべきだ。一台のノートPCでの後始末は、別のより小さな作業である。

プロンプトで済むならそうして、クライアントのキャッシュ制御を使う。事前入力済みのプロファイルが本当に必要な場合は、同期フォルダの外に置き、作業が終わったら削除する。

自動化は秘密を別の場所へ移す

スクリプトはさらに、プロセスの引数と合成キー入力という二つの経路を持ち込む。コマンドラインで名指しされたファイルは、プロセスの引数やファイルの権限を読めるものすべてに見え、ツールが打ち込むパスワードは、その時点でフォーカスを持つウィンドウへ送られる。公開された例の一つは、クライアントを起動する前にデスクトップのパスワードをそうやって入力している。保存されたワンタイムパスワードの種も同じ注意に値するのは、将来のコードをすべて生成でき、一度のログインより長く生き残るからだ。

より良い形は、サービスアカウントだけが読める場所に秘密を置き、クライアントの文書化された再試行と資格情報ソースの選択肢に頼り、特権のプロンプトへの入力注入を避ける。スクリプトが昇格のためにデスクトップのパスワードを要るなら、それはVPNではなく特権設計の問いだ。

紛失した端末の後の後始末

何より先にサーバー側でアカウントを取り消すか無効にするのは、手元での削除が、誰かがすでに持つ複製を無効にできないからだ。そのうえで記憶されたレジストリ値を消し、プロファイルと資格情報ファイルを除き、シェル履歴とスクリプト置き場に貼り付けたパスワードがないか探す。

何を消したのか、アクセスがいつ終わったのかを書き留める。その二つが、インシデントレビューが問う唯一のこと、つまり端末が離れた後も資格情報の複製が使えていたかどうかに答える。

関連記事