読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

IPsec

ネットワーク層で暗号化を実現するプロトコルIPv6では実装必須。IETFが策定。

  • ○それより上のすべてを透過的にセキュアにできる。
  • ×専用ソフトのインストールなどが必要で、クライアント/サーバー間通信で使うのは面倒。拠点間接続向き。

機能は次の通り。

  • データ暗号化
  • メッセージ認証
  • 安全な鍵交換
  • クライアント/サーバー認証 (ただし機器のレベルでのみ。ユーザー認証といったたぐいではない。)

動作モード

トンネルモードとトランスポートモードがある。

  • トンネルモード
    • 元のパケット全体を暗号化したモノに、新たなIPヘッダを付けて転送する。
    • VPN装置を介すような場合向け。
  • トランスポートモード
    • 元パケットのIPヘッダはそのままに、データ部分だけ暗号化し転送する。
    • VPN装置を介さないEndToEndでのIPSec通信向け。

プロトコル

次の3つのプロトコルが中核をなす。

IKE(Internet Key Exchange)
安全な鍵交換プロトコル
ESP(Encapsulating Security Payload)
暗号化とメッセージ認証を実現
AH(Authentication Header)
メッセージ認証のみ(暗号化が使えない国向け)
IKE
  • IKEの通信で使う鍵交換
  • IPSecで使う鍵交換

の2層で鍵交換を行う。手順は次の通り。

  1. IKEの通信で使う鍵交換。
    • UDP/500を使う。開けておく必要有り。
    • 1-1.暗号化アルゴリズムネゴシエーション
    • 1-2.Diffie-Hellman鍵交換方式による共通鍵の生成。
      • 秘密鍵そのものではなく、乱数と秘密鍵から生成した公開情報を送受信。
      • 通信内容を第三者に盗聴されても、直ちに秘密鍵を知られることはなく、安全に鍵情報を交換することができる。
      • ただし、Man-in-the-middle 攻撃には弱いらしい。
      • 1-2-1.両者が秘密鍵を生成
      • 1-2-2.秘密鍵より一定の関数で生成した公開情報を送付。
      • 1-2-3.送付された関数を一定の関数で演算→両者で同じ値となる。これを暗号用の共通鍵として用いる。
  2. IPSecで使う鍵交換
    • 1で生成した共通鍵で暗号化通信。暗号化アルゴリズムの決定、暗号鍵の交換などIPSecによる通信に必要な各種情報がやり取りされる。(「SA(Security Association)」のネゴシエーション)
ESP

暗号化とメッセージ認証機能を提供するプロトコル。パケットを以下の通り変換してやりとりする。

MAC(Message Authentication Code)
メッセージ認証で使う認証情報
シーケンス番号
パケットのシーケンス番号。リプレイアタックの防止に使う。
暗号化されたデータ
その名の通り。トンネルモードではIPヘッダも含むが、トランスポートモードではTCPヘッダから先のみ。MACでの非改ざんサポートが可能な範囲もこの部分である。(暗号化のサポート範囲もおなじ。)
SPI(Security Pointer Index)
合意されたSAを示すID
新IPヘッダ (トンネルモードの場合)
パケットに追加される
IPヘッダ (トランスポートモードの場合)
パケットに追加される
AH

メッセージ認証機能を提供するプロトコル。暗号化機能は持たない。メッセージ認証の範囲がESPと異なり、AHではAH自体を含むパケットすべてが認証対象。(ESPのトランスポートモードではIPヘッダは認証範囲に含まれない)

弱点と対策

NAT/NAPT

ESPでは、NATはいけるがNAPTは無理(ポートがTCP/UDPヘッダで認証対象であるため。)。AHはどちらも無理。

  NAT NAPT
ESP トンネル ×
ESP トランスポート ×
AH トンネル × ×
AH トランスポート × ×

IPsecパケットをさらにUDPでトンネルして送付すると解決。(NAT トラバーサル)

動的なIPが割り振られる機器の認証

IPアドレスでの認証が一般的であるため、動的にIPアドレスが割り当てられる機器の認証には注意が必要。Pre Shared Key とかを使って認証する手がある。

参考: