概要
IPSecの規格について勉強したメモ。
アーキテクチャ
IPSecは4つの技術から成り立つ。
技術 | 内容 |
---|---|
セキュリテイプロトコル | AH:認証、ESP:暗号化 |
鍵交換 | IKE |
セキュリティアソシエーション | セキュリテイプロトコルと鍵交換を管理 |
認証・暗号化アルゴリズム | セキュリテイプロトコル、鍵交換で用いられるアルゴリズム |
IPSecではAHまたはESPどちらかが使われる。 AHは認証による改ざん検知機能があり、ESPは暗号化が行われる(改ざん検知はオプション)
AHは暗号化通信が許可されていない国向けの規格であり通常ESPが使われる。
IPSecの通信モード
通信モード | 適用例 | 内容 |
---|---|---|
トランスポートモード | IPsecが実装されたホスト間でのIPsec-VPN | ・パケットの元のIPヘッダは暗号化されない ・パケットの元のIPヘッダ情報でルーティングされる ・L4以上のパケットが暗号化される |
トンネルモード | IPsecが実装されたルータ間でのIPsec-VPN | ・パケットの元のIPヘッダは暗号化される ・元のパケットに新たなIPヘッダが付与される ・新たなIPヘッダにもとづいてルーティングされる |
トンネルモードでセキュア化を行うルータをセキュリティゲートウェイという。
セキュリティポリシー
セキュリティゲートウェイで受け取ったIPデータグラムをどう扱うかを記述したもの。
処理 | 内容 |
---|---|
PROTECT | IPsecによるセキュア化 |
BYPASS | 通常の処理(セキュア化なし) |
DISCARD | 破棄 |
セレクタ
セキュリティゲートウェイが受信したデータグラムを見てどのセキュリティポリシー処理を適用するかを判断する。
セレクタ | 内容 |
---|---|
ローカルIPアドレス | GWの内側IPアドレス(送信側なら送信元、受信側なら宛先) |
リモートIPアドレス | GWの外側IPアドレス(送信側なら宛先、受信側なら送信元) |
ローカルポート番号 | GWの内側ポート番号 |
リモートポート番号 | GWの外側ポート番号 |
プロトコル | IPヘッダの上位プロトコル番号 |
IPv6モビリティヘッダ | IPv6で次ヘッダがモビリティヘッダだった場合、そのタイプ(MHタイプ) |
ICMPタイプ/コード | 上位プロトコルがICMPの場合、そのタイプとコード |
名前 | 主にIKEで交換されるID |
SPD
セキュリティーポリシーデータベース。セキュリティポリシーを集めて登録したもの。
SPDには以下の3つとSPDキャッシュが存在する。
セレクタ | 内容 |
---|---|
SPD-O | 送信(Outbound方向の通信)の際に使用するポリシー、各ポリシーにBYPASSまたはDISCARDの値を持つ |
SPD-I | 受信(Inbound方向の通信)の際に使用するポリシー、各ポリシーにBYPASSまたはDISCARDの値を持つ |
SPD-S | パケットのセキュア化に使用するポリシー、各ポリシーにPROTECTの値を持つ |
トラフィックの方向とSPD,SADの関係を下図に示す。
SAD
SA用のパラメータのセットの集合体をSADと呼ぶ。具体的にはSAのセキュア化のためのパラメータ群であり鍵とかアルゴリズムとかIV等である。
SA
SAとは、セキュリティポリシーによるアクセス制御とセキュリティパラメータを使った、
送信側と受信側の合意(=パラメータの一致)によるセキュアな仮想通信路。
片方向であり、行きと帰りで別々に作成される。
SPDでパケットの処理(BYPASS、DISCARD、PROTECT)が決まる。PROTECTの場合にSAを構築する。その際SADを検索しパラメータを取得する。
SPD, セレクタ、SADの関係
LANから受信したパケットについて該当するとセレクタをSPDを検索しIPSec通信対象か判定する。IPSec通信対象の場合、SADを検索し、SAを特定する。該当するSAのパラメタを元にパケットを暗号化して送出する。
受信装置では、SADをパケットの一致するSAを特定し、パケットがポリシーに一致するかをチェックし、復号する。
Linuxのstrongswanを用いた環境で確認
以下で作成した環境で、xfrmでSPDとSADおよびIKE SA, child SAを確認する。
SADの確認
ip xfrm stateで表示される内容がSADの内容である。
双方向で2つのSAができていることがわかる。
$ sudo ip netns exec sun ip xfrm state
src 2001:db8::1 dst 2001:db8::2
proto esp spi 0xcaa25e66 reqid 1 mode tunnel
replay-window 0 flag af-unspec
enc cbc(aes) 0x189043c11f6f06ecfb26b9dd9141eb9b5e442b821ab7b51b58e50fc9893701d9
anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000
src 2001:db8::2 dst 2001:db8::1
proto esp spi 0xcddc56f1 reqid 1 mode tunnel
replay-window 32 flag af-unspec
enc cbc(aes) 0x5617c9f964efb60b65874cbf4276370643a9924202d56dd3eb290e4b0da2e959
anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000
SPDの確認
ip xfrm policyで表示される内容がSPDの内容である。
out, fwd, inの3つのポリシーができていることがわかる。
$ sudo ip netns exec sun ip xfrm policy
src 192.168.0.0/24 dst 192.168.1.0/24
dir out priority 375423
tmpl src 2001:db8::1 dst 2001:db8::2
proto esp spi 0xcaa25e66 reqid 1 mode tunnel
src 192.168.1.0/24 dst 192.168.0.0/24
dir fwd priority 375423
tmpl src 2001:db8::2 dst 2001:db8::1
proto esp reqid 1 mode tunnel
src 192.168.1.0/24 dst 192.168.0.0/24
dir in priority 375423
tmpl src 2001:db8::2 dst 2001:db8::1
proto esp reqid 1 mode tunnel
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0
src 0.0.0.0/0 dst 0.0.0.0/0
socket in priority 0
src 0.0.0.0/0 dst 0.0.0.0/0
socket out priority 0
src ::/0 dst ::/0
socket in priority 0
src ::/0 dst ::/0
socket out priority 0
src ::/0 dst ::/0
socket in priority 0
src ::/0 dst ::/0
socket out priority 0
SAの確認
ipsec statusallで見ると、「IPv4_IPv6: 2001:db8::1...2001:db8::2 IKEv2」と「IPv4_IPv6: child: 192.168.0.0/24 === 192.168.1.0/24 TUNNEL」IKE SAとChild SAが出来ていることがわかる。
ubuntu@ipsec:~$ sudo ip netns exec sun ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.5, Linux 5.4.0-125-generic, x86_64):
uptime: 21 minutes, since Sep 04 16:23:47 2022
malloc: sbrk 1486848, mmap 0, used 386720, free 1100128
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 2
loaded plugins: charon aes des rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem fips-prf gmp curve25519 xcbc cmac hmac drbg attr kernel-netlink resolve socket-default stroke vici updown xauth-generic counters
Listening IP addresses:
192.168.0.1
2001:db8::1
Connections:
IPv4_IPv6: 2001:db8::1...2001:db8::2 IKEv2
IPv4_IPv6: local: [2001:db8::1] uses pre-shared key authentication
IPv4_IPv6: remote: [2001:db8::2] uses pre-shared key authentication
IPv4_IPv6: child: 192.168.0.0/24 === 192.168.1.0/24 TUNNEL
Security Associations (1 up, 0 connecting):
IPv4_IPv6[1]: ESTABLISHED 21 minutes ago, 2001:db8::1[2001:db8::1]...2001:db8::2[2001:db8::2]
IPv4_IPv6[1]: IKEv2 SPIs: ebceab9d3de9ff58_i 8465187deb3adfc8_r*, pre-shared key reauthentication in 9 hours
IPv4_IPv6[1]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
IPv4_IPv6{1}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cddc56f1_i caa25e66_o
IPv4_IPv6{1}: AES_CBC_256, 420 bytes_i (5 pkts, 229s ago), 420 bytes_o (5 pkts, 229s ago), rekeying in 23 minutes
IPv4_IPv6{1}: 192.168.0.0/24 === 192.168.1.0/24
またsyslogには以下出力されている。
Sep 4 16:23:47 ipsec charon: 00[JOB] spawning 16 worker threads
Sep 4 16:23:47 ipsec charon: 05[CFG] received stroke: add connection 'IPv4_IPv6'
Sep 4 16:23:47 ipsec charon: 05[CFG] added configuration 'IPv4_IPv6'
Sep 4 16:23:54 ipsec charon: 10[IKE] retransmit 2 of request with message ID 0
Sep 4 16:23:54 ipsec charon: 10[NET] sending packet: from 2001:db8::2[500] to 2001:db8::1[500] (336 bytes)
Sep 4 16:23:54 ipsec charon: 07[NET] received packet: from 2001:db8::2[500] to 2001:db8::1[500] (336 bytes)
Sep 4 16:23:54 ipsec charon: 07[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]
Sep 4 16:23:54 ipsec charon: 07[IKE] 2001:db8::2 is initiating an IKE_SA
Sep 4 16:23:54 ipsec charon: 07[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
Sep 4 16:23:54 ipsec charon: 07[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
Sep 4 16:23:54 ipsec charon: 07[NET] sending packet: from 2001:db8::1[500] to 2001:db8::2[500] (344 bytes)
Sep 4 16:23:54 ipsec charon: 11[NET] received packet: from 2001:db8::1[500] to 2001:db8::2[500] (344 bytes)
Sep 4 16:23:54 ipsec charon: 11[ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
Sep 4 16:23:54 ipsec charon: 11[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
Sep 4 16:23:54 ipsec charon: 11[IKE] authentication of '2001:db8::2' (myself) with pre-shared key
Sep 4 16:23:54 ipsec charon: 11[IKE] establishing CHILD_SA IPv4_IPv6{1}
Sep 4 16:23:54 ipsec charon: 11[ENC] generating IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
Sep 4 16:23:54 ipsec charon: 11[NET] sending packet: from 2001:db8::2[4500] to 2001:db8::1[4500] (304 bytes)
Sep 4 16:23:54 ipsec charon: 08[NET] received packet: from 2001:db8::2[4500] to 2001:db8::1[4500] (304 bytes)
Sep 4 16:23:54 ipsec charon: 08[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
Sep 4 16:23:54 ipsec charon: 08[CFG] looking for peer configs matching 2001:db8::1[2001:db8::1]...2001:db8::2[2001:db8::2]
Sep 4 16:23:54 ipsec charon: 08[CFG] selected peer config 'IPv4_IPv6'
Sep 4 16:23:54 ipsec charon: 08[IKE] authentication of '2001:db8::2' with pre-shared key successful
Sep 4 16:23:54 ipsec charon: 08[IKE] peer supports MOBIKE
Sep 4 16:23:54 ipsec charon: 08[IKE] authentication of '2001:db8::1' (myself) with pre-shared key
Sep 4 16:23:54 ipsec charon: 08[IKE] IKE_SA IPv4_IPv6[1] established between 2001:db8::1[2001:db8::1]...2001:db8::2[2001:db8::2]
Sep 4 16:23:54 ipsec charon: 08[IKE] scheduling reauthentication in 35389s
Sep 4 16:23:54 ipsec charon: 08[IKE] maximum IKE_SA lifetime 35929s
Sep 4 16:23:54 ipsec charon: 08[CFG] selected proposal: ESP:AES_CBC_256/NO_EXT_SEQ
Sep 4 16:23:54 ipsec charon: 08[IKE] CHILD_SA IPv4_IPv6{1} established with SPIs cddc56f1_i caa25e66_o and TS 192.168.0.0/24 === 192.168.1.0/24
Sep 4 16:23:54 ipsec charon: 08[ENC] generating IKE_AUTH response 1 [ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) ]
Sep 4 16:23:54 ipsec charon: 08[NET] sending packet: from 2001:db8::1[4500] to 2001:db8::2[4500] (240 bytes)
Sep 4 16:23:54 ipsec charon: 12[NET] received packet: from 2001:db8::1[4500] to 2001:db8::2[4500] (240 bytes)
Sep 4 16:23:54 ipsec charon: 12[ENC] parsed IKE_AUTH response 1 [ IDr AUTH SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) ]
Sep 4 16:23:54 ipsec charon: 12[IKE] authentication of '2001:db8::1' with pre-shared key successful
Sep 4 16:23:54 ipsec charon: 12[IKE] IKE_SA IPv4_IPv6[1] established between 2001:db8::2[2001:db8::2]...2001:db8::1[2001:db8::1]
Sep 4 16:23:54 ipsec charon: 12[IKE] scheduling reauthentication in 35428s
Sep 4 16:23:54 ipsec charon: 12[IKE] maximum IKE_SA lifetime 35968s
Sep 4 16:23:54 ipsec charon: 12[CFG] selected proposal: ESP:AES_CBC_256/NO_EXT_SEQ
Sep 4 16:23:54 ipsec charon: 12[IKE] CHILD_SA IPv4_IPv6{1} established with SPIs caa25e66_i cddc56f1_o and TS 192.168.1.0/24 === 192.168.0.0/24
auth.logには以下ログが出ている。
Sep 4 16:23:42 ipsec ipsec_starter[1100]: Starting strongSwan 5.9.5 IPsec [starter]...
Sep 4 16:23:42 ipsec ipsec_starter[1104]: charon (1105) started after 60 ms
Sep 4 16:23:42 ipsec charon: 07[IKE] initiating IKE_SA IPv4_IPv6[1] to 2001:db8::1
Sep 4 16:23:47 ipsec ipsec_starter[1125]: Starting strongSwan 5.9.5 IPsec [starter]...
Sep 4 16:23:47 ipsec ipsec_starter[1129]: charon (1130) started after 20 ms
Sep 4 16:23:54 ipsec charon: 07[IKE] 2001:db8::2 is initiating an IKE_SA
Sep 4 16:23:54 ipsec charon: 11[IKE] establishing CHILD_SA IPv4_IPv6{1}
Sep 4 16:23:54 ipsec charon: 08[IKE] IKE_SA IPv4_IPv6[1] established between 2001:db8::1[2001:db8::1]...2001:db8::2[2001:db8::2]
Sep 4 16:23:54 ipsec charon: 08[IKE] CHILD_SA IPv4_IPv6{1} established with SPIs cddc56f1_i caa25e66_o and TS 192.168.0.0/24 === 192.168.1.0/24
Sep 4 16:23:54 ipsec charon: 12[IKE] IKE_SA IPv4_IPv6[1] established between 2001:db8::2[2001:db8::2]...2001:db8::1[2001:db8::1]
Sep 4 16:23:54 ipsec charon: 12[IKE] CHILD_SA IPv4_IPv6{1} established with SPIs caa25e66_i cddc56f1_o and TS 192.168.1.0/24 === 192.168.0.0/24
参考