IPsec VPN のトンネルは、IKE(Internet Key Exchange)を使って、ルータ間で動的にネゴシエートされます。IKE は ISAKMP というプロトコルの枠組みを使って、2台のピアの間で IPsec のパラメータや鍵を取り決めます。ISAKMP は UDP ポート 500 番で通信します。
IKE のやり取りは、フェーズ1とフェーズ2の2段階に分かれます。この記事では、IKEv1 のフェーズ1(メインモード)の6つのメッセージを、検証で取ったパケットキャプチャと合わせて1つずつ確認し、続くフェーズ2(クイックモード)の流れも説明します。
- IKE のフェーズ1とフェーズ2で、それぞれ何を決めて何ができるのか
- メインモードの6つのメッセージの中身(パケットキャプチャで確認)
- クイックモードの3つのメッセージと、IPsec SA に必要なパラメータ
- ISAKMP SA と IPsec SA の数とライフタイム
検証では、2台のルータ(192.168.12.1 と 192.168.12.2)の間で IPsec VPN を張りました。192.168.12.1 がネゴシエーションを始める側(イニシエータ)、192.168.12.2 が応答する側(レスポンダ)です。
IKEフェーズ1
IKE フェーズ1では、ルータ間で使う暗号化アルゴリズム、ハッシュアルゴリズム、認証方法などを交渉し、相手を認証したうえで、フェーズ2のやり取りを守るための安全な通り道(ISAKMP SA)を作ります。フェーズ1は、大きく分けて3つのステップで進みます。
3つのステップ
パラメータ交渉
まず、ISAKMP SA で使う次のパラメータをルータ間で交渉(ネゴシエーション)します。右の列は、今回のキャプチャで提案されていた値です。
| パラメータ | 内容 | 今回の値 |
|---|---|---|
| 暗号化アルゴリズム | どの暗号化アルゴリズムを使うかをルータ間で合わせます。DES、3DES、AES などがあります。 | AES-CBC(鍵長 256) |
| ハッシュアルゴリズム | 改ざんの検知や鍵の生成に使うハッシュアルゴリズムを合わせます。SHA などがあります。 | SHA2-512 |
| Diffie-Hellman グループ | 鍵交換に使う DH の種類と鍵長を合わせます。 | 2048-bit MODP Group with 256-bit Prime Order Subgroup |
| 認証方法 | 相手が本物かを確かめる方法です。事前共有鍵(Pre-shared key)やデジタル証明書を使います。 | Pre-shared key |
| ライフタイム | ISAKMP SA を使い続ける時間です。Cisco ルータの既定値は 86,400 秒(24 時間)です。 | 86400 秒 |
DH グループの番号は登録された順に付いたもので、番号が大きいほど強いわけではありません。たとえば、グループ 14 は 2048 ビット、グループ 22 は 1024 ビットで、番号の大きいグループ 22 のほうが弱くなります。強さは番号ではなく、種類と鍵長で判断します。
今回のキャプチャの「2048-bit MODP Group with 256-bit Prime Order Subgroup」はグループ 24 です。IKEv2 の暗号アルゴリズムの要件をまとめた RFC 8247 では、グループ 24 は「使うべきではない(SHOULD NOT)」とされています。新しく設定する場合は、グループ 14(2048 ビット)や、楕円曲線を使うグループ 19、20 を選ぶのが一般的です。
Diffie-Hellman 鍵交換
次に、交渉した DH グループを使って Diffie-Hellman 鍵交換をします。DH では、お互いが公開してよい値だけを送り合い、それぞれの手元で同じ鍵の元を計算します。鍵そのものはネットワークに流れないので、途中でやり取りを見られても鍵は作れません。DH の仕組みは Diffie-Hellman 鍵交換をイメージで解説 で詳しく説明しています。
認証
最後に、DH で作った鍵で暗号化した状態で、自分の ID(ルータの IP アドレスなど)と認証用のハッシュを送り合い、お互いを認証します。事前共有鍵の場合は、同じ事前共有鍵を知っている相手しか正しいハッシュを作れないことを利用して確かめます。
この3つのステップは、メインモードかアグレッシブモードのどちらかで行います。
| モード | メッセージ数 | 特徴 |
|---|---|---|
| メインモード | 6つ | ID を暗号化してから送るので、ID が第三者に見えない(Identity Protection)。そのぶんやり取りが多い |
| アグレッシブモード | 3つ | 少ないやり取りで済むが、最初のメッセージで ID が暗号化されずに送られる |
この記事ではメインモードについてまとめます。
メインモード
メインモードでは、ルータ間で6つのメッセージをやり取りします。奇数番目のメッセージはイニシエータから、偶数番目のメッセージはレスポンダからの返信です。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
メッセージ 1つ目
イニシエータがレスポンダに送る最初のメッセージです。暗号化アルゴリズム、ハッシュアルゴリズム、認証方法、DH グループ、ライフタイムの組み合わせを提案(プロポーザル)します。
ISAKMP ヘッダには、ISAKMP SA を識別するための値(Wireshark の表示では Initiator SPI と Responder SPI)が入ります。イニシエータは自分の SPI を入れますが、この時点ではレスポンダの SPI はまだわからないので、Responder SPI は 0 です。
▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.2▸ User Datagram Protocol, Src Port: 500, Dst Port: 500▾ Internet Security Association and Key Management Protocol1 Initiator SPI: 1ca67fd4c1e75a0f Responder SPI: 0000000000000000 Next payload: Security Association (1) ▸ Version: 1.02 Exchange type: Identity Protection (Main Mode) (2) ▸ Flags: 0x00 Message ID: 0x00000000 Length: 168 ▾ Payload: Security Association (1) Next payload: Vendor ID (13) Reserved: 00 Payload length: 60 Domain of interpretation: IPSEC (1) ▸ Situation: 00000001 ▾ Payload: Proposal (2) # 1 Next payload: NONE / No Next Payload (0) Reserved: 00 Payload length: 48 Proposal number: 1 Protocol ID: ISAKMP (1) SPI Size: 0 Proposal transforms: 1 ▾ Payload: Transform (3) # 1 Next payload: NONE / No Next Payload (0) Reserved: 00 Payload length: 40 Transform number: 1 Transform ID: KEY_IKE (1) Reserved: 00003 ▸ IKE Attribute (t=1,l=2): Encryption-Algorithm: AES-CBC ▸ IKE Attribute (t=14,l=2): Key-Length: 2564 ▸ IKE Attribute (t=2,l=2): Hash-Algorithm: SHA2-5125 ▸ IKE Attribute (t=4,l=2): Group-Description: 2048-bit MODP Group with 256-bit Prime Order Subgroup6 ▸ IKE Attribute (t=3,l=2): Authentication-Method: Pre-shared key7 ▸ IKE Attribute (t=11,l=2): Life-Type: Seconds ▸ IKE Attribute (t=12,l=4): Life-Duration: 864008 ▸ Payload: Vendor ID (13) : RFC 3947 Negotiation of NAT-Traversal in the IKE ▸ Payload: Vendor ID (13) : draft-ietf-ipsec-nat-t-ike-07 ▸ Payload: Vendor ID (13) : draft-ietf-ipsec-nat-t-ike-03 ▸ Payload: Vendor ID (13) : draft-ietf-ipsec-nat-t-ike-02\n
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Initiator SPI / Responder SPI | ISAKMP SA を識別する値。イニシエータの値だけが入り、レスポンダの値は 0 |
| 2 | Identity Protection (Main Mode) (2) | 交換の種類がメインモードであること |
| 3 | AES-CBC / Key-Length: 256 | 暗号化アルゴリズムは AES-CBC、鍵長 256 ビット |
| 4 | SHA2-512 | ハッシュアルゴリズム |
| 5 | Group-Description | DH グループ(グループ 24) |
| 6 | Pre-shared key | 認証方法は事前共有鍵 |
| 7 | Life-Type / Life-Duration | ライフタイムは秒単位で 86400 秒(24 時間) |
| 8 | Vendor ID : RFC 3947 … | NAT トラバーサル(RFC 3947)に対応していることを相手に伝える |
メッセージ 2つ目
レスポンダは、イニシエータから提案されたパラメータの中から使うものを選び、自分の SPI を入れて返信します。ここで Initiator SPI と Responder SPI の両方がそろい、以降のメッセージはこの2つの値で同じ ISAKMP SA のやり取りだとわかるようになります。
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▸ User Datagram Protocol, Src Port: 500, Dst Port: 500▾ Internet Security Association and Key Management Protocol1 Initiator SPI: 1ca67fd4c1e75a0f Responder SPI: e29b4a6a316db201 Next payload: Security Association (1) ▸ Version: 1.0 Exchange type: Identity Protection (Main Mode) (2) ▸ Flags: 0x00 Message ID: 0x00000000 Length: 108 ▾ Payload: Security Association (1) ⋮(中略) ▾ Payload: Transform (3) # 1 Transform ID: KEY_IKE (1)2 ▸ IKE Attribute (t=1,l=2): Encryption-Algorithm: AES-CBC ▸ IKE Attribute (t=14,l=2): Key-Length: 256 ▸ IKE Attribute (t=2,l=2): Hash-Algorithm: SHA2-512 ▸ IKE Attribute (t=4,l=2): Group-Description: 2048-bit MODP Group with 256-bit Prime Order Subgroup ▸ IKE Attribute (t=3,l=2): Authentication-Method: Pre-shared key ▸ IKE Attribute (t=11,l=2): Life-Type: Seconds ▸ IKE Attribute (t=12,l=4): Life-Duration: 86400 ▸ Payload: Vendor ID (13) : RFC 3947 Negotiation of NAT-Traversal in the IKE
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Responder SPI: e29b4a6a316db201 | レスポンダの SPI が入り、2つの値がそろう |
| 2 | IKE Attribute の各値 | レスポンダが選んだパラメータ。今回は提案が1つだけなので、メッセージ1と同じ値 |
メッセージ 3つ目
イニシエータは、交渉した DH グループで計算した DH の公開値(Key Exchange ペイロード)と、ナンス(Nonce、使い捨てのランダムな値)を送信します。ペイロードの構成は、次のメッセージ4と同じです。
お互いが NAT トラバーサルに対応している場合は、メッセージ3と4に NAT-D ペイロードも入ります。NAT-D は送信元・宛先の IP アドレスとポートから計算したハッシュで、受け取った側は自分で計算した値と比べて、途中に NAT があるかどうかを判断します。
メッセージ 4つ目
レスポンダも、DH の公開値とナンスを送信します。ここで、お互いが相手の DH の公開値とナンスを手に入れたので、それぞれの手元で同じ鍵を計算できます。事前共有鍵の場合は、DH の結果とナンス、事前共有鍵から、メッセージ5以降の暗号化や認証に使う鍵を作ります。
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▸ User Datagram Protocol, Src Port: 500, Dst Port: 500▾ Internet Security Association and Key Management Protocol Initiator SPI: 1ca67fd4c1e75a0f Responder SPI: e29b4a6a316db201 Next payload: Key Exchange (4) ▸ Version: 1.0 Exchange type: Identity Protection (Main Mode) (2) ▸ Flags: 0x00 Message ID: 0x00000000 Length: 5201 ▾ Payload: Key Exchange (4) Next payload: Nonce (10) Reserved: 00 Payload length: 260 Key Exchange Data: 01f91a7e1fb236b94f80529cea06e18a703718f912fbf08b…2 ▾ Payload: Nonce (10) Next payload: Vendor ID (13) Reserved: 00 Payload length: 24 Nonce DATA: e342aa0fe3d185494afce8d7b1510a82523a7f97 ▸ Payload: Vendor ID (13) : CISCO-UNITY 1.0 ▸ Payload: Vendor ID (13) : RFC 3706 DPD (Dead Peer Detection) ▸ Payload: Vendor ID (13) : Unknown Vendor ID ▸ Payload: Vendor ID (13) : XAUTH3 ▸ Payload: NAT-D (RFC 3947) (20) ▸ Payload: NAT-D (RFC 3947) (20)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Payload: Key Exchange (4) | DH の公開値。Payload length 260 はヘッダ 4 バイト+データ 256 バイト(2048 ビット)で、2048 ビットの DH グループと合う |
| 2 | Payload: Nonce (10) | ナンス。Payload length 24 はヘッダ 4 バイト+データ 20 バイト |
| 3 | NAT-D (RFC 3947) | NAT があるかを調べるためのハッシュ(2つ) |
このほかの Vendor ID ペイロードは、DPD(Dead Peer Detection、RFC 3706)など、そのルータが対応している拡張機能を相手に伝えるものです。
メッセージ 5つ目
イニシエータは、メッセージ4までで作った鍵を使って、自分の ID(ルータの IP アドレスなど)と認証用のハッシュを暗号化して送信します。ヘッダの Flags で Encryption のビットが 1 になっており、中身は Encrypted Data としか表示されません。ヘッダは暗号化されないので、最初のペイロードが Identification(ID)であることは見えます。
▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.2▸ User Datagram Protocol, Src Port: 500, Dst Port: 500▾ Internet Security Association and Key Management Protocol Initiator SPI: 1ca67fd4c1e75a0f Responder SPI: e29b4a6a316db2011 Next payload: Identification (5) ▸ Version: 1.0 Exchange type: Identity Protection (Main Mode) (2)2 ▾ Flags: 0x01 .... ...1 = Encryption: Encrypted .... ..0. = Commit: No commit .... .0.. = Authentication: No authentication Message ID: 0x00000000 Length: 1403 Encrypted Data (112 bytes)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Next payload: Identification (5) | 最初のペイロードが ID であること |
| 2 | Encryption: Encrypted | ヘッダより後ろが暗号化されていること |
| 3 | Encrypted Data (112 bytes) | 暗号化された ID と認証用のハッシュ |
メッセージ 6つ目
レスポンダも同じように、自分の ID と認証用のハッシュを暗号化して送り返します。お互いに相手のハッシュを確認できれば認証が終わり、ISAKMP SA が確立します。ISAKMP SA は双方向で使う SA で、ルータ間に1つできます。
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▸ User Datagram Protocol, Src Port: 500, Dst Port: 500▾ Internet Security Association and Key Management Protocol Initiator SPI: 1ca67fd4c1e75a0f Responder SPI: e29b4a6a316db2011 Next payload: Identification (5) ▸ Version: 1.0 Exchange type: Identity Protection (Main Mode) (2)2 ▾ Flags: 0x01 .... ...1 = Encryption: Encrypted .... ..0. = Commit: No commit .... .0.. = Authentication: No authentication Message ID: 0x00000000 Length: 1243 Encrypted Data (96 bytes)
IKEフェーズ2
フェーズ2では、フェーズ1で確立した ISAKMP SA に守られた状態で、実際のユーザデータを保護するための鍵とパラメータを決め、IPsec SA を確立します。IKEv1 でフェーズ2を行うモードをクイックモードと呼びます。クイックモードのメッセージは、ヘッダより後ろがすべて ISAKMP SA の鍵で暗号化されています。
クイックモード
クイックモードでは、3つのメッセージをやり取りします。
メッセージ 1つ目
イニシエータは、IPsec SA に必要な次のパラメータと、ナンスを送信します。
| パラメータ | 内容 |
|---|---|
| IPsec プロトコル | ESP か AH か。暗号化するなら ESP を使います |
| カプセル化モード | トンネルモードかトランスポートモードか |
| 暗号化アルゴリズム | 3DES、AES など |
| 完全性(認証)アルゴリズム | HMAC-MD5、HMAC-SHA1 など。改ざんを検知するために使います |
| ライフタイム | IPsec SA を使い続ける時間やデータ量。Cisco ルータの既定値は 3,600 秒(1 時間)と 4,608,000 KB です |
| Proxy ID(IDci/IDcr) | どのトラフィックを暗号化するか。イニシエータ側(Local)とレスポンダ側(Remote)の2つのアドレス範囲を送ります |
PFS を有効にすると、クイックモードのメッセージ1と2に KE ペイロードが入り、IPsec SA を作るたびに新しく DH 鍵交換をします。PFS を使わない場合、IPsec SA の鍵はフェーズ1で作った鍵の元から作られます。PFS を使う場合は、両側のルータで PFS の有無と DH グループをそろえる必要があります。
メッセージ 2つ目
レスポンダは、提案の中から選んだパラメータと、自分のナンスを返します。Proxy ID は、メッセージ1で受け取った IDci と IDcr の組をそのまま入れて返します。
Proxy ID は、両側のルータの設定が鏡写しになっている必要があります。イニシエータの Local(自分側のアドレス範囲)がレスポンダの Remote に、イニシエータの Remote がレスポンダの Local になるように設定します。ここが一致しないと、フェーズ2のネゴシエーションが失敗します。
メッセージ 3つ目
イニシエータは、確認のためのハッシュ(HASH(3))を送ります。これでクイックモードが終わり、IPsec SA が確立します。IPsec SA は片方向の SA なので、送信用と受信用で1つずつ、2台のルータ間に合計2つできます。それぞれの IPsec SA には別々の SPI が割り当てられ、ESP パケットのヘッダに入ります。
この記事は IKEv1 の流れです。IKEv2 にはメインモードやクイックモードはなく、IKE_SA_INIT と IKE_AUTH の4つのメッセージで、IKE SA と最初の IPsec SA(Child SA)を作ります。
まとめ
| 項目 | フェーズ1(メインモード) | フェーズ2(クイックモード) |
|---|---|---|
| 目的 | 相手を認証し、フェーズ2を守る ISAKMP SA を作る | ユーザデータを守る IPsec SA を作る |
| メッセージ数 | 6つ(1・2 パラメータ交渉、3・4 DH 鍵交換、5・6 認証) | 3つ |
| 暗号化 | メッセージ5以降が暗号化される | すべて ISAKMP SA で暗号化される |
| 主なパラメータ | 暗号化、ハッシュ、DH グループ、認証方法、ライフタイム | ESP/AH、カプセル化モード、暗号化、完全性、ライフタイム、Proxy ID、PFS |
| できる SA | ISAKMP SA(双方向で1つ) | IPsec SA(片方向ずつ、合計2つ) |
| Cisco の既定のライフタイム | 86,400 秒(24 時間) | 3,600 秒(1 時間)/4,608,000 KB |
コメント