IPsec、OpenVPN、WireGuard における事前共有鍵の役割
共有の秘密はピアの認証にも保護層の追加にも使われ、その役割はプロトコルによって変わります。ユーザーのパスワードと取り違えないでください。
事前共有鍵という言葉は IPsec、OpenVPN、WireGuard のドキュメントに登場しますが、指しているのは三つの別のオブジェクトです。一つは認証用の秘密、一つは制御チャネルを守るもの、もう一つはすでに識別情報を持つハンドシェイクに材料を加えるものです。これらを同じものとして扱うと、誰も予想しなかった段階で失敗する接続になります。値をコピーする前に、そのプロトコルでこの項目が何をするのかを読んでください。
三つのプロトコル、三つの意味
各プロトコルは鍵の役割をそれぞれの仕様で定めており、その役割は重なりません。認証用の秘密は、二つのピアが同じ値を知っていることを証明します。制御チャネルの鍵は、その後に続くネゴシエーションを守ります。ハンドシェイクの追加要素は、ピアが誰であるかを変えずに鍵スケジュールを変えます。
こうした役割のいずれも人間のユーザーを認証せず、最も時間を浪費する混同はここにあります。事前共有鍵は交換の前に端末やゲートウェイへ配布されるため、保持者は誰でも相手側から同じに見えます。この性質は二台のルーター間の拠点間接続では利点になり、名前のある従業員を抱えるリモートアクセスサービスでは負債になります。導入を説明する文書では、アカウントの資格情報と暗号上の秘密を別の列に分けてください。
IPsec と OpenVPN では言葉の意味が違う
IKEv2 は証明書の代わりに事前共有の秘密でピアを認証でき、その値は両端で一致している必要があります。同じ秘密が通常は複数のピアにまとめて設定されるため、保持者は誰でも他のピアになりすませ、交換は持っていなかった識別鍵による前方秘匿性を得られません。
OpenVPN の tls-auth と tls-crypt は制御チャネルに固定鍵を付け、HMAC 署名を加えるかネゴシエーション自体を暗号化します。この鍵はユーザーのパスワードではなく、クライアント証明書の代わりにもなりません。両者を区別することは更新時に重要で、パスワードを変えても制御チャネルの鍵はそのまま残ります。
WireGuard の PSK は追加するもので、識別はしない
WireGuard のピアはすでに Curve25519 の公開鍵と秘密鍵を持ち、ハンドシェイクはその識別情報を認証します。任意の事前共有鍵はチェーン鍵に混ぜ込まれ、公開鍵交換の上に共通鍵の材料を加えます。
それ自体の識別情報もユーザーアカウントも提供しないため、運用者は PSK で二人の保持者を見分けられません。両端が同じ値を持たなければハンドシェイクは役に立つエラーもなく失敗します。だからこそローテーションは単一ファイルの編集ではなく、両側を同時に計画する必要があります。
配布・ローテーション・削除を確認する
配布は、一つの秘密を多くの場所で使うあらゆる設計の弱点です。チャット画面に貼り付けたり、リポジトリに保存したり、環境をまたいで使い回したりした値は、誰も数え切れない複製を生み、その複製が静かに影響範囲を広げます。
Base64 のテキストは暗号化ではありません。同じディレクトリで公開証明書の隣に置かれた秘密は、依然として平文の秘密です。
openssl rand -base64 32
sudo wg show wg0 preshared-keys
sudo grep -R -n 'psk' /etc/ipsec.d/ 2>/dev/null
定期的に、また漏えいが疑われた後にはローテーションし、古い値を失効させる前に予定したすべてのピアを更新してください。そのうえで、鍵が一致しないとハンドシェイクで失敗してファイアウォールの問題とまったく同じに見えるため、両端から接続を試してください。
どの秘密がどの段階を守るのかを文書に残せば、パスワードのリセットが暗号鍵の更新と取り違えられることはなくなります。この一行が、誰かが導入を監査するたびに一時間を節約します。