プロファイルをタブレットにコピーして接続すると、ノートPCが落ちる。duplicate-cn を追加すれば両方が接続したままになり、問題は解決したように見える——二台が同じトンネルアドレスを取り合うか、紛失したタブレットがアカウント全体をオフラインにするまでは。このオプションが変えるのは一点だけである。サーバーが、すでに見た名前で二本目のセッションを許すかどうか。デバイスの独立からデバイスごとのアドレス指定、選択的な失効まで、人々が期待するものは依然として識別子で決まり、ここでの識別子とは証明書である。

神話:二本目のセッションは二つ目の識別子である

直感的には、二つの接続は二つのクライアントであり、二つのクライアントはそれぞれ権利を持つ二台のデバイスであるはずだ。サーバーはそうモデル化しない。サーバーは共通名を見ており、duplicate-cn が有効なら、その名前を持つ複数のセッションを同時に受け入れる。各セッションはデーモン内で独自のセッション状態を持つ。

その受け入れは証明書の検証には一切触れない。同じ証明書が依然として資格情報であり、同じ鍵が依然として秘密鍵であり、証明書のサブジェクトをキーにするポリシーは依然として二回とも同じ値に解決される。二本目のセッションは二つ目のソケットであって、二つ目の識別子ではない。

その区別は、すべてが動いている間は見えない。二台を区別する必要が出た瞬間に、非常にはっきり見えるようになる。たいていは、どちらかを失った日である。

二つのセッションが名前を共有すると何が変わるのか

このオプションがなければ、すでに接続済みの共通名での新しい接続は、以前のセッションを押し出す。タブレットが接続するとノートPCが落ちるのはそのためであり、これはバグではなく意図的な曖昧さへの防御である。オプションがあれば両方のセッションが生き続け、サーバーはデバイス単位ではなくセッション単位で別々に追跡する。

各セッションは依然として独自の外部接続と独自のネゴシエート済み鍵を持つので、同時スループットは本当に同時である。共有しているのは資格情報から導かれるすべてだ。ポリシー検索、クライアント固有の設定、ログ上の識別子、失効。セッション状態は接続に属し、接続とともに消える。一方、資格情報レベルの事実は両方に残る。だからステータス出力は同じ名前を二回並べても、カウンターは別々のままになる。

その上で設計する前に、自分のビルドが実際に何をするのかを確認すること。オプションの効果を決めるのはオプション自体であり、言い伝えではない:

grep -n 'duplicate-cn\|client-config-dir\|username-as-common-name' /etc/openvpn/server.conf

割り当てたつもりでいた固定アドレス

クライアントごとの設定は名前で引かれる。そこが罠だ。共通名にちなんで名付けられたclient-config-dir ファイルはその名前を使うすべてのデバイスに適用されるため、中の ifconfig-push は両方のデバイスに同じトンネルアドレスを与える。二本目のセッションは確立に失敗するか、ルーティング障害に見える形で衝突する。

動的プールは偶然にもっとうまく振る舞う。各セッションにプールから独立してアドレスが割り当てられるからだ。それでもデバイスごとの固定アドレスにはならず、そのアドレスに紐づくデバイスごとのポリシーには決してならない。

配備が username-as-common-name を使う場合、検索キーは証明書のサブジェクトではなく認証済みユーザー名になり、二回ログインする誰にでも同じ衝突が起きる。設定を駆動する名前がデバイスごとに一意でなければ、デバイスごとの設定は意味を持たない。

共有された識別子が削除時にできないこと

失効は証明書に対して働き、表示名にもセッションにも働かない。その証明書を失効させれば、コピーを持つすべてのデバイスが一度にアクセスを失う。誰も邪魔したくないオフィスの一台も含まれる。維持すれば、紛失したデバイスは動き続ける。プロトコルの中に、承認済みのコピーと区別するものが何もないからだ。

ログも同じ曖昧さを受け継ぐ。ステータス出力は共通名と実アドレスを示し、どちらも二台のどちらにでも属しうる。どのマシンが何をしたかを知る必要のあるインシデントレビューは、VPN 自身の記録からその問いに答えられない。ログレベルがどれほど詳細を出しても同じだ。

これに暗号的な回避策はない。同じ証明書を提示する二台は、サーバーにとって同じ参加者が二回いるだけであり、そうでないと装う仕組みは制御ではなく命名規則にすぎない。

共有が正しいのはどんなときか、どう境界を引くか

共有には正当な用途がある。複数の試験機が使うラボアカウントや、デバイスをまとめて管理し失効の粒度が問題にならない家庭だ。そうした場合はオプションを意図的に有効にし、共有資格情報をデバイスごとのポリシーの外に置き、プールに余裕を持たせてセッションがアドレスで衝突しないようにする。

別々のアドレス、別々のログ、別々の削除が必要なものには、通常の登録手順で別々の証明書を発行する。そうすれば下流のどのシステムにも拠り所となる別個のオブジェクトが渡り、名前がすでに一意なのでこのオプションは意味を失う。

どの道を選んでも、テストするのはログインではなく管理モデルだ。両方のデバイスを接続し、異なるアドレスを持つことを確認し、次に喪失を模擬して、ちょうど一台だけを削除できるか確かめる。openvpn(8) のマニュアルがオプションの範囲を定める。共有が実際に許容できるかどうかを定めるのは、あなたの削除手順である。

関連記事