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

今回は、前編で紹介し切れなかったX.509証明書の利用方法を紹介する。OpenSSLが必要であるなど、前編で解説した方法に比べて難易度が高くなるが、ぜひ挑戦してみてほしい。

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

X.509形式の証明書を使ったKAMEとの接続

 前編では、FreeS/WANとKAMEの接続に事前共有鍵を用いる方法を紹介しましたが、KAME側でX.509証明書を使用してFreeS/WANと接続することも可能です。やり方はいくつかありますが、今回は最も失敗が少ないと思われる方法を紹介します(編注)。なお、今回はPLUTOに対する機能拡張を実施する関係上、FreeS/WANのバージョンは1.96を使用します。

編注:本来は、後編としてWindowsとLinuxの接続方法を解説する予定でしたが、前編とのつながりを考慮して、編集局判断により中編を挿入させていただきました。WindowsとLinuxの接続方法も追って公開させていただきます。

 本当ならば、最初に紹介したバージョン(1.95)にパッチを当てるなどした方がよいのですが、FreeS/WAN 1.95に対するパッチがうまく当たらないため、今回は1.96にしました。1.95ですでに運用されている方には、あらためておわび申し上げます。

FreeS/WANとfswcertコマンドの準備

FreeS/WAN拡張パッチの適用

 FreeS/WAN拡張パッチをhttp://www.strongsec.com/freeswan/から入手し、展開します()。

注:今回の場合は、使用したFreeS/WANのバージョンが若干古いので、http://www.strongsec.com/freeswan/old.htmからFreeS/WAN 1.96用のパッチを入手することになります。

 ダウンロードしたファイルを展開すると、x509patch-0.9.9-freeswan-1.96というディレクトリと、そのディレクトリ内に以下のファイルが作成されます。このうち、freeswan.diffがFreeS/WANに対するパッチです。

  • CHANGES
  • README
  • ipsec.secrets.template
  • freeswan.diff

 別途、FreeS/WAN 1.96のアーカイブを展開し、作成されたディレクトリ配下に移動したうえで、

# patch -p1 < freeswan.diff

などとして、このパッチを適用します。パッチはPLUTOに対するものであり、カーネルデーモンであるKLIPSは変更されません。

 これでコンパイルの準備は完了です。コンパイル自体は、FreeS/WANによるIPSecの導入と運用[前編]で紹介した手順で問題なく進められます。

fswcertコマンドの作成

 カーネルのコンパイルとは別に、X.509証明書をFreeS/WANで取り扱える形式にするためのコマンドを作成します。ソースコードは、http://www.strongsec.com/freeswan/で入手可能です。fswcertもやはり、旧バージョンはhttp://www.strongsec.com/freeswan/old.htmにあります。

 入手したfswcert-0.6.tar.gzを展開してコンパイルするわけですが、fswcertコマンドを作成するにはあらかじめOpenSSLがインストールされていなければなりません。

X.509証明書の作成

 次にX.509証明書の作成です。今回は正規に入手するのではなく、OpenSSLを使用して作成・署名した秘密鍵や証明書を使用します。当然ですが、OpenSSLがインストールされている必要があります。記事の執筆に当たっては、OpenSSL 0.9.5aを使用しました。

 OpenSSLそのものについては、

など、いくつかの記事で取り上げられているので、ここでは詳細には触れません。

RSA秘密鍵と証明書の作成

 以下のコマンドラインを実行します。なお、opensslコマンドはパスが通っているものとして扱います。

$ openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout privkey.pem -outform PEM -out request.pem

 いくつか入力を求められる部分があります。私は以下のように入力しています。

Using configuration from /usr/share/ssl/openssl.cnf
Generating a 1024 bit RSA private key
......++++++
................++++++
writing new private key to 'privkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP ←国名コード(日本なのでJP)
State or Province Name (full name) [Some-State]:Tokyo ←都道府県名(東京)
Locality Name (eg, city) []:Ota ←市町村名(大田)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Group TODO ←団体名
Organizational Unit Name (eg, section) []:Tech Div. ←部署名
Common Name (eg, your name or your server's hostname) []:Kunio Miyamoto ←名前
Email Address []:wakatono@todo.gr.jp ←メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←何も入力せず[Enter]キー
An optional company name []: ←何も入力せず[Enter]キー
[kmiya@bomber kmiya]$ ls *pem
privkey.pem request.pem ←PEM形式の秘密鍵とPKCS#10形式のリクエストが作成された

証明書の署名

 で作成したrequest.pemから、署名を実施したX.509形式の証明書を作成します。具体的には、request.pemをprivkey.pemで署名し、cert.pemに格納します。実際に使う場合は、きちんとした鍵を使ってください。

$ openssl x509 -req -in request.pem -signkey privkey.pem -out cert.pem
Signature ok
subject=/C=JP/ST=Tokyo/L=Ota/O=Group TODO/OU=Tech Div./CN=Kunio Miyamoto/Email=wakatono@todo.gr.jp
Getting Private key

 これで、RSA秘密鍵「privkey.pem」とX.509形式の証明書「cert.pem」が完成しました。

KAMEへの証明書のインストール

 作成したprivkey.pemとcert.pemをopensslコマンドでさらに別の形式に変換し、KAMEにインストールします。IPsec 2000というカンファレンスにおいて使用された設定例(http://www.hsc.fr/ressources/ipsec/ipsec2000/kame/)の内容を参考にしましたが、そのままでは使えませんでした。

$ openssl rsa -in privkey.pem -text -out priv.key
RSA秘密鍵の変換

$ openssl x509 -in cert.pem -text -out cert.key
X.509証明書の変換

 X.509証明書の変換は、KAME側とFreeS/WAN側の両方で実施する必要があります。

FreeS/WANで使用できる形式の鍵ペア作成

公開鍵と秘密鍵の作成

 KAME側で作成したのと同様の手順でRSA秘密鍵とX.509形式の証明書を作成しますが、FreeS/WANで使用できる形式の鍵を作成するために、fswcertコマンドを利用します。

# fswcert -k privkey.pem
RSA秘密鍵privkey.pemから/etc/ipsec.secretsに記述する秘密鍵の生成

 上記のコマンドで、/etc/ipsec.secretsに記述する形式の鍵が標準出力に書き出されます。

# fswcert -c cert.pem
X.509形式の証明書から/etc/ipsec.confに記述する公開鍵の作成

IDフィールドの作成

 FreeS/WANにおけるleftidおよびrightidパラメータの指定を行います。ここに指定する値として、証明書に格納されているSubjectの内容を使います。以下のようなコマンドラインで当該フィールドを取り出すことが可能です。

# openssl x509 -in cert.pem -subject -noout

 ここでの出力結果をIDとして適用するために、FreeS/WANに対するパッチが必要となります。

設定内容の実際

 以下に、FreeS/WANとKAMEに設定する内容を示します。FreeS/WANは/etc/ipsec.confと/etc/ipsec.secrets、KAMEはSPDとracoon.confの内容、そしてracoon.confで指定した秘密鍵および証明書ファイルの内容です。

FreeS/WAN側の設定

 /etc/ipsec.confのポイントは、rightidに「FreeS/WANで使用できる形式の鍵ペア作成」の手順で生成した自分のID、leftidに通信相手(KAME)のIDを記述します。rightrsasigkeyは自分、leftrsasigkeyは通信相手(KAME)のX.509証明書からfswcertを使って生成した公開鍵(「FreeS/WANで使用できる形式の鍵ペア作成」の手順)を記述します。

 /etc/ipsec.secretsには、「FreeS/WANで使用できる形式の鍵ペア作成」の手順で、fswcertを使って生成したFreeS/WAN側の秘密鍵を記述します。

KAME側の設定

 証明書および秘密鍵のファイルは、「KAMEへの証明書のインストール」の手順で生成したものを用います。

動作確認

 ここまでの設定を有効にして、KAME側からFreeS/WAN側にICMPパケットを送付します(pingコマンドを使用)。最初の数パケットはIKEネゴシエーションなどの関係で落ちていますが、その後のパケットは問題なく送られていることが分かります(画面1)。

画面1 pingが通っているのが分かる

 一応、確認のためにFreeS/WAN側でパケットダンプを取得すると、暗号化されたパケットが送られていることが確認できます(画面2)。

画面2 tcpdumpによる出力。パケットは暗号化されており、その内容を見ることはできない

今回の検証に当たって

 今回のKAMEとFreeS/WANの間の接続検証は、IPsec 2000での相互接続実験の構成を基にしています。しかしながら、IPsec 2000で検証された際の設定をそのまま適用しても通信できませんでした。試行錯誤を繰り返した結果、一番確実につながるであろう方法をここでは紹介しています。

 パッチについても、本当ならばIDフィールドの解釈だけではなく証明書を直接扱うことができるはずなのですが、今回はこれまでに説明したRSA鍵を使う方法との差が少なくなると考え、IDフィールドの解釈のみに利用しました。

前編へ
1/1

Index
Linux以外のIPSecスタックとの相互接続[中編]
− LinuxでIPSecを使おう −
Page 1
X.509形式の証明書を使ったKAMEとの接続
FreeS/WANとfswcertコマンドの準備
 FreeS/WAN拡張パッチの適用
 fswcertコマンドの作成
X.509証明書の作成
 KAMEへの証明書のインストール
 FreeS/WANで使用できる形式の鍵ペア作成
設定内容の実際
 FreeS/WAN側の設定
 KAME側の設定
 動作確認
今回の検証にあたって

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 記事ランキング

本日 月間