Linux以外のIPSecスタックとの相互接続[前編]
LinuxでIPSecを使おう

LinuxでIPSecが使えるようになったとはいえ、ネットワークがLinuxだけで完結することはまれだろう。別のOSや異なるIPSecスタックと相互接続が可能なら、その用途は大幅に広がる。前編では、FreeBSDのKAMEと相互接続を試みる。

宮本 久仁男<miyamotokn@nttdata.co.jp>
NTTデータ システム開発事業本部
基盤システム事業部 第一ソリューション技術担当
2002/4/20

本番はこれから

 FreeS/WANによるIPSecの導入と運用で、Linux用のIPSecスタックであるFreeS/WANの設定と接続について紹介しました。ただ、「FreeS/WANの間だけで接続ができても……」という方もいると思います。また、IPSec自体が「オープンな規格である」ということもあり、FreeS/WAN以外の実装ともつないでみたいという方もいるでしょう。

 今回はFreeS/WANの環境を基に、よく使われる(もしくは使いやすいと思われる)IPSecスタックとの相互接続についてお話しします。実験的要素が多分に強い内容ではありますが、相互接続を念頭に置いて考えている方も多いと思いますので、ここで述べておく意味はあるでしょう。

 「以前の記事の内容では物足りない」と思われた方もいると思いますが、実は今回の記事につなぐための前振りだったと思っていただければ幸いです。

IPSecスタックの種類

 IPSecと一口にいっても、ハード/ソフトウェア、有償/無償配布、オープンソースなどなど、さまざまな形で実装、配布されています。無償配布あるいはOSに含まれているものをざっと挙げるだけでも、取りあえず、

  • KAME
    *BSDのためのIPSecスタック

  • pipsec
    トンネルデバイスが実装されているOSのための、ユーザーランドで動作するIPSecスタック
    *BSDなどで使用可能

  • PGPNet
    PGP Version 6.5に含まれるIPSecスタック
    Windows 98などで使用可能

  • Windows 2000/XP
    すでにIPSecがOSに実装されている

などがあります。VPN-1などの商用製品に接続するためのクライアントもありますが、ライセンスなどで自社製品以外のものとの接続を認めていないケースがあるため、今回取り上げる対象からは外しました。

 本稿は前編/後編という構成にさせていただき、前編ではUNIX系OSのIPSecスタック(KAME)、後編ではWindows系OS上のIPSecスタック(主にWindows 2000)との接続を取り上げます。

KAMEとFreeS/WANの相互接続

 「KAME」は、KAME ProjectによるIPv6、IPv4/v6 IPSecスタックの名称であり、*BSD系OSをターゲットに開発されています。

 最新のFreeBSDにはKAMEのスナップショットが取り込まれており、提供されているカーネルソースでも、オプションの指定を追加して再構成するだけでIPSecによる通信の準備ができてしまいます。ここでは、IPSecによる通信の準備と事前共有鍵を使用した通信の設定について解説します。

KAMEの事前準備

 今回は、FreeS/WANをインストールしたコンピュータの通信相手として、FreeBSD-4.4Rをインストールしたコンピュータを想定します。

カーネルの再構築

 FreeBSDのカーネルは、デフォルトではIPSecが有効になっていません()。従って、カーネルの再構成を実施してIPSec機能を有効にしてやる必要があります。

注:IPv6は有効になっていますが……。

 以下の作業は、すべてスーパーユーザー権限で実行するので操作には注意が必要です。

OPTIONSの設定

 FreeBSDのカーネルコンフィグレーションファイルは、/usr/src/sys/i386/conf下に存在します。GENERICカーネルのコンフィグレーションファイルをIPSECという名前のファイルにコピーして、OPTIONS設定に以下に示す行を追加します()。

  options         IPSEC
  options         IPSEC_ESP
  options         IPSEC_DEBUG

注:すでにカーネルの再構成をしたことがある場合は、そのファイルに対して設定を追加するような形になります。

カーネルの再構成とインストール

 下記の手順を実施することで、新しいカーネルがインストールされます。

# cd /usr/src/sys/i386/conf
# config IPSEC
# cd ../../compile/IPSEC
# make depend;make
# make install

リブート

 までの作業が完了したら、

# shutdown -r now

として、新しいカーネルでブートします。ブートした後、

# sysctl -a | grep ipsec

を実行して、それらしい行が出力されればカーネルへのIPSecスタックの組み込みは成功です。筆者の環境での例をリスト1に示します。

# sysctl -a | grep ipsec
net.inet.ipsec.def_policy: 1
net.inet.ipsec.esp_trans_deflev: 1
net.inet.ipsec.esp_net_deflev: 1
net.inet.ipsec.ah_trans_deflev: 1
net.inet.ipsec.ah_net_deflev: 1
net.inet.ipsec.ah_cleartos: 1
net.inet.ipsec.ah_offsetmask: 0
net.inet.ipsec.dfbit: 0
net.inet.ipsec.ecn: 0
net.inet.ipsec.debug: 1
net.inet.ipsec.esp_randpad: -1
net.inet6.ipsec6.def_policy: 1
net.inet6.ipsec6.esp_trans_deflev: 1
net.inet6.ipsec6.esp_net_deflev: 1
net.inet6.ipsec6.ah_trans_deflev: 1
net.inet6.ipsec6.ah_net_deflev: 1
net.inet6.ipsec6.ecn: 0
net.inet6.ipsec6.debug: 1
net.inet6.ipsec6.esp_randpad: -1
リスト1 このような出力(まったく同一とは限らない)が得られれば、組み込み成功

IKEデーモンの作成

 カーネルを再構築すれば、一応IPSecによる接続は可能です。しかし、IPSecの使われ方などを考えると、実用上はIKEによる鍵交換が行える必要があります。FreeS/WANにPLUTOがあるように、KAMEで使用するIKEデーモンの実装として「racoon」と呼ばれるプログラムがあります。このデーモンをインストールしましょう。

racoonのmake

 portsやpackagesを使うのが楽でしょう。KAMEプロジェクトのFTPサーバからracoonのソースコードを取得してもいいのですが、若干修正を行わないとmakeできません。()。

注:本稿では具体的には述べません。

racoonのinstall

 make installを実行すると、/usr/local/sbin/racoonという実行ファイルと/usr/local/etc/racoonというディレクトリが作成されます。このディレクトリにはracoonの設定ファイルのサンプルが格納されています。

事前共有鍵(Pre-Shared Key)を用いた場合

 図1のような構成(かなりシンプルです)に置かれたホスト間で暗号化通信を実施する例を考えてみましょう。

図1 KAMEとFreeS/WANの接続環境例

 まず、FreeS/WAN側はかなり制限のきつい実装になっているため、この制限を考慮した接続条件をKAMEにも適用する必要があります。

  • エンドツーエンドの暗号化を行う
  • IKE間の鍵交換は、ISAKMP/Oakley Group 2を使用
  • 暗号化アルゴリズムはDES3
  • 事前共有鍵を設定する

 これらを考慮したFreeBSD側(KAME)の設定をリスト2a〜2dに、Linux(FreeS/WAN)側の設定ファイルをリスト3a、3bに示します。

path include "/usr/local/etc/racoon" ;
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
path certificate "/usr/local/etc/cert" ;
my_identifier address "192.168.1.50";

log debug;


remote 192.168.1.2
{
        exchange_mode main,aggressive;

        lifetime time 28800 sec;        # sec,min,hour
        initial_contact off;

        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key ;
                dh_group 2 ;
        }
}

sainfo anonymous
{
        #pfs_group 2;
        lifetime time 12 hour ;
        encryption_algorithm 3des,cast128,des ;
        authentication_algorithm hmac_sha1,hmac_md5;
        compression_algorithm deflate ;
}
リスト2a /usr/local/etc/racoon/racoon.conf

192.168.1.2 testtestkey
リスト2b /usr/local/etc/racoon/psk.txt(事前共有鍵を格納)

# ls -l /usr/local/etc/racoon/racoon.conf
-r--r--r-- 1 root bin 611 Apr 11 06:19 /usr/local/etc/racoon/racoon.conf
# ls -l /usr/local/etc/racoon/psk.txt
-r-------- 1 root bin 44 Apr 9 22:27 /usr/local/etc/racoon/psk.txt
リスト2c racoon.confとpsk.txtのパーミッション設定

spdflush;
spdadd 192.168.1.2 192.168.1.50 any -P in ipsec esp/transport//require ;
spdadd 192.168.1.50 192.168.1.2 any -P out ipsec esp/transport//require ;
リスト2d /usr/local/etc/racoon/kame.conf

# basic configuration
config setup
        interfaces=%defaultroute
        klipsdebug=none
        plutodebug=none
        plutoload=%search
        plutostart=%search

# defaults for subsequent connection descriptions
# (mostly to fix internal defaults which, in retrospect, were badly
 chosen)
conn %default
        type=transport
        authby=secret
        right=192.168.1.2
        pfs=no

# connection description for (experimental!) opportunistic encryption
# (requires KEY record in your DNS reverse map; see 
doc/opportunism.howto)

# sample VPN connection
conn kame
        left=192.168.1.50
        auto=start
リスト3a /etc/ipsec.conf

192.168.1.2 192.168.1.50 "testtestkey"
リスト3b /etc/ipsec.secrets

 FreeBSD側では、racoon以外にセキュリティポリシーデータベース(SPD)の設定が必要なので注意してください。racoonの設定はracoon.conf(リスト2a)とpsk.txt(リスト2b)に、SPDの設定内容はkame.conf(リスト2d)にそれぞれ記述してあります。また、psk.txtには読まれてはならない情報が格納されているので、ファイルのパーミッションに注意してください。

暗号化通信の開始

 ここまでの記述で、暗号化通信を行う準備ができました。実際に通信してみましょう。

FreeBSD側での操作

 FreeBSD側では、SPDの設定およびIKEデーモンの起動という2つの操作が必要です。

  • SPDの設定
    setkeyコマンドを以下のように実行します。

    # setkey -f /usr/local/etc/racoon/kame.conf

  • racoonの起動

    # /usr/local/sbin/racoon

Linux側での操作

 以下のコマンドラインを実行します(編注)。

# /usr/local/sbin/ipsec setup start

 これで暗号化通信を行うことができます。

編注:FreeS/WANによるIPSecの導入と運用[後編]参照。

実際の通信の様子

 ここまできたら、後は実際に通信が暗号化されているかどうか、tcpdumpを使って確認するだけです。筆者の環境ではリスト4a、4bのようになります。

[root@webdav1 /etc]# telnet spica
Trying 192.168.1.50...
Connected to spica.
Escape character is '^]'.

FreeBSD/i386 (spica.ip-tunnel.net) (ttyp1)

login: wakatono
Password:
リスト4a 実際の通信内容(telnetを使用)

spica# tcpdump host webdav1 and spica
tcpdump: listening on lnc0
06:21:28.358216 webdav1.isakmp > spica.ip-tunnel.net.isakmp: isakmp: phase 1 I i
dent: [|sa] (DF)
06:21:28.397826 spica.ip-tunnel.net.isakmp > webdav1.isakmp: isakmp: phase 1 R i
dent: [|sa]
06:21:28.433482 webdav1.isakmp > spica.ip-tunnel.net.isakmp: isakmp: phase 1 I i
dent: [|ke] (DF)
06:21:28.491193 spica.ip-tunnel.net.isakmp > webdav1.isakmp: isakmp: phase 1 R i
dent: [|ke]
06:21:28.534341 webdav1.isakmp > spica.ip-tunnel.net.isakmp: isakmp: phase 1 I i
dent[E]: [|id] (DF)
06:21:28.593448 spica.ip-tunnel.net.isakmp > webdav1.isakmp: isakmp: phase 1 R ident[E]: [|id]
06:21:28.643281 webdav1.isakmp > spica.ip-tunnel.net.isakmp: isakmp: phase 2/others I oakley-quick[E]: [|hash] (DF)
06:21:28.701975 spica.ip-tunnel.net.isakmp > webdav1.isakmp: isakmp: phase 2/others R oakley-quick[E]: [|hash]
06:21:28.833585 webdav1.isakmp > spica.ip-tunnel.net.isakmp: isakmp: phase 2/others I oakley-quick[E]: [|hash] (DF)
06:21:30.291531 webdav1 > spica.ip-tunnel.net: ESP(spi=0x0eb7e8af,seq=0x1) (DF)
06:21:30.293973 spica.ip-tunnel.net > webdav1: ESP(spi=0x2986df84,seq=0x1) (DF)
06:21:30.298343 webdav1 > spica.ip-tunnel.net: ESP(spi=0x0eb7e8af,seq=0x2) (DF)
06:21:30.315232 webdav1 > spica.ip-tunnel.net: ESP(spi=0x0eb7e8af,seq=0x3) (DF)
06:21:30.355454 spica.ip-tunnel.net > webdav1: ESP(spi=0x2986df84,seq=0x2) (DF)[tos 0x10]
06:21:30.365154 webdav1 > spica.ip-tunnel.net: ESP(spi=0x0eb7e8af,seq=0x4) (DF)
リスト4b tcpdumpによるパケットダンプの結果

 ISAKMPポートで鍵交換が行われた後、暗号化通信が始まっているのが分かります。

 
1/2

Index
Linux以外のIPSecスタックとの相互接続[前編]
− LinuxでIPSecを使おう −
Page 1
本番はこれから
IPSecスタックの種類
KAMEとFreeS/WANの相互接続
 KAMEの事前準備
 事前共有鍵(Pre-Shared Key)を用いた場合
 暗号化通信の開始
 実際の通信の様子
  Page 2
RSA鍵ペアによるFreeS/WAN同士の接続
 RSA鍵ペアの作成
 公開鍵の取り出し
 通信設定
後編の予告

Linux Square全記事インデックス


 Linux Squareフォーラム セキュリティ関連記事
連載:習うより慣れろ! iptablesテンプレート集(全4回)
初心者にとって、iptablesは難しい。そこで、学習の第1歩としてテンプレートを自分の環境に適応させることから始めよう
連載:ゼロから始めるLinuxセキュリティ(全11回)
奥が深いセキュリティ対策の世界をゼロから解説。ホストレベルのセキュリティからファイアウォール、IDSの構築、ログ管理方法まで、システム管理者必見
特集:WebDAV時代のセキュリティ対策[前編]
WebDAVのメソッドは便利な反面、セキュリティホールとなり得る。しかし、適切な対策を講じることでメソッドの危険性は取り除くことができる
特集:FreeS/WANによるIPSecの導入と運用[前編]
LinuxでIPSecを利用するには、「FreeS/WAN」というIPSecスタックを用いることになる。まず、これをインストールすることから始めよう
特集:Linux以外のIPSecスタックとの相互接続[前編]
別のOSや異なるIPSecスタックとの相互接続が可能なら、その用途は大幅に広がる。前編では、FreeBSDのKAMEと相互接続を試みる
特集:sshでセキュアネットワーク
サーバにリモートログインする場合は、暗号化して転送するsshを使おう。sshをサーバとクライアントにインストールすれば、インターネット上でも安全な通信が可能になる

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間