EN JA
IPSEC(4)
IPSEC(4) FreeBSD Kernel Interfaces Manual IPSEC(4)

名称

ipsecIP セキュリティプロトコル

書式

options IPSEC
device crypto


#include < sys/types.h>
#include < netinet/in.h>
#include < netipsec/ipsec.h>
#include < netipsec/ipsec6.h>

解説

ipsec は、ネットワークスタックのインターネットプロトコルレイヤ (層) 中に実装されたセキュリティプロトコルです。 ipsec は IPv4 と IPv6 ( inet(4)inet6(4)) の両方のために定義されます。 ipsec は、IP データグラムのためのセキュリティサービスを提供する、1 組のプロトコル、(カプセル化されたセキュリティペイロードのための) ESP, (認証ヘッダのための) AH と (IP ペイロード圧縮プロトコルのための) IPComp です。 AH は、一方向ハッシュ関数を使用して計算された暗号のチェックサムをアタッチすることによって IP パケットの整合性を認証して、保証します。さらに、ESP は、ペイロード (訳注: ヘッダ部を除いたデータの本体) も暗号化することによって、IP パケットのペイロードを権限のない人々が、読み込めないようにします。 IPComp は、IP ペイロードを圧縮することによって、通信の性能を増強しようとします、その結果、送信するデータの量を減少させます。これは、十分なコンピューティングパワーが必要ですが、遅いリンクのノードを手助けします。 ipsec は、2 つのモードの 1 つで動作します: 転送モードまたはトンネルモードです。転送モードは、エンドノード間のピアツーピア通信を保護するために使用されます。トンネルモードは、オーバ IP パケット内の IP パケットをカプセル化して、 VPN 終点のようなセキュリティゲートウェイのために設計されています。

システム設定は、 crypto(4) サブシステムを必要とします。

外向きの暗号化の前と内向きの非カプセル化の後でパケットフィルタリングを実行するために、仮想の enc(4) インタフェースにパケットを渡すことができます。

ファイアウォールがある ipsec トンネルの内側のパケットで適切にフィルタするためには、利用者は、次の sysctl の値を変更することができます。

名前 デフォルト 有効
net.inet.ipsec.filtertunnel 0 1
net.inet6.ipsec6.filtertunnel 0 1

カーネルインタフェース

ipsec は、オペレーティングシステムのカーネルに存在する、キー管理とポリシエンジンによって制御されます。キー管理は、セキュリティアソシエーションがある結合キーのプロセスです、また、SA として、知られています。ポリシ管理は、新しいセキュリティアソシエーションが作成されるか、破壊されるとき、決定します。

キー管理エンジンは、 PF_KEY ソケットを使用することによってユーザランドからアクセスすることができます。 PF_KEY ソケット API は RFC2367 で定義されています。

ポリシエンジンは PF_KEY API、 setsockopt(2) 操作、および sysctl(3) インタフェースの拡張機能によって制御されます。カーネルは、 PF_KEY インタフェースの拡張版を実装して、プログラマがパケットごとのフィルタと同様の IPsec ポリシを定義できるようにします。 setsockopt(2) インタフェースはソケットごとの振る舞いを定義するのに使用され、 sysctl(3) インタフェースはホスト全体のデフォルトの振る舞いを定義するために使用されます。

カーネルコードは、IKE (インターネットキー交換 (Internet Key Exchange)) のような動的暗号キー交換プロトコルを実装しません。キー交換プロトコルは、カーネルで必要であり、 API を呼び出すデーモンプロセスのように実装されるべきであるものを超えてます。

ポリシ管理

setsockopt(2) システムコールを使用してソケット毎のポリシを設定することによって、または、利用者がパケットフィルタリング規則と同様の規則を使用してパケットに対して IPsec ポリシを定義することができる、 setkey(8) を通して PF_KEY インタフェースを使用してカーネルレベルのパケットのフィルタベースのポリシを設定することによる、2 つの方法の 1 つで IPsec ポリシを管理することができます。それを使用する方法については setkey(8) を参照してください。

setkey(8) コマンドを使用してポリシを設定するとき、“ default”オプションは、パケットを処理するために、以下で説明されるような、デフォルトポリシを使用するようにシステムに指示します。次の sysctl 変数はシステムの IPsec の振る舞いを設定するために利用可能です。変数は 2 つの値の 1 つを持つことができます。 1 は、セキュリティアソシエーションがあるなら、それを使用することを意味する、“ 使用”を意味しますが、なければ、パケットは IPsec によって処理されません。値 2 は、セキュリティアソシエーションは、移動し、落されないパケットのために存在しなければならないことを要求する、“ 要求”と同義です。これらの用語は ipsec_set_policy(8) で定義されています。

名前 タイプ 変更可能性
net.inet.ipsec.esp_trans_deflev 整数 yes
net.inet.ipsec.esp_net_deflev 整数 yes
net.inet.ipsec.ah_trans_deflev 整数 yes
net.inet.ipsec.ah_net_deflev 整数 yes
net.inet6.ipsec6.esp_trans_deflev 整数 yes
net.inet6.ipsec6.esp_net_deflev 整数 yes
net.inet6.ipsec6.ah_trans_deflev 整数 yes
net.inet6.ipsec6.ah_net_deflev 整数 yes

カーネルが一致 (matching)、システム全体(system wide)、ポリシ (policy) を見つけられなければ、デフォルト値が適用されます。システム全体のデフォルトポリシは、次の sysctl(8) 変数によって指定されます。 0 は“ 廃棄”を意味し、そしてそれは、カーネルにパケットを落すように頼みます。 1 は“ 何もない”を意味します。

名前 タイプ 変更可能性
net.inet.ipsec.def_policy 整数 yes
net.inet6.ipsec6.def_policy 整数 yes

その他の sysctl 変数

ipsec プロトコルが使用するために設定されるとき、すべてのプロトコルは、システムに含まれています。プロトコルを選択的に有効にする/無効にするためには、 sysctl(8) を使用します。
名前 デフォルト
net.inet.esp.esp_enable オン
net.inet.ah.ah_enable オン
net.inet.ipcomp.ipcomp_enable オン

さらに、次の変数は、カーネルの IPsec の振る舞いを微調整するために sysctl(8) を通してアクセス可能です:

名前 タイプ 変更可能性
net.inet.ipsec.ah_cleartos 整数 yes
net.inet.ipsec.ah_offsetmask 整数 yes
net.inet.ipsec.dfbit 整数 yes
net.inet.ipsec.ecn 整数 yes
net.inet.ipsec.debug 整数 yes
net.inet6.ipsec6.ecn 整数 yes
net.inet6.ipsec6.debug 整数 yes

変数は次のように解釈されます:

ipsec.ah_cleartos
0 以外に設定されるなら、カーネルは AH 認証データ計算の間に、IPv4 ヘッダの type-of-service フィールドをクリアします。この変数は、 RFC1826 AH を実装するデバイスで相互運用するために現在のシステムを取得するために使用されます。それは RFC2402 適合のために (type-of-service フィールドをクリアする) 0 以外に設定されるべきです。
ipsec.ah_offsetmask
AH 認証データ計算の間に、カーネルはこの変数で論理 AND を計算した後に、 IPv4 ヘッダで 16 ビットのフラグメントオフセットフィールド (フラグビットを含んで) を含みます。この変数は、RFC1826 AH を実装するデバイスで相互運用するために使用されます。それは RFC2402 適合のために (計算の間にフラグメントオフセットフィールドをクリアする) 0 に設定されるべきです。
ipsec.dfbit
この変数は IPv4 IPsec トンネルカプセル化でカーネルの振る舞いを設定します。 0 に設定されるなら、外側の DF ヘッダ上の DF ビットはクリアされ、さらに 1 は外側の DF ビットが内側の DF ビットと関係なく設定されることを意味し、 2 は DF ビットが内側のヘッダから外側のヘッダまでコピーされることを示します。変数は RFC2401 章 6.1 に適合するために供給されています。
ipsec.ecn
0 以外に設定されるなら、IPv4 IPsec トンネルカプセル化/非カプセル化の振る舞いは draft-ietf-ipsec-ecn-02.txt で文書化されるように、 ECN (明白な混雑通知 (explicit congestion notification)) に友好的です。(訳注: 意味不明) gif(4) では振る舞いに関してさらに説明しています。
ipsec.debug
0 以外に設定されるなら、デバッグメッセージは syslog(3) を通して生成されます。

net.inet6.ipsec6 ツリー下の変数は、上で説明されたものと同様の意味があります。

プロトコル

ipsec プロトコルは、 inet(4)inet6(4) プロトコルへのプラグインのように動作し、そのために、それらの IP-レイヤ (層) プロトコルで定義されたプロトコルの大部分をサポートします。 ipsec が、IP ペイロードを調べることから icmp(4) または icmp6(4) ルーチンを防ぐことができるので、 icmp(4)icmp6(4) プロトコルは ipsec と異なって振る舞うかもしれません。

関連項目

ioctl(2), socket(2), ipsec_set_policy(3), crypto(4), enc(4), icmp6(4), intro(4), ip6(4), setkey(8), sysctl(8) S. Kent and R. Atkinson, IP Authentication Header, RFC 2404. S. Kent and R. Atkinson, IP Encapsulating Security Payload (ESP), RFC 2406.

規格

Daniel L. McDonald, Craig Metz, and Bao G. Phan, PF_KEY Key Management API, Version 2, RFC, 2367.

D. L. McDonald, A Simple IP Security API Extension to BSD Sockets, インターネットドラフト, draft-mcdonald-simple-ipsec-api-03.txt, 作業中の資料.

歴史

オリジナルの ipsec 実装は、WIDE/KAME IPv6/IPsec スタックで登場しました。

FreeBSD 5.0 に関しては、fast_ipsec と呼ばれる完全に固定された IPsec 実装が導入されした。そのプロトコルは、 IPsec プロトコルの OpenBSD 実装を大幅に引用しました。ポリシ管理コードは、それらの IPsec プロトコルにある KAME 実装に由来しています。 fast_ipsec 実装は、 ip6(4) サポートが不足していますが、 crypto(4) サブシステムを利用していました。

FreeBSD 7.0 に関して、 ip6(4) サポートは fast_ipsec に追加されました。この後、古い KAME IPsec 実装は、落され、現在、fast_ipsec が FreeBSD での唯一の ipsec 実装であることになりました。

バグ

ポリシエンジン API のための単一の標準はないので、ここで説明されたポリシエンジン API はまさしくこの実装のためです。

利用者が予想するように、AH とトンネルモードのカプセル化は働かないかもしれません。利用者が AH トンネルで着信“require”ポリシか AH で任意の IPsec カプセル化ポリシ (“ esp/tunnel/A-B/use ah/transport/A-B/require”のような) を設定するなら、トンネル化されたパケットは拒絶されます。ポリシチェックは、受信での内側のパケットで強制されるので、 AH はカプセル化された (外側の) パケットを認証し、カプセル化された (内側の) パケットは認証しません (したがって、受信カーネルのために、信頼性のサインはありません)。我々がすべてのパケットの非カプセル化のヒストリを維持するためにポリシエンジンを改造するとき、問題は解決されるでしょう。

セキュリティアソシエーションかポリシの大きなデータベースがカーネルに存在するとき、 PF_KEY ソケットでの SADB_DUMPSADB_SPDDUMP 操作は、スペースの不足のために失敗するかもしれません。ソケットバッファサイズを増強すると、この問題を軽減するかもしれません。

IPcomp プロトコルは、 zlib(3) の問題によって、時折エラーとなるかもしれません。

この文書は、より多くのレビューを必要とします。

November 29, 2009 FreeBSD