IPSecの勉強メモ

## 概要
IPSecの規格について勉強したメモ。

## アーキテクチャ
IPSecは4つの技術から成り立つ。

|  技術  |  内容  |
| :--- | :--- |
|  セキュリテイプロトコル  | AH：認証、ESP：暗号化 |
|  鍵交換  | IKE   |
|  セキュリティアソシエーション  | セキュリテイプロトコルと鍵交換を管理  |
|  認証・暗号化アルゴリズム  | セキュリテイプロトコル、鍵交換で用いられるアルゴリズム  |

IPSecではAHまたはESPどちらかが使われる。 AHは認証による改ざん検知機能があり、ESPは暗号化が行われる（改ざん検知はオプション）
AHは暗号化通信が許可されていない国向けの規格であり通常ESPが使われる。

## IPSecの通信モード

|  通信モード  |  適用例  | 内容  |
| :--- | :--- | :--- |
|  トランスポートモード |IPsecが実装されたホスト間でのIPsec-VPN  |・パケットの元のIPヘッダは暗号化されない<br>・パケットの元のIPヘッダ情報でルーティングされる<br>・L4以上のパケットが暗号化される|
|  トンネルモード | IPsecが実装されたルータ間でのIPsec-VPN  |・パケットの元のIPヘッダは暗号化される<br>・元のパケットに新たなIPヘッダが付与される<br>・新たなIPヘッダにもとづいてルーティングされる|

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

![Untitled Diagram-Page-2.drawio-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/88527f8c-0cb6-babd-66ab-81bc8d79e381.png)



## セキュリティポリシー
セキュリティゲートウェイで受け取ったIPデータグラムをどう扱うかを記述したもの。

|  処理  |  内容  |
| :--- | :--- |
|  PROTECT  | IPsecによるセキュア化 |
|  BYPASS  | 通常の処理（セキュア化なし）   |
|  DISCARD  | 破棄  |




## セレクタ
セキュリティゲートウェイが受信したデータグラムを見てどのセキュリティポリシー処理を適用するかを判断する。

|  セレクタ  |  内容  |
| :--- | :--- |
| ローカルIPアドレス	| GWの内側IPアドレス(送信側なら送信元、受信側なら宛先)
| リモートIPアドレス	| GWの外側IPアドレス(送信側なら宛先、受信側なら送信元)
| ローカルポート番号	| GWの内側ポート番号
| リモートポート番号	| GWの外側ポート番号
| プロトコル	| IPヘッダの上位プロトコル番号
| IPv6モビリティヘッダ	| IPv6で次ヘッダがモビリティヘッダだった場合、そのタイプ(MHタイプ)
| ICMPタイプ/コード	| 上位プロトコルがICMPの場合、そのタイプとコード
| 名前	| 主にIKEで交換されるID

## SPD
セキュリティーポリシーデータベース。セキュリティポリシーを集めて登録したもの。

SPDには以下の３つとSPDキャッシュが存在する。

|  セレクタ  |  内容  |
| :--- | :--- |
|SPD-O | 送信(Outbound方向の通信)の際に使用するポリシー、各ポリシーにBYPASSまたはDISCARDの値を持つ
|SPD-I | 受信(Inbound方向の通信)の際に使用するポリシー、各ポリシーにBYPASSまたはDISCARDの値を持つ
|SPD-S | パケットのセキュア化に使用するポリシー、各ポリシーにPROTECTの値を持つ

トラフィックの方向とSPD,SADの関係を下図に示す。

![Untitled Diagram-10-ページ5.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/0640555e-efcf-adde-b0ff-24eda01adc51.png)


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

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

![Untitled Diagram-Page-3.drawio-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/af04a350-5faa-c772-18cc-00955ed36339.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/97fd4d83-46e1-9671-b9e3-d2589a1eca09.png)

## Linuxのstrongswanを用いた環境で確認
以下で作成した環境で、xfrmでSPDとSADおよびIKE SA, child SAを確認する。

https://qiita.com/spicecurry05/items/b32d5954377f818d17de

### SADの確認
ip xfrm stateで表示される内容がSADの内容である。
双方向で2つのSAができていることがわかる。

<pre>$ 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
</pre>

### SPDの確認
ip xfrm policyで表示される内容がSPDの内容である。
out, fwd, inの3つのポリシーができていることがわかる。

<pre>$ 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 
</pre>

### 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が出来ていることがわかる。

<pre>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
</pre>

またsyslogには以下出力されている。

<pre>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
</pre>

auth.logには以下ログが出ている。

<pre>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
</pre>

## 参考
http://www5e.biglobe.ne.jp/aji/3min/index.html

https://milestone-of-se.nesuke.com/category/nw-basic/ipsec/

https://gist.github.com/nojima/3a3d911d11194a540948d09826713731