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(破棄)
の3つのアクションを決める。
・どのアクションを取るかはセレクタによって決まる。つまりセレクタが同じ通信ではアクションも同じ。
・セレクタとなる情報はローカルIP、リモートIP、ポート等。つまり通信相手を識別する情報。同じ通信相手には同じアクションをとる。
・ローカル、リモートはそのホストから見てセキュリティゲートウェイの外側か内側かで決まる。
・この通信相手とアクションの組み合わせを記録するのがSPD(Security Policy Database)
・SPDにはSPD-I(Inbound), SPD-O(Outbound), SPD-S(Secure)の3種類がある。
・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の削除のための交換)

・詳細は省略