IKEv2 鍵交換の動作:SA 確立フェーズとリキー
IPsec VPN が切れずに安全を保つ理由を、IKE_SA_INIT と IKE_AUTH の2往復から鍵更新まで内部の動きで理解できます。トラブル解析の勘所もつかめます。
- 1.IKEv2 は IKE_SA_INIT と IKE_AUTH の計2往復(4メッセージ)で、制御用の IKE SA と通信用の Child SA を一度に確立する。
- 2.DH 鍵共有で SKEYSEED を作り、そこから PRF で IKE 用と Child SA 用の鍵を派生。認証は AUTH ペイロードの署名/PSK で相互検証する。
- 3.DPD でピア生存を確認し、寿命前に CREATE_CHILD_SA でリキーして鍵を更新。前方秘匿性を保ちつつ無停止で鍵を入れ替える。
IKEv2 が解く問題
IPsec は AH/ESP でパケットを暗号化・認証しますが、その前提となる「どの鍵で、どのアルゴリズムで守るか」を両端で安全に合意する仕組みが必要です。その合意を担うのが鍵交換プロトコル IKEv2(RFC 7296)です。IKEv1 が主モード/アグレッシブモードや複数フェーズで複雑だったのに対し、IKEv2 は 2往復(4メッセージ) で制御チャネルと最初のデータ用 SA をまとめて立ち上げる、簡潔で堅牢な設計に作り替えられました。VPN 全体像は /network/vpn/ を参照してください。
ここでいう SA(Security Association) とは、片方向の暗号パラメータ一式(アルゴリズム・鍵・寿命・対象トラフィック)をまとめた状態です。IKEv2 では2種類の SA を区別します。
| SA の種類 | 役割 | 守る対象 |
|---|---|---|
| IKE SA | 鍵交換・認証・管理用の制御チャネル | IKE メッセージ自身(UDP 500/4500) |
| Child SA | 実データを守る IPsec SA(ESP/AH) | ユーザーの通信トラフィック |
第1往復:IKE_SA_INIT で鍵の土台を作る
最初の交換 IKE_SA_INIT は平文で行われ、ここでアルゴリズムの合意と Diffie-Hellman 鍵共有を済ませます。--> がイニシエータ送信、<-- がレスポンダ送信です。
--> HDR, SAi1, KEi, Ni
SAi1 : 提案する暗号スイート群(暗号/PRF/整合性/DHグループ)
KEi : イニシエータの DH 公開値
Ni : イニシエータのノンス
<-- HDR, SAr1, KEr, Nr
SAr1 : レスポンダが選んだ1組のスイート
KEr : レスポンダの DH 公開値
Nr : レスポンダのノンス
DH 鍵共有の原理は ECDHE と同じで、両者は秘密値 a,b と公開値だけを交換し、共有秘密 g^ab を各自で計算します(詳細は /network/tls13-handshake-internals/ の鍵共有節と共通)。この共有秘密とノンスから、すべての鍵の種となる SKEYSEED を導きます。
SKEYSEED = prf( Ni | Nr , g^ab )
ここで prf は合意した疑似乱数関数(HMAC-SHA256 など)です。ノンスを混ぜるのは、過去のセッションと鍵が衝突しないようにする鮮度確保のためです。
SKEYSEED から鍵を派生する
SKEYSEED 単体では鍵に使わず、prf+(出力を繰り返し連結して任意長を作る拡張)で 7本の鍵 を一括導出します。順序は仕様で固定されています。
{SK_d | SK_ai | SK_ar | SK_ei | SK_er | SK_pi | SK_pr}
= prf+( SKEYSEED , Ni | Nr | SPIi | SPIr )
各鍵の用途は次の通りです。SK_d だけは Child SA の鍵材料の元になり、残りは IKE SA 自身の保護に使います。
| 鍵 | 向き/用途 | 使われ方 |
|---|---|---|
| SK_d | 派生用(方向なし) | Child SA の鍵材料を生む種 |
| SK_ai / SK_ar | 整合性(i→r / r→i) | IKE メッセージの完全性検証(MAC) |
| SK_ei / SK_er | 暗号(i→r / r→i) | IKE_AUTH 以降のペイロード暗号化 |
| SK_pi / SK_pr | 認証用 | AUTH ペイロードの計算に使う |
IKE_SA_INIT を終えた時点で SK_ei/SK_er が揃うため、第2往復 IKE_AUTH 以降のペイロードは暗号化+MAC で保護 されます。証明書や ID を含む認証情報は平文では流れません。これは TLS 1.3 が ServerHello 以降を暗号化するのと同じ発想です。
第2往復:IKE_AUTH で認証し Child SA を作る
第1往復では鍵を作りましたが、相手が本物かはまだ確認していません(DH 単体は中間者攻撃に弱い)。IKE_AUTH で相互認証を行い、同時に最初の Child SA を確立します。メッセージ本体は SK_e/SK_a で保護されます。
--> HDR, SK{ IDi, [CERT,] AUTH, SAi2, TSi, TSr }
<-- HDR, SK{ IDr, [CERT,] AUTH, SAr2, TSi, TSr }
IDi/IDr : 各自の識別子
AUTH : 相手を認証する署名 or PSK ベースの値
SAi2/SAr2 : Child SA 用の提案/選択
TSi/TSr : Traffic Selector(どの IP/ポート範囲を守るか)
認証の核心は AUTH ペイロード です。各端は「自分が送った IKE_SA_INIT メッセージ全体+相手のノンス+prf(SK_p, ID)」を1つの文字列にまとめ、それに対して署名(証明書認証)または PSK ベースの MAC を計算します。
AUTH = sig_or_prf( 自分の最初のIKEメッセージ | 相手のNonce | prf(SK_p, IDx) )
相手はこの AUTH を検証することで、(1) 通信相手が秘密鍵/PSK を持つ正当な相手であり、(2) IKE_SA_INIT が改ざんされていない(ダウングレードされていない)ことを同時に確認します。鍵共有と完全性検証が最初の交換に束ねられている点が、TLS 1.3 と共通する堅牢性の根拠です。
リモートアクセス VPN でユーザー名/パスワード認証(EAP)を使う場合、IKE_AUTH の中で EAP メッセージを複数回やり取りするため、4メッセージでは収まりません。基本形の「2往復」はあくまで証明書/PSK 相互認証のケースです。
Child SA の実際の暗号鍵は、ここでも SKEYSEED ではなく SK_d から派生します。
KEYMAT = prf+( SK_d , Ni | Nr )
IKE_AUTH 内で作るこの最初の Child SA は KE ペイロードを持たないため、上の式どおり SK_d とノンスだけで KEYMAT を導きます。ただし SK_d は IKE_SA_INIT の DH 共有秘密に由来するため、この Child SA も IKE SA 確立時の前方秘匿性を引き継いでいます。後から CREATE_CHILD_SA で 新たな DH 交換 を加えれば、KEYMAT = prf+(SK_d, g^ir_new | Ni | Nr) のように Child SA ごとに新鮮な共有秘密を混ぜられ(PFS)、IKE SA の鍵が将来漏れてもその Child SA の過去トラフィックは復号されません。
デッドピア検出(DPD)
確立後、相手が突然落ちても TCP のような明示的な切断は飛んできません。IKEv2 は DPD を、専用メッセージではなく INFORMATIONAL 交換の空リクエスト+応答(liveness check) で実現します。
--> HDR, SK{ } ← 中身は空。これだけで「生きてる?」の問い
<-- HDR, SK{ } ← 応答が返れば相手は生存
応答が一定回数返らなければピアは死んだとみなし、SA を破棄します。重要なのは DPD はオンデマンドで送るのが定石 という点で、常時ポーリングするのではなく「送るデータがあるのに ESP の応答が来ない」状況で初めて liveness を確認すると、無駄なトラフィックを避けられます。
リキー:無停止で鍵を入れ替える
SA には 寿命(ライフタイム) があり、時間または転送バイト量で上限に達する前に鍵を更新します。これが リキー(rekey) で、CREATE_CHILD_SA 交換で行います。鍵交換用と実データ用の両方が対象です。
| リキー対象 | やること | PFS との関係 |
|---|---|---|
| Child SA | 新しい Child SA を作り旧 SA を破棄 | 新規 DH を混ぜれば PFS 維持 |
| IKE SA | 新しい IKE SA に制御を移譲し旧を削除 | 新しい SKEYSEED から再派生 |
--> HDR, SK{ SA, Ni, [KEi,] [TSi, TSr] }
<-- HDR, SK{ SA, Nr, [KEr,] [TSi, TSr] }
KEi/KEr を含めれば新規 DH 交換 = PFS つきリキー
含めなければ既存の SK_d から派生(軽量だが PFS なし)
新しい SA が立ち上がってから旧 SA を Delete ペイロード で破棄するため、データプレーンは一瞬も止まりません。バイト量ベースの寿命を併用するのは、長時間でも大量転送で同じ鍵を使い続けると暗号解析のリスクが上がるためで、時間とデータ量のどちらか早い方で更新するのが安全です。
試験では「SKEYSEED から直接 ESP の鍵が出る」という誤りが頻出します。正しくは、SKEYSEED → prf+ で IKE 用7鍵を導出 → そのうち SK_d から Child SA(KEYMAT) を派生、という二段構えです。IKE SA の鍵と Child SA の鍵は別物で、リキーも別々に走ります。
両端がほぼ同時に同じ SA をリキーしようとすると、重複した SA が並立し得ます。RFC 7296 はノンス値の大小で「どちらの新 SA を残すか」を決める作法を定めていますが、実装差で片側だけが SA を消してブラックホール化する障害が現実に起きます。ログで CREATE_CHILD_SA の衝突を確認することが切り分けの第一歩です。
まとめ:4メッセージに凝縮された設計
IKEv2 は、IKE_SA_INIT で「鍵の土台(DH+SKEYSEED)」を、IKE_AUTH で「相互認証+最初の Child SA」を作り、わずか2往復で制御チャネルとデータチャネルを同時に立ち上げます。確立後は DPD で生存を確認し、CREATE_CHILD_SA で前方秘匿性を保ちながら無停止に鍵を更新し続けます。UDP の上で動く理由やトランスポート選択の背景は /network/tcp-udp/ を、暗号化通信の基礎概念は /network/tls/ を併読すると、IPsec が「いつ・どの鍵で・何を守るか」を一貫した状態機械として把握できます。
ネットワーク Article
IKEv2 鍵交換の動作:SA 確立フェーズとリキーを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
IPsec
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 5
導入後に効く点
DH 鍵共有で SKEYSEED を作り、そこから PRF で IKE 用と Child SA 用の鍵を派生。認証は AUTH ペイロードの署名/PSK で相互検証する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 5
判断チェックリスト
- 自社の用途が「IPsec / IKEv2」に近いか確認する。
- 強みである「IKEv2 は IKE_SA_INIT と IKE_AUTH の計2往復(4メッセージ)で、制御用の IKE SA と通信用の Child SA を一度に確立する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。