IPSec(セキュアなIP通信)を理解する

## IPSec概要 セキュアな通信とは何か

(参考) http://www5e.biglobe.ne.jp/aji/3min/ex/sup21.html

・歴史上のある時期よりIPネットワークのセキュア化が必要だと論じられるようになる
・ネットワークのセキュア化とは**「盗聴・改ざん・なりすまし・否認」**の脅威を防ぐこと
・そのための対策には**「暗号化」「署名」「認証」**
・公開鍵暗号化による暗号・署名を正しく使うための電証明書とCAによる信頼システムとして**PKI**という仕組みが作られた。
・しかしPKIには弱点があり、システム基盤が必要で、さらにアプリケーションやプロトコルに組み込む必要があり*単独で動作が完結しない*。
・これに対しIPSecは**上位プロトコルに対し透過的**であり、上位プロトコルを変更せずとも単独で動作させることができる。
・例えばTLSはHTTPに対し上位プロトコルHTTPSをユーザが明示的に選択している。IPSecはHTTPならHTTPのままセキュア化できる。
・IPSecが行うのは3つ。**1.暗号化 2.認証 3.アクセス制御**。
・IPSecにおける認証とは"ユーザが正当か"を証明する**ユーザ認証**、"メッセージが改ざんなどされず正当であるか"を証明する**メッセージ認証**、の2つ。
・IPSecとはアーキテクチャでありプロトコルではない。つまりいくつかの技術の組み合わせによりIPをセキュア化するための方法論。
・IPSecは4つの技術からなる。**AH(Authentication Header),ESP(Encapsulating Security Payload),IKE(Internet Key Exchange)**の3つのプロトコル、およびそれを管理する**SA(Security Association)**
・SAはセキュアな通信を保証するためのホスト間の合意を確立する。SAにより合意が確立されたコネクションの中でAH,ESP,IKEによる暗号化と認証が行われセキュアな通信が可能になる。
・AHは主に**改ざん防止**、ESPは主に**暗号化**を受け持つ。
・IPSecには主にホスト間で通信するための**トランスポートモード**と主にルータなどセキュリティゲートウェイ間で使用される**トンネルモード**の2種類のモードがある。
・トランスポートモードではホストAからホストBに送信されるIPパケットについて、AH/ESPヘッダをIPヘッダの後ろに挿入、セキュア化して送信する。**ペイロードのみセキュア化**(認証と暗号化)が行われ、IPヘッダはセキュア化されない。
・トンネルモードではホストAからホストBに送信されるIPパケットについて、**セキュリティゲートウェイ**がAH/ESPヘッダとIPヘッダを付加、受信側のセキュリティゲートウェイが付加されたIPヘッダを外しセキュア化を解除する。**ペイロードとIPヘッダのIPパケット全体**をセキュア化する。
・**セキュリティゲートウェイ**とはIPSec機能を搭載したルータなどの中継機のこと。
・VPNでは主にトンネルモードが使われる。

## もう少し深く - IPSecのSA(Security Association:セキュリティ合意)の仕組み

(参考) http://www5e.biglobe.ne.jp/aji/3min/ex/sup22.html

・IPSecにおけるセキュリティ上のホスト間の合意のことを**SA(Security Association)**という。
・まずIPSecの前にセキュリティポリシーで**PROTECT(IPSecによるセキュア化)**, **BYPASS(そのまま通す)**, **DISCARD(破棄)**
の３つのアクションを決める。
・どのアクションを取るかは**セレクタ**によって決まる。つまりセレクタが同じ通信ではアクションも同じ。
・セレクタとなる情報は**ローカルIP、リモートIP、ポート**等。つまり通信相手を識別する情報。同じ通信相手には同じアクションをとる。
・ローカル、リモートはそのホストから見てセキュリティゲートウェイの外側か内側かで決まる。
・この通信相手とアクションの組み合わせを記録するのが**SPD(Security Policy Database)**。
・SPDには**SPD-I(Inbound)**, **SPD-O(Outbound)**, **SPD-S(Secure)**の３種類がある。
・SPDには**ローカルIP,リモートIP,プロトコル,その他,アクション**の情報が含まれる。
・SPD-Sの場合、アクション(PROTECT)情報に加え、IPSecで使用する設定(**ESPトランスポートモード、ESP暗号化方式、ESP認証方式**)が含まれる。


(備考) SPDは上から検索される。
例えば下記のような場合、192.168.0.1がローカル、10.1.1.5がリモートの通信なら1,2行目のどちらも一致するが最初の1行目が適用される。

```
  1. 192.168.0.0/24	10.1.1.5/32	ANY	ANY	BYPASS
  2. 192.168.0.0/24	10.1.1.0/24	ANY	ANY	DISCARD
```

・PROTECTの場合のパラメータは下記の通り。


    Security Parameter Index（SPI)
    シーケンス番号カウンタ、オーバフローフラグ
    リプレイ防御ウィンドウ
    ESP暗号化アルゴリズム・共通鍵・IV
    AH/ESP認証アルゴリズム・鍵
    SA有効期間
    IPsecモード（トランスポート/トンネル）
    ステートフルフラグメントチェックフラグ・バイパスDFビット・Path MTU
    DSCP、バイパスDSCP
    トンネルモード始点アドレス、終点アドレス


これがIPSecのために必要なパラメータ。ホスト間で一致するように設定されてはじめて通信できる。
・これらの情報をまとめて記録したのが**SAD(Security Association Database)**
・PROTECTの際、SADの中から必要なパラメータを取得する。
・この時SADにも**ローカルIP,リモートIPからなるセレクタ**がある。
・SADのセレクタとの参照の仕方には2種類ある。これを決めるのがSPDにある**PFP**というパラメータ。
・PFPがオフならSPDのセレクタを使いSADを参照する。オンならパケットに含まれる送信元,送信先IPを使いSADを参照する。

ここまでが送信側のセキュアパラメータ決定について。
受信側はどのように同じパラメータを入手するか。
・ここでセキュアパラメータ設定には**静的**と**動的**の二種類ある。
・**静的な設定**では双方のホストゲートウェイに同じパラメータを手動で設定しておく。
・**動的な設定**ではSAの確立の前に**IKE(Internet Key Exchange)**または受信側のSADを見てパラメータを決定する。

受信側がSADを参照する手順は

  1. 送信側でSPDよりPROTECTと決定されSADを検索する。
  2. SADにSPI(Security Parameter Index)がある。パケットをAH(Authentication Header)/ESP(Encapsulated Security Payload)でセキュア化し、その際AH/ESPヘッダにSPIを格納し転送。
  3. 受信側はAH/ESPヘッダのSPI値を使いSADを検索。パラメータを取得しセキュア化を解除する。
  4. セキュア化を解除したら正常に解除されているか、パケット内のセレクタとSADエントリのセレクタを照合し確認する。


## SAパラメータとHMAC

(参考) http://www5e.biglobe.ne.jp/aji/3min/ex/sup23.html

SAパラメータ

    Security Parameter Index（SPI)
    シーケンス番号カウンタ、オーバフローフラグ
    リプレイ防御ウィンドウ
    ESP暗号化アルゴリズム・共通鍵・IV
    AH/ESP認証アルゴリズム・鍵
    SA有効期間
    IPsecモード（トランスポート/トンネル）
    ステートフルフラグメントチェックフラグ・バイパスDFビット・Path MTU
    DSCP、バイパスDSCP
    トンネルモード始点アドレス、終点アドレス

・**シーケンス番号**はパケットに振られる番号で、これが重複した場合**リプレイアタック**(暗号化されたままのデータを傍受してそのまま送信し通過させる攻撃)とみなし排除する。
・**リプレイ防御ウインドウ**はさらに通過させるシーケンス番号に範囲を設定し、窓から外れた古い不自然なパケットをたとえ未着番号でも排除する。ウインドウサイズは最低でも32,64が推奨。
・シーケンス番号カウンタがオーバーフローしゼロになる際にはSAを初期化してパラメータを変更し盗聴したパケットのパラメータで通過できないようにする。
・しかしIKEを使わない*手動パラメータ設定の場合、パラメータを動的に決められず同じパラメータしか使用できないのでリプレイ防御機能は使用できない*。
・**オーバーフローフラグ**はこのためのフラグ、TRUEのときオーバーフロー時にはSAを再構築する。FALSEならカウンタをゼロにするだけでSAを再構築しない。
・ESPでメッセージ認証なしの場合、パケットを改ざんできてしまいシーケンス番号を操作したパケットを送信し、正常なシーケンス番号のパケットが弾かれる攻撃ができてしまうのでリプレイ防御が使用できない。
・SAでパケットにAH/ESPヘッダ,IPヘッダを追加する際に経路の**MTU(Maximum Transmission Unit)**サイズを超えることがある。そのためMTUに収まるようIPパケットを分割する。これを**フラグメント化**という。
・フラグメント化にあたりセキュリティゲートウェイは経路のMTUサイズを記憶する。これが**Path MTU**パラメータ。
・MTUを調べるための方法はいくつかある。例えばPing(正確にはICMPエコーをDFビットTRUEにして送ること)でパケットサイズを様々に変えてどのサイズなら受信されるか調べる**MTU探索**のような方法がある。
・送信側がフラグメント化するタイミングはSAD検索によりパラメータを取得しパケットをセキュア化した後。受信側がデフラグメントするタイミングはセキュア化を解除する前。
・すでにフラグメント化されたパケットをSAでフラグメント化することは、トランスポートモードではできず、トンネルモードならできる。理由は省略。
・フラグメント化されているパケットは同じSAを使用するか否かを決めるのが**ステートフルフラグメントチェックフラグ**
・**バイパスDFビット**はDFビットの値を元のIPヘッダからそのまま使うか、**DSCP**は新しいIPヘッダで使用するDFビットを設定、**バイパスDSCP**はDSCP値を元のIPヘッダからそのまま使うか。詳細は省略
・最後に暗号化アルゴリズムと共通鍵を決めておくためのパラメータ。改ざん検出コードとしてハッシュ関数を使った**HMAC(鍵付きメッセージ認証コード)**を付与する。このHMACのための認証アルゴリズムと鍵。


## IKEv2

(参考) http://www5e.biglobe.ne.jp/aji/3min/ex/sup24.html

・前述の通り、動的にSAを構築しリプレイ防御を有効にするためにIKE(Internet Key Exchange)を行う。
・IKEv1とIKEv2には互換性がなく、IKEv2が主流。
・SAのはじめにIPパケットのセレクタでSPDキャッシュを検索する。このときセキュリティポリシーが未使用の場合、SPDキャッシュには該当するセキュリティポリシーはない。SPD-SにポリシーがありSADにないならそのパケット送信を中断しIKEによるSA構築を開始。
・IKEは正しい相手とパラメータ合意を行うための**「相手認証」**とIPSecのSAのパラメータを合意管理する**「SAの交渉と管理「**からなる。
・IKEは**500/udpポート**を利用して3つの交換を行う。**1 IKEのためのパラメータ 2 相手認証 3 IPSecのためのパラメータ交換**
・このためにIKE用のためのセキュアなSAを構築する。

IKEの交換4つ

    IKE_SA_INIT … IKEのSAを構築するためのパラメータの交換
    IKE_AUTH … 相手認証を行うための交換
    CREATE_CHILD_SA … IPsecのSAを構築するためのパラメータの交換
    (INFORMATIONAL … エラーや情報、SAの削除のための交換)


・詳細は省略