自宅 VPN を公開するとき、実際に何を露出するのか
開けたのは 1 つのポートで、サービスではない。トンネルを信頼する前に、公開側のリスナー、受け入れるクライアント、非公開リソースを別々に確認する。
トンネルのために 一つのポートを転送し、変更は限定的だと言い聞かせている。実際にはポートはパケットを通すだけで、その背後にあるものが露出だ。露出を決めるのは 三つ、公開側で待ち受けるソケット、トンネルが受け入れる識別情報、そしてその識別情報が到達できる宛先である。それぞれに別の答えが必要で、一つで慎重に選んでも他は制約されない。
ポート転送はサービスではない
ルーターの規則はパケットをホストへ動かすが、それを読むプロセスを名指ししない。転送ページと待ち受けソケットは別の場所にあり、規則がサービスを動かしていない機械を指すことがある。実際に何が応答するかを知るにはホストで確認し、ss -lntup で待ち受けソケットごとに所有プロセスを一覧する。そのプロセスをコンポーネント、バージョン、所有者に照合する。
作成したと覚えている規則を削除しても扉は閉まらない。UPnP のマッピングが自分で追加された可能性があり、IPv4 の項目が消えても IPv6 アドレスは到達可能なままかもしれず、別の機械に 二つ目の公開方法があるかもしれない。ルーターの UPnP マッピング一覧と静的項目を読み、ネットワークの外から試す。
ログインは LAN の許可ではない
トンネルは誰が接続できるかを決め、リソースは接続したクライアントが何を開けるかを決める。NIST のゼロトラスト指針もネットワーク規模で同じ分離をしており、アドレスは認可について何も証明しない。登録済みのノート PC に 一つの作業、たとえば名前付きホストのファイル共有を読むことを与え、その組を書き留める。トンネルのアドレスが家の他の部分の管理者権限を継承してはならない。
要約が省く経路、すなわちクライアント間トラフィック、ブリッジへの参加、インターネット転送、送信元変換も調べる。どれも、書かれた作業が決して触れない 二つのシステムをつなぎ得る。作業に不要なものは切り、クライアントがまだ到達できる先を列挙する。
きれいなスキャンはほとんど何も証明しない
開いたポートは 一つのアドレスと 一つのプロトコルについての事実であり、ログイン成功は 一つの資格情報についての事実である。どちらも次に何が起きるかは言わない。意図したホストで意図した操作を試し、次に登録されたことのない識別情報、誰も承認していないサービス、非公開のままであるべき管理画面を試す。最後の試験がたいてい失敗する。
両方のアドレス体系と公開するすべての経路を試す。IPv4 アドレスのスキャンは待ち受ける IPv6 サービスについて何も言わず、内部試験では NAT ループバックの問題や上流のフィルターは見えない。少なくとも 一回は外部から、同じルーターを通って戻らない接続で確認する。
露出を書き留める
短い表にすると、レビューは次の人が監査できるものになる。外から内へ、到達可能なサービスごとに 一行で埋め、構成と一緒に保管し、チャットのスレッドには置かない。所有者のない行は所見である。
| Public address and port | Receiving host | Process on the socket | Intended actor | Who may reach it |
|---|---|---|---|---|
| 203.0.113.10:51820 | nas | wg-quick@wg0 | my laptop | enrolled peers only |
「VPN」とだけ書いた行はまだ行ではない。行にはソケット、ホスト、識別情報、宛先が必要で、監査者や攻撃者が試すのはそこだからだ。
必要になる前に撤去を計画する
取り消せないトンネルは永久の扉である。デバイスの資格情報を失効させ、進行中のセッションを終わらせ、アップグレードがサービスを壊した後にアクセスを復旧する方法を前もって決める。復旧経路は、修復するのはトンネルそのものだから、トンネルを通さない。その機械なしで届く場所に保存する。
意図した宛先が動き、不要な宛先が動かないとき、レビューは完了する。脆弱性がないことの保証ではなく、スキャナーの緑の表示がどちらに代わるものでもない。表と復旧メモを、設定を引き継ぐ人に渡す。