二つのプロファイル、片方は接続でき片方はできない。その理由を素早く見る方法はdiffだ。問題は、同じdiffがインラインの秘密鍵、静的鍵、ファイルが持つ認証情報ブロックまで出力してしまい、人は気づかないうちにその出力をチャットに貼り付けることにある。何を比較するかを決めるのはコマンドを実行する前だ。保護したコピー上で構造と役割を比較し、他の人が見る必要があるときは別のマスク済みファイルを作る。

.ovpnファイルが実際に持つもの

.ovpnファイルは任意のインラインブロックを持つ設定である。CA証明書、クライアント証明書、秘密鍵、tls-auth または tls-crypt 鍵、さらに外部ファイルを指す、または認証情報を求めるディレクティブを含められる。二つのファイルがほぼ同じに見えてブロックの内部だけが違うことも、トランスポートを根本から変える一つのディレクティブだけが違うこともある。行数からは、そのどちらが起きたのか何も分からない。

鍵ブロック内の違いは、何かの公的な証拠ではない。再発行された証明書と鍵を作り直した証明書は同じ形の変化を生みうるので、ブロックの不一致は素材が違うことを示すだけで、どの判断がそれを生んだかは示さない。フィールドを比較する合図として扱い、所見とはみなさない。

行ではなく役割で比較する

接続自身の順序に従う。まずエンドポイントとトランスポート、次に信頼と期待する身元、次にユーザー認証、次にルート、DNS、スクリプトフックだ。この順序はクライアントの動作と一致するので、最初に出会う違いが接続を壊した最初の原因になる。アルファベット順に比較すると、関連する設定が出力全体に散らばってしまう。

フィールドを意識した確認では、この順にこれらの項目を見る。クライアントが対話的に尋ねるものは信頼の行ではなく認証の行に属する。

  • remote、proto とポート(すべての接続ブロックを含む)。
  • ca と cert:発行者、サブジェクト、失効日。
  • 秘密鍵がそもそも存在するかどうか。内容は決して見ない。
  • tls-auth または tls-crypt の有無と鍵の方向。
  • 認証ディレクティブ。認証情報ファイルへの参照も含む。
  • 接続時に実行されるルート、DNSオプション、スクリプトフック。

ファイルが複数の接続ブロックを持つ場合は、各オプションをそのエンドポイントと一緒に保つ。最初のremote行だけを比較すると、このネットワークでクライアントが実際に選ぶ代替を見落とすことがある。

素のdiffが適切でない理由

素のdiffはテキスト用であり、秘密用ではない。秘密鍵を平気でスクロールバックに出力し、目の前のディレクティブが障害と無関係だとは教えてくれない。フィールド抽出はより安全で読みやすくもある。証明書の素材をバイトではなくメタデータとして比較できるからだ。

openssl x509 -in ca.crt -noout -subject -issuer -enddate
openssl x509 -in client.crt -noout -subject -issuer -enddate
grep -E '^(remote|proto|port|tls-auth|tls-crypt|route|dhcp-option)' profile.ovpn

最初の二つのコマンドは鍵に触れずに身元と有効性を出力するので、その出力は貼り付けても安全だ。grepはディレクティブ名と値を出力するがブロックの中身は決して出さないので、トランスポートやルーティングの違いを疑うときの最初の確認に適している。ブロック自体を比較する必要があるなら、内容ではなくハッシュを比較する。

チケット用にマスクしたコピーを作る

本物の秘密と不要な識別子を除き、フィールド名と違いを説明できるだけの構造は残す。同じ形のマーカーでも素材の位置と長さは分かってしまうので、それすら許容できるか判断する。覚えているコマンドを信じるのではなく、最終的な添付そのものを確認する。例を作るためだけに作業中の原本を編集してはならない。マスクしたプロファイルは実行できるとは限らず、二度と再インポートすべきではないからだ。

原本は似た名前の三つのディレクトリにコピーするのではなく、ファイル名とハッシュで識別できるようにしておく。ハッシュ文字列はどのファイルを確認したかを示すのに十分で、漏れても害はない。変更が閉じたらコピーを刈り込み、次の人が唯一の正となるファイルを引き継げるようにする。

比較を障害に結びつけたままにする

比較は、一回のインポートや一回の接続障害についての問いに答えるときに価値がある。まず失敗している段階を名指しし、その段階が依存するフィールドだけを比較する。クライアントが持つ認証情報をすべて一つのディレクトリに集めると、次の漏えいが起きやすくなり、次の診断が遅くなる。問いが狭いほど、答えられるフィールドの一覧は短くなる。

新しいファイルが運用者から来た場合は、信頼の素材を置き換える前に配布経路を確認する。変更後は、クライアントが実際に選んだインポート済みコピーと交渉された結果を確認する。ディレクティブは別のクライアント版では無視されたり違って読まれたりするからだ。ディスク上のファイルは、実行された接続の証拠ではない。ディレクティブの意味はOpenVPN 2.6のマニュアル.

関連記事