2
2

More than 1 year has passed since last update.

IPSecの勉強メモ

Posted at

概要

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ヘッダにもとづいてルーティングされる

トンネルモードでセキュア化を行うルータをセキュリティゲートウェイという。

Untitled Diagram-Page-2.drawio-2.png

セキュリティポリシー

セキュリティゲートウェイで受け取った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の関係を下図に示す。

Untitled Diagram-10-ページ5.drawio.png

SAD

SA用のパラメータのセットの集合体をSADと呼ぶ。具体的にはSAのセキュア化のためのパラメータ群であり鍵とかアルゴリズムとかIV等である。

SA

SAとは、セキュリティポリシーによるアクセス制御とセキュリティパラメータを使った、
送信側と受信側の合意(=パラメータの一致)によるセキュアな仮想通信路。
片方向であり、行きと帰りで別々に作成される。

Untitled Diagram-Page-3.drawio-2.png

SPDでパケットの処理(BYPASS、DISCARD、PROTECT)が決まる。PROTECTの場合にSAを構築する。その際SADを検索しパラメータを取得する。

SPD, セレクタ、SADの関係

LANから受信したパケットについて該当するとセレクタをSPDを検索しIPSec通信対象か判定する。IPSec通信対象の場合、SADを検索し、SAを特定する。該当するSAのパラメタを元にパケットを暗号化して送出する。

受信装置では、SADをパケットの一致するSAを特定し、パケットがポリシーに一致するかをチェックし、復号する。

Untitled Diagram-10-ページ4.drawio.png

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

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2