SETKEY(8)

名称
setkey - 手動で IPsec の SA/SP データベースを操作する

書式
setkey [-v] -c setkey [-v] -f filename setkey [-aPlv] -D setkey [-Pv] -F setkey [-h] -x

解説
setkey ユーティリティは、 カーネル内のセキュリティアソシエーションデータベース (SAD) エントリと セキュリティポリシデータベース (SPD) エントリを、 追加・更新・内容列挙・削除します。

setkey ユーティリティは、一連の操作を標準入力から受け取るか ( -c 付で起動された場合) filename という名前のファイルから受け取ります ( -f filename 付で起動された場合)。

-D  SAD エントリをダンプします。 -P 付の場合、SPD エントリをダンプします。

-F  SAD エントリを捨てます。 -P 付の場合、SPD を捨てます。

-a  setkey は通常、死んだ SAD エントリを表示しません。 -a 付の場合、死んだ SAD エントリも表示します。 死んだ SAD エントリとは、期限切れではあるものの、 SPD エントリから参照されているためにシステム中に残っているものを指します。

-h  -x モードにおいて、16 進数ダンプを追加します。

-l  -D において、短い出力で無限ループします。

-v  冗長になります。 プログラムは、 PF_KEY ソケット上で交換したメッセージをダンプします。 これには他プロセスからカーネルに送られたメッセージを含みます。

-x  無限ループし、 PF_KEY ソケットへ送られる全メッセージをダンプします。 -xx は、各タイムスタンプのフォーマットをやめます。

  設定構文
-c もしくは -f がコマンドラインにあると、 setkey は次の設定構文を受け付けます。 ハッシュマーク ('#') で始まる行は コメント行として扱われます。

    add [-46n] src dst protocol spi [extensions] algorithm ...; 単一の SAD エントリを追加します。 add の失敗にはいくつか理由があり、 鍵の長さが指定したアルゴリズムに合致しない場合が含まれます。

    get [-46n] src dst protocol spi; 単一の SAD エントリを表示します。

    delete [-46n] src dst protocol spi; 単一の SAD エントリを削除します。

    deleteall [-46n] src dst protocol; 指定に適合するすべての SAD エントリを削除します。

    flush [protocol]; オプションに適合する全 SAD エントリをクリアします。 コマンドラインに -F を指定すると、同じ効果が得られます。

    dump [protocol]; オプションに適合する全 SAD エントリをダンプします。 コマンドラインに -D を指定すると、同じ効果が得られます。

    spdadd [-46n] src_range dst_range upperspec policy; 単一の SPD エントリを追加します。

    spddelete [-46n] src_range dst_range upperspec -P direction; 単一の SPD エントリを削除します。

    spdflush; 全 SPD エントリをクリアします。 コマンドラインに -FP を指定すると、同じ効果が得られます。

    spddump; 全 SPD エントリをダンプします。 コマンドラインに -DP を指定すると、同じ効果が得られます。

メタ引数は下記の通りです:

src
dst セキュアコミュニケーションの始点/終点を IPv4/v6 アドレスで指定します。 setkey は FQDN を数値アドレスに解決可能です。 FQDN が複数のアドレスに解決された場合、 setkey はすべての組み合わせを試みて、 複数の SAD/SPD エントリをカーネルにインストールします。 -4, -6, -n は、FQDN の解決を制限します。 -4 と -6 はそれぞれ、結果が IPv4/v6 アドレスのみになるよう制限します。 -n は FQDN の解決を防止し、アドレスが数値アドレスであることを要求します。

protocol
    protocol は次のいずれか 1 つです:
    esp rfc2406 を基にした暗号ペイロード
    esp-old
        rfc1827 を基にした暗号ペイロード
    ah  rfc2402 を基にした認証ヘッダ
    ah-old
        rfc1826 を基にした認証ヘッダ
    ipcomp
        IPComp

spi SAD および SPD 用の、セキュリティパラメータインデックス (SPI)。 10 進数または 16 進数 (0x 付) で指定する必要があります。 範囲 0 から 255 の SPI 値は、将来の使用のために IANA が予約しており、 使用できません。

extensions
    次に示す引数を受け付けます:
    -m mode
        使用するセキュリティプロトコルモードを指定します。 mode は次のいずれか 1 つです: transport, tunnel, any 。 デフォルト値は any です。
    -r size
        繰り返し攻撃を防ぐためのウィンドウサイズをバイト数で指定します。 size は 32 ビットワードの 10 進数で指定する必要があります。 size が 0 または指定されなかった場合、繰り返しのチェックは行われません。
    -u id
        SAD 中のポリシエントリの識別子を指定します。 policy を参照してください。
    -f pad_option
        ESP パディングの内容を指定します。 pad_option は次のいずれか 1 つです:
        zero-pad
            パディングはすべて 0。
        random-pad
            一連の乱数値を設定。
        seq-pad
            1 から開始して増加する一連の数を設定。
    -f nocyclic-seq
        周期的な順序番号を許可しません。
    -lh time
    -ls time
        SA のハード有効期間/ソフト有効期間を指定します。

algorithm
    -E ealgo key
        ESP 用に暗号化アルゴリズム ealgo を指定します。
        -E ealgo key -A aalgo key ESP 用に暗号化アルゴリズム ealgo とペイロード認証アルゴリズム aalgo を指定します。
    -A aalgo key
        AH 用に認証アルゴリズムを指定します。
    -C calgo [-R]
        IPComp 用に圧縮アルゴリズムを指定します。 -R が指定されると、 spi フィールド上の値が、 ワイヤ上にそのまま IPComp CPI フィールドとして使用されます。 -R が指定されないと、 カーネルはワイヤ上に良く知られた CPI を使用し、 spi フィールドはカーネル内部使用のためのインデックスとしてのみ使用されます。

    key は、ダブルクォートで括られた文字列か、 一続きの “0x” 付き 16 進数で指定する必要があります。

    ealgo, aalgo, calgo が取り得る値は別の節で規定します。

src_range
dst_range
    セキュアコミュニケーションの選択であり、 IPv4/v6 アドレスまたは IPv4/v6 アドレス範囲で指定します。 TCP/UDP ポート指定を付加することも可能です。 次の形式を受け付けます:

        address
        address/prefixlen
        address[port]
        address/prefixlen[port]

    prefixlen と port は 10 進数で指定する必要があります。 port の周りの角括弧は、実際に必要です。 マニュアルページのメタ文字ではありません。 FQDN の解決に関しては、 src と dst に対して適用されるルールがここでも適用されます。

upperspec
    使用する上位層プロトコル。 upperspec として、 /etc/protocols 中の 1 語を使用可能です。 または、 icmp6, ip4, any を指定可能です。 any は “任意のプロトコル” を意味します。 また、プロトコル番号を使用可能です。 上位層が ICMPv6 の場合、ICMPv6 用のタイプやコードを指定可能です。 仕様は icmp6 の後に置きます。 タイプは、単一のコンマで区切ります。 コードは常に指定することが必要です。 0 が指定された場合、カーネルはこれをワイルドカードとして扱います。 カーネルはワイルドカードと ICMPv6 タイプ 0 とを区別できないことに 注意してください。 例えば下記は、 入力の近隣要請に対して IPsec が不要というポリシを意味します。
        spdadd ::/0 ::/0 icmp6 135,0 -P in none;

    注: upperspec は、現時点では転送に対して機能しません。 転送ノードにおいて、追加の再構成 (現時点では未実装) が必要となるからです。 /etc/protocols には多数のプロトコルが登録されていますが、 TCP, UDP, ICMP 以外は IPSec と共に使用するには不適切かもしれません。 そのようなプロトコルの使用には、注意してください。

policy
    policy は次の 3 種類の形式のうちいずれか 1 つです:

-P direction discard
-P direction none
-P direction ipsec
    protocol/mode/src-dst/level [...]

    ポリシの方向を direction で指定する必要があります。 out または in が使用されます。 discard は、インデックスに適合するパケットが捨てられることを意味します。 none は、パケットに対して IPsec 操作が実施されないことを意味します。 ipsec は、パケットに対して IPsec 操作が実施されることを意味します。 protocol/mode/src-dst/level の部分は、パケット処理方法のルールを指定します。 ah, esp, ipcomp のいずれかを、 protocol として設定します。 mode は transport または tunnel のいずれかです。 mode が tunnel の場合、 SA の末端アドレスを、 src および dst で、両アドレス間に ‘-’ を付けて指定する必要があります。 これは、使用する SA を指定するために用いられます。 mode が transport の場合、 src と dst は両方省略可能です。 level は次のいずれかです: default, use, require, unique 。 すべてのレベルにおいて SA が利用可能でない場合、 SA 取得要求をカーネルは鍵交換デーモンに送ります。 default は、カーネルがパケットを処理するとき、 指定したプロトコルについて、 システム全体のデフォルトを問い合わせることを意味します。 これは例えば sysctl 変数 esp_trans_deflev を指します。 use は、カーネルが SA を使用可能であれば使用し、 使用不能の場合には通常操作を続けることを意味します。 require は、ポリシに適合するパケットをカーネルが送る時には いつも SA が必要であることを意味します。 unique は require と同じです。 更に、ポリシが一意な外向き SA に結合することを許します。 ポリシレベルには unique を指定するだけで良く、 racoon(8) がそのポリシのために SA を設定してくれます。 そのポリシ用に手動キー入力で SA を設定する場合、 unique の後にコロン ‘’: で区切った後に 10 進数でポリシ識別子を指定可能であり、次のようにします: unique:number 。 これでこのポリシが SA に結合されます。 number は 1 から 32767 の範囲にあることが必要です。 これは、手動 SA 設定の extensions -u に対応します。 SA バンドルを使用したい場合、複数のルールを定義可能です。 例えば、IP ヘッダ、AH ヘッダ、ESP ヘッダ、上位層プロトコルヘッダと続く場合、 ルールは次のようになります:
        esp/transport//require ah/transport//require;
    ルールの順序は非常に重要です。

    “discard” と “none” は ipsec_set_policy(3) に記述されている構文には存在しないことに注意してください。 両者の構文にはちょっとした違いがあります。 詳細は ipsec_set_policy(3) を参照してください。

アルゴリズム
次の一覧は、サポートされているアルゴリズムを示しています。 protocol と algorithm は、ほぼ直交しています。 次に示すのは、 protocol パラメータの -A aalgo で aalgo として使用可能な認証アルゴリズムの一覧です:

    アルゴリズム	鍵長 (ビット)	コメント
    hmac-md5	128		ah: rfc2403
    		128		ah-old: rfc2085
    hmac-sha1	160		ah: rfc2404
    		160		ah-old: 128bit ICV (文書無し)
    keyed-md5	128		ah: 96bit ICV (文書無し)
    		128		ah-old: rfc1828
    keyed-sha1	160		ah: 96bit ICV (文書無し)
    		160		ah-old: 128bit ICV (文書無し)
    null		0 〜 2048	デバッグ用
    hmac-sha2-256	256		ah: 96bit ICV
    				(draft-ietf-ipsec-ciph-sha-256-00)
    hmac-sha2-384	384		ah: 96bit ICV (文書無し)
    		384		ah-old: 128bit ICV (文書無し)
    hmac-sha2-512	512		ah: 96bit ICV (文書無し)
    		512		ah-old: 128bit ICV (文書無し)
    hmac-ripemd160	160		ah: 96bit ICV (RFC2857)
    				ah-old: 128bit ICV (文書無し)
    aes-xcbc-mac	128		ah: 96bit ICV (RFC3566)
    		128		ah-old: 128bit ICV (文書無し)

次に示すのは、 protocol パラメータの -E ealgo で ealgo として使用可能な暗号化アルゴリズムの一覧です:

    アルゴリズム	鍵長 (ビット)	コメント
    des-cbc		64		esp-old: rfc1829, esp: rfc2405
    3des-cbc	192		rfc2451
    null		0 〜 2048	rfc2410
    blowfish-cbc	40 〜 448	rfc2451
    cast128-cbc	40 〜 128	rfc2451
    des-deriv	64		ipsec-ciph-des-derived-01
    3des-deriv	192		文書無し
    rijndael-cbc	128/192/256	rfc3602
    aes-ctr		160/224/288	draft-ietf-ipsec-ciph-aes-ctr-03

aes-ctr 鍵の最初の 128 ビットは AES 鍵として使用され、 残りの 32 ビットは nonce として使用されることに注意してください。

次に示すのは、 protocol パラメータの -C calgo で calgo として使用可能な圧縮アルゴリズムの一覧です:

    アルゴリズム	コメント
    deflate		rfc2394

戻り値
本コマンドは成功時に 0 を、エラー時に 0 以外を返します。

使用例

    add 3ffe:501:4819::1 3ffe:501:481d::1 esp 123457
    	-E des-cbc 0x3ffe05014819ffff ;
    add -6 myhost.example.com yourhost.example.com ah 123456
    	-A hmac-sha1 "AH SA configuration!" ;
    add 10.0.11.41 10.0.11.33 esp 0x10001
    	-E des-cbc 0x3ffe05014819ffff
    	-A hmac-md5 "authentication!!" ;
    get 3ffe:501:4819::1 3ffe:501:481d::1 ah 123456 ;
    flush ;
    dump esp ;
    spdadd 10.0.11.41/32[21] 10.0.11.33/32[any] any
    	-P out ipsec esp/tunnel/192.168.0.1-192.168.1.2/require ;

関連項目
ipsec_set_policy(3), racoon(8), sysctl(8) Changed manual key configuration for IPsec, http://www.kame.net/newsletter/19991007/, October 1999.

歴史
setkey ユーティリティは WIDE Hydrangea IPv6 プロトコルスタックキットで はじめて登場しました。 本コマンドは 1998 年 6 月に、完全に再デザインされました。

バグ
setkey は、構文エラーをよりよく報告し、扱えるべきです。

IPsec ゲートウェイ設定では、 TCP/UDP ポート番号付きの src_range と dst_range は動作しません。 これは、ゲートウェイがパケットを再組み立てしないからです (上位層ヘッダの検査はできません)。