廃止チケットが開く日にも、クライアントはまだ接続しています。アプリにはプロファイルが残り、ネゴシエーションを行い、何事もなかったかのようにトンネルが上がります。この瞬間に、サービスを構築したときとは逆の方向へ作業します。クライアント一覧から始め、外側のリスナーへ、次にファイアウォールへ進み、最後にそれらすべてより長く生きる資格情報で終えます。VMの停止は最初ではなく最後の手順であり、この手順は、ホストへのコンソールアクセスとクライアント記録およびDNSを編集する権限があることを前提としています。

まずクライアント一覧をたどる

プロファイルを配布しているものを開き、サーバーに触れる前に一覧を読みますが、各エントリはスマートフォン、ノートPC、支店ルーター、毎晩同期するコンテナなど、アクセスがあると信じている端末です。その一覧をチケットに書き出してください。ホストが消えた後では、誰が接続していたかを教える wg show は存在しません。

各端末を、代替エンドポイント、不要、不明のいずれかに分類しますが、重要なのは不明の箱です。数か月後に誰かが引き出しで見つけて試すのは、そうしたプロファイルだからです。アクセス依頼に使うのと同じチャネルで通知を送り、古いエンドポイントが応答をやめる日付を入れます。

ファイルではなく身元を取り消す

取り消しと呼ばれる行為には二種類あります。WireGuardでは、ピアはAllowedIPsエントリを持つピアセクションに現れる公開鍵だけで認可されるため、ノートPCから設定ファイルを削除してもサーバー側は何も変わりません。保持するピアを落とさずにピアブロックを削除してファイルを再適用する方法は、wg(8) のマニュアルに記載されています:

wg show
wg set wg0 peer <CLIENT_PUBLIC_KEY> remove
wg syncconf wg0 <(wg-quick strip wg0)

wg syncconf が保守ウィンドウを節約する部分です。ファイルからインターフェースをその場で再構築するため、一つのピアを外しても他の全員が使っているトンネルは切れません。一つのピアではなくホスト全体を廃止する場合でも、それらの鍵が別の場所で信頼されている可能性があるため順序は重要です。

X.509の構成では取り消す対象はファイルではなく証明書で、openssl ca -revoke client.crt を実行し、続いて openssl ca -gencrl -out crl.pem を実行します。効果があるのは検証側がそれを読む場所だけであり、つまり OpenVPN サーバーが crl-verify を設定され、その後で再読み込みされている場合だけです。このゲートウェイがそのCAの唯一の利用者なら、それが死んだ日からCRLは意味を失いますが、同じCAが二台目のゲートウェイに署名しているなら、決して取り消さなかった証明書がそこでは動き続けます。

アカウントは三番目のケースで、最も見落とされるケースです。ゲートウェイがRADIUS、LDAP、ホスト型IDプロバイダーに対して認証していた場合、アカウントはVPNの外にあります。ディレクトリで無効化してください。サーバー上のユーザースタンザを削除しても有効な資格情報が残り、代替エンドポイントは同じディレクトリを指した瞬間にそれを受け入れます。

リスナーとそこへの経路を閉じる

再起動に耐える方法でサービスを停止し、ユニットの状態ではなくソケット一覧で確認します。systemctl disable --now wg-quick@wg0 はインターフェースを止め、wg-quickが追加したルートとルールを削除し、systemctl disable --now openvpn-server@server はテンプレート化されたOpenVPNインスタンスに同じことをします。どちらかの後に ss -lunp と ss -ltnp を実行します。古いポートに対する空の結果だけが意味のある証拠です。

wg-quickが追加したものはwg-quickが削除しますが、手で追加したものは残ります。永続的なNATルール、ファイアウォールの許可、ルーターのポート転送、クラウドのセキュリティグループの受信ルール、ロードバランサーのリスナーです。これらは明示的に削除する必要があり、DNSレコード、つまり名前を指すA、AAAA、すべてのCNAMEも同様です。死んだホストに解決される名前は、解決されない名前とは違う失敗をし、その違いが誰かの午後を奪います。

忘れているコピーがクローンです。バックアップから復元したスナップショットやVMは、ホスト鍵と古いピア一覧をまだ保持しており、何かがそれを同じアドレスに戻すと、クライアントは廃止したはずのサービスへ再接続します。バックアップセットを廃止済みサービスに属するものとしてラベル付けし、自動復元経路から外してください。

古いエンドポイントを指しているものを追う

キャッシュされたプロファイルはDNSより長生きします。数値アドレスを持つ保存済み設定は、レコードが消えた後もダイヤルし続け、常時接続のクライアントはネットワークが変わるたびに再試行します。リスナーは閉じているので、それはアクセスではなくノイズですが、どちらを見ているかを知ることがチケットへの答え方を決めます。

次に、ポートを探る稼働監視、ホストから設定を引いていたバックアップジョブ、ピアエントリを押し込むために使われた自動化資格情報、このエンドポイントだけのために作られた復旧アカウントなど、誰もVPNの下に保管しない依存関係を掃討します。それぞれが独自の寿命と所有者を持つアクセス経路なので、静かに削除するのではなく、それぞれに判断を下します。

確認してから記録する

外部からのテストが期待どおりに失敗したとき、廃止は完了します。自分が制御しないネットワークから、古いアドレスとポートに接続します。フィルタされた結果や拒否された結果が成功です。クライアントアプリで、プロファイルが無効化ではなく削除されたこと、管理プロファイルが静かに追加し直していないことを確認します。

次に、エンドポイント、日付、取り消した鍵と証明書、無効化したアカウント、バックアップの場所など、行ったことを記録します。後で古い設定を見つけた人は、推測せずに、取り消されたのか単に削除されたのかを答えられる必要があり、チケットの短い表がそれを可能にします。

チケットを閉じる前に:

  • クライアントプロファイルを削除または交換し、不明な端末を解消した
  • ピアを削除して設定を再適用した、または証明書を取り消してCRLを公開した
  • ディレクトリアカウントを無効化し、ローカルファイルの削除だけで終えていない
  • サービスを無効化し、古いポートにリスナーが残っていない
  • ファイアウォール、ポート転送、セキュリティグループ、DNSエントリを削除した
  • バックアップにラベルを付け、スナップショットを復元経路から除外した
  • 監視と自動化の資格情報を廃止した

代替を別途確認する、古いプロファイルを一度も持ったことのないクライアントから。その一度のテストが、サービスを廃止したのか、問題の名前を変えただけなのかを教えてくれます。

関連記事