The official IPsec Howto for Linux (http://www.ipsec-howto.org/) Revision 0.9.95 - Sep 03 2005 Ralf Spennberg 英文HTML公式版に基づいた非公式和訳 -- 面倒なのでSGML化断念. 趙亮,宇都宮大学工学部,2005年10月5日. 公式URI http://freescitech.net/1/ipsec_ja.txt 2005-12-14, typo修正,関さんに感謝 別の訳:http://www.gnome.gr.jp/~ss/x/ipsec-howto/ 概要 このHowToは,Linuxカーネル2.6をベースにIPsecを用いてVPNを構築する 基本・上級手法を解説する.カーネル2.4に関しては入手可能な資料が 結構あるので,このHowToはカーネル2.6におけるIPsecの新機能について 焦点を当てる. 目次 序論 理論 Linux 2.6上に動くOpenswan KAMEツールを使うLinuxカーネル2.6 OpenBSD isakmpdを使うLinuxカーネル2.6 X.509証明書生成 高度な設定 リンク 序論 この文書の最新版は常にLDP(Linux Documentation Project)と公式 ホームページhttp://www.ipsec-howto.orgから入手できる. このHowToを書いた理由 これまでに私は数々のHowToを利用したことがある.たいてい大いに 役立ってくれた.LinuxカーネルにおけるIPsecの新機能が実装された 時に,私はそれを試しにやってみたが,すぐに資料が殆どないことに 気づいた.これは私がこのHowToを書いたきっかけとなった. この文書の形式 この文書は7章に分けられている. 第一節:序論 この節. 第二節:理論 IPsecの理論.基本的にIPsecプロトコル群について. 第三節:Openswan カーネル2.6でOpenswanを使う方法を述べる. 第四節:Linuxカーネル2.6上に動くracoon KAMEツールsetkeyとracoonを用いてIPsec VPNを確立させる方法を 述べる.NAT-Traversalも含むようになった. 第五節:Linuxカーネル2.6上に動くisakmpd OpenBSD isakmpd IKEデーモンを利用してIPsec VPNを確立させる 方法について述べる. 第六節:X.509証明書生成 コマンドopensslを用いてX.509証明書の生成法を述べる. 第七節:高度な設定 いくつかXAUTHに関するヒントと有用なiptablesルールを示す. この文書の貢献者達 Matija Nalis Fridtjof Busse Uwe Beck Juanjo Ciarlante Ervin Hegedus Barabara Kane Alois Schmid 法的事項 著作権 Copyright (c) 2003 Ralf Spenneberg どんなフォーマットでもいいから,自由にこの文書を複製・配付(販売 または寄附)して下さい.ただし,訂正やコメント等はこの文書の保守 者まで転送して下さい.また,あなたは下記の条件を守ってくれれば 派生物を作ったり配付したりすることができる: 派生物を(最も適した形,例えばSGMLで)LDP (Linux Documentation Project) または同種のところに送ったりしてインターネット上で 公表すること.LDPでなければ入手先をLDPに教えること. 派生物のライセンスはこれと同じものかGPLを使用すること.著作権に 関する説明と使用しているライセンス(少くともリンク)を入れること. 前著者らと主要貢献者らへの謝辞 (credit). もしあなたが翻訳ではない派生物を作ろうと考えているなら,現在の 保守者まで自分の予定について相談すること. 免責 著者は,暗黙または明示的に,この文書によって起こったことについて 一切責任を持たない,保証しない.あなたの犬が死んだら著者に責任を 負わせることのないように! 関連文書 Networking Overview HOWTO Networking HOWTO VPN-Masquerade HOWTO VPN HOWTO Advanced Routing & Traffic Control HOWTO 理論 IPsecとは? IPsecはIPと上位層プロトコルに安全性を提供するIPプロトコルの拡張である. 最初は新しいIPv6標準のために開発されたが,その後IPv4に移植された. IPsecの構成はRFC2401に説明されている.次にIPsecについて簡単に説明する. IPsecは二つ異なるプロトコル - AHとESP - を用い,通信の認証や整合性と 機密性を保証する.IPデータグラム全体または上位層プロトコルのみを保護 することができる.そのためのモードは,トンネルモードとトランスポート モードという.トンネルモードにおいては,IPデータグラムの全体がIPsec プロトコルによって新しいIPデータグラムの中にカプセル化される.一方, トランスポートモードにおいては,IPデータグラムのペイロード部分だけが IPsecプロトコルによって処理され,IPヘッダと上位層プロトコルヘッダ間に IPsecヘッダが挿入される(図1参照). ------------------------ トランスポートモード | IP | AH | TCP | Data | ------------------------ \ | | \ | | ------------------- 元パケット | IP | TCP | Data | ------------------- | | | | | | ----------------------------- トンネルモード | IP | AH | IP | TCP | Data | ----------------------------- | 新IPヘッダ 図1 IPsecトンネルとトランスポートモード IPデータグラムの整合性を保護するために,IPsecプロトコルはhash message authentication codes (HMAC, ハッシュメッセージ認証コード)を利用する. HMACを導出するために,IPsecプロトコルはMD5やSHAのようなハッシュ・ アルゴリズムを使って秘密鍵とIPデータグラムのハッシュを計算する.計算 結果のHMACがIPsecプロトコルヘッダに入れられ,パケット受信者は秘密鍵を 入手できればHMACをチェックすることができる. IPデータグラムの機密性を保護するために,IPsecプロトコルは標準的な対称 暗号アルゴリズムを利用する.IPsec標準ではNULLとDESの実装を必要として いる.現在ではより強いアルゴリズム,例えば3DES, AESとBlowfishがよく 用いられる. サービス拒否(DoS)攻撃から守るために,IPsecプロトコルは移動窓(sliding window,スライディングウィンドー)を利用する.各パケットに順序番号が つけられ,順序番号が現在またはより新しい窓(ウィンドー)の範囲内にある パケットのみ受け入れられる.古いパケットは直ちに破棄される.これで 再現攻撃(replay attack),即ち攻撃者が元パケットを記録して後で再送 するような攻撃から通信を守ることができるになる. 通信同士は,IPsecパケットを暗号化と解読するために,通信に関わる秘密 鍵,アルゴリズムとIPアドレスを保存する必要がある.これらのIPデータ グラムの保護に必要なパラメータはすべてSA(security association)に保存 される.さらにSAはSAD(SA database)に保存される. SAは次のパラメータを定義している: - IPsecヘッダの発信元と目的地のIPアドレス.これらはパケットを保護 するIPsec通信同士のIPアドレス. - IPsecプロトコル(AHまたはESP),時には圧縮(IPCOMP)もサポートされる. - IPsecプロトコルに使われるアルゴリズムと秘密鍵. - SPI(security parameter index).SAを識別するための32ビット数値. さらに以下のパラメータも保存できるSAD実装がある. - IPsecモード(トンネルまたはトランスポート) - 再現攻撃に対抗するための移動窓のサイズ - SAの生存時間 SAが発信元と目的地のIPアドレスを定義しているので,双方向IPsec通信 トラフィックにおいて一方向だけを保護できる.両方向を保護するには, IPsecは二つの片方向SAを必要とする. SAは,IPsecがどのようにトラフィックを保護するだけを指定している. この他に,どのトラフィックをどんな時に(訳注1)保護するのを定義する 情報が必要である.この情報はSP(security policy)に保存されて,SPは さらにSPD(SP database)に保存される. (訳注1:原文は"Additional information is needed to define which traffic to protect when."であるが,最後のwhenが英語として意味不明. 要問い合わせ.2004-12-08,2005-03-10) SPは通常以下のパラメータを指定している: - 保護したいパケットの送信元と目的地のIPアドレス.トランスポート モードではこれらがSAにあるアドレスと同じである.トンネルモード では異なることがある! - 保護したいプロトコル(とポート).いくつかのIPsec実装では保護する プロトコルを指定することができない.その場合,上記のIPアドレス 間のすべてのトラフィックが保護される. - パケットを保護するためのSA. 手動でSAを設定するのは結構間違えやすい.しかもあまり安全ではない. 秘密鍵と暗号アルゴリズムは,VPN(仮想プライベートネットワーク)の 全ての参加者に共有しなくてはならない.特に鍵交換はシステム管理者を 悩ませる重大問題である:まだ暗号化されていない時にどうやって秘密 対称鍵を交換するの? この問題を解決するために,IKE(internet key exchange)プロトコルが 開発された.このプロトコルは第一段階で通信同士を認証する.第二 段階ではSAがネゴーシエイト(negotiate,交渉)され,秘密対称鍵は Diffie Hellmann鍵交換によって決定される.IKEプロトコルはさらに 定期的に秘密鍵の再生成を行なうことにより機密性を保証する. IPsecプロトコル IPsecプロトコル族は二つのプロトコルからなっている:AH (Authentication Header,認証ヘッダ)とESP (Encapsulated Security Payload,暗号化 セキュリティペイロード).二つは独立になっている.AHはIPプロトコル51, ESPはIPプロトコル50 (/etc/protocols参照)である.次の二節はこの二つ プロトコルの性質を概説する. AH - Authentication Header AHプロトコルはIPデータグラムの整合性を守る.そのためにHMACを計算する (訳注2).HMACを計算のに,AHプロトコルは秘密鍵,パケットのペイロードと IPヘッダの不変の部分,例えばIPアドレスを使う.そしてAHヘッダをパケットに 附加する.AHヘッダは図2に示す. (訳注2:原文は"To achieve this, the AH protocol calculates a HMAC to protect the integrity".最後の"to protec the integrity" =整合性を保護 するために,は重複なので訳から外した.因に"a HMAC"よりは"an HMAC"のほうが 正しいように思う.2004-12-08) ------------------------------------------- | Next Header | Payload Length | Reserved | | 次のヘッダ | ペイロード長 | 予約 | ------------------------------------------- | Security Parameter Index (SPI) | | SPI | ------------------------------------------- | Sequence Number (Replay Defense) | | 順序番号(再現攻撃への防衛) | ------------------------------------------- | Hash Message Authentication Code | | HMAC | ------------------------------------------- 図2.AHヘッダはパケットの整合性を守る AHヘッダ長は24バイト.最初の一バイトはNext Headerであり,後続ヘッダの プロトコルを示す.トンネルモードにおいては,IPデータグラムそのものが カプセル化されるので,ここが4になる.一方,トランスポートモードにおいて TCPデータグラムをカプセル化する場合は6になる.次のバイトはペイロードの 長さを示し,その次の二バイトは予約.その次のダブルワードは32ビット長SPI. SPIはパケットをカプセル状態から復元するためのSAを示す.32ビットの順序 番号は再現攻撃から守るために使われる.最後の96ビットはHMACであり,秘密 鍵を知っている通信同士しかHMACを生成したりチェックしたりできないので, HMACはパケットを整合性を保護する. AHプロトコルは,IPデータグラムの不変なIPヘッダ(IPアドレス等)を保護 するために,NATを許さない.NAT (network address translation) はIPヘッダ (通常発信元IP)にあるIPアドレスを別のIPアドレスで書き換えるが,そうする ことによってHMACが無効になってしまうから.IPsecプロトコルNAT-Traversal 拡張はこの制限を避けるための方法を実装している. ESP - Encapsulated Security Payload ESPプロトコルは同時に(HMACを用いて)パケットの整合性と(暗号化を 用いて)機密性を保証できる.パケットを暗号化してHMACを計算した後, ESPヘッダが生成されパケットに附加される.ESPヘッダは二部分からなる. 図3に示す. ------------------------------------------------- | Security Parameter Index (SPI) | | SPI | ------------------------------------------------- | Sequence Number (Replay Defense) | | 順序番号(再現攻撃への防衛) | ------------------------------------------------- | Initialization Vector (IV) | | 初期化ベクトル(IV) | ------------------------------------------------- | | | Data | | データ | | | -------------------------------------------- | | Padding | Padding Length | Next Header | | |パディング | パディング長 | 次のヘッダ | ------------------------------------------------- | Hash Message Authenication Code | | HMAC | ------------------------------------------------- 図3.ESPヘッダ ESPヘッダ最初のダブルワードは,SPI(Security Parameter Index)を示す. SPIはESPパケットからデータを復元するためのSAを指定する.二番目の ダブルワードは順序番号である,再現攻撃から通信を守るために使われる. 三番目のダブルワードは暗号化過程中に使われる初期化ベクトル(IV)を示す. 対称暗号化アルゴリズムは,IVを使わないと,頻度攻撃によってばれやすく なる.IVは同じペイロードでも異なる暗号ペイロードになることを保証する. 暗号化にはIPsecはブロック暗号(block cipher)を用いる.そのため, ペイロードは,長さがブロック長の整数倍でない時に,パディングする 必要がある.それでパディングの長さが附加される.パディング長の次の ニバイトはNext Headerで次のヘッダを指定している.最後にパケットの 整合性を保証するための96ビットHMACがESPヘッダに附加される.このHMACは パケットペイロードのみを考える.IPヘッダは計算に入らない. 従ってNATの使用はESPプロトコルを壊さない.しかしやはり多くの場合, NATとIPsecの併用ができない.NAT-Traversalはこの場合の解決法として, ESPパケットをUDPパケットにカプセル化する方法提案している. IKEプロトコル IKEプロトコルは,安全な通信を成立させるのに最重要な問題,通信 同士の認証と対称鍵の交換を解決する.そしてSAを作成しSADに加える. IKEプロトコルは通常ユーザ空間のデーモンであり,OSに実装されない. IKEプロトコルは通信のため500/UDPを使う. IKEプロトコルは二段階で機能する.第一段階でISAKMP SA (Internet Security Association Key Management Security Association)を確立する. 第二段階でISAKMP SAがネゴーシエイトしてIPsec SAを確立するために 使われる. 第一段階通信同士の認証は,通常,PSK (pre-shared key),RSA鍵とX.509 証明書によって行なわれる(racoonはなんとKerberosもサポートしている). 第一段階は通常二つ異なるモード,メインモードとアグレシブモード (aggressive mode,積極モード)をサポートしている.両方ともピア認証と ISAKMP SAの確立を行なうが,アグレシブモードは半分のメッセージ量だけで 目標を達成している.当然これには欠点がある:アグレシブモードは身元 確認を行なわないから,事前共有鍵(PSK)を用いる場合,介入者攻撃 (man-in-the-middle)に弱い.一方,これがアグレシブモードの目的である. メインモードは,内部仕様で身元不明のピアと異なるPSKを利用することが できないが,アグレシブモードは身元確認をサポートせずクライアントの 身元情報を明文で送信する.こうすることによって,通信同士は,認証の 行なわれる前にお互いを知ることができ,異なるピアのための異なるPSKを 利用することができるようになる. 第二段階でIKEプロトコルはSA提案を交換し,ISAKMP SAに基づいてSAを ネゴーシエイトする.ISAKMP SAは介入者攻撃に対抗するための認証を 提供する.第二段階はクィックモードを用いる. 通常,通信同士は,ただ1つのISAKMP SAをネゴーシエイトし,それを 用いて複数(最低二つ)の一方向IPsec SAをネゴーシエイトする. NAT-Traversal NAT-Traversal(NAT横断)とはなに? どうして必要か. VPNピアの一方がNATデバイスの後にあることがよくある.ここで単純に ソースNATデバイスと仮定しよう.つまりNATと言えば,ソースNAT或は マスカレイド(masquerading)を指す.これはVPNとどう関係しているか. まず,ピアのIPアドレスがNATデバイスによって隠される.NATデバイスは, 自分のIPアドレスで発信元のIPアドレスを取り替えるのである. これによってIPsecのAHプロトコルは直ちに使えなくなる.でも,両側が 正しく設定すればESPはまだ使える. ではなぜNAT横断が必要なのか.それは,同じNATデバイスの後にある 二台のマシンが同時に外とトンネルを確立しようとすると,両方も失敗 するためである. なぜこんなことが起こるのか.NATデバイスがNAT化された接続を常に 把握し元クライアントへの返信パケットをde-natする必要がある. そのためにNATデバイスは,内部表を持ってNAT化された接続を記憶して いる.クライアントがインターネット上のあるウェブサーバに接続すると 仮定しよう.NATデバイスは自分のアドレスでオリジナルアドレスを 取り替えて,内部表に登録しておく.このクライアントのポート宛に 返ってくるパケットをオリジナルのクライアントに転送する.同じことが 二番目のクライアントが接続を開始する場合にも起こる.偶然に二番目の クライアントが同じポートを使っていたら,NAデバイスはクライアント ポートを重複のないように修正する.この方法は,ポートを使うTCPとUDPに 対してうまく働く.しかしESPはポートを使わない.従ってNATデバイスは プロトコルでパケットを見分けることしかできない.最初のクライアントが 接続したら,(NATデバイスは内部)表に,すべてのESPパケットをde-nat してそのクライアントに転送するような情報を登録しておく.二番目の クライアントが接続したら,NATデバイスは二番目のクライアントのために 先の登録を上書きする.従って少なくとも一番目の接続が壊される. ではNAT横断がどうやってこの問題を解決するのか.NAT横断はさらにESP パケットをUDPパケットにカプセル化する.今度は,ポートがあるから NATデバイスが容易に処理できる.デフォールトで4500/udpが使われる. NAT横断はいくつかのドラフトで規定されているが,現時点でRFCがない. NAT横断の一ついいところは,一旦有効になったら通信同士が必要な時に 自動的に使えることである. Linux2.6上に動くOpenswan ToDo 2005-03-10 Linux Kernel 2.5/2.6, KAMEツール篇 この章はLinuxカーネル>= 2.5.47と2.6.*のネイティブなIPsec スタックの使い方について解説する.このIPsecスタックの インストールと設定はFreeS/WANとかなり異なり,*BSD,例えば FreeBSD, NetBSDとOpenBSDに似ている. まずLinuxカーネルとユーザスペースツールのインストールと設定から はじめよう.その次がトランスポートモードとトンネルモードにおける 手動鍵接続設定.最後にPSKとX.509証明書を用いた自動鍵接続の設定を 解説する.ロードウォリア(roadwarrior,出張者,モバイルユーザ等)に 関する話は最後で説明する. インストール インストールするにはLinuxカーネルバージョン 2.5.47または2.6.* 以上が必要である.カーネルソースはhttp://www.kernel.orgから ダウンロードできる.ダウンロードしたら,カーネルソースを展開し, 設定を行なってからコンパイルする. cd /usr/local/src tar xvjf /path-to-source/linux-.tar.bz2 cd linux- make xconfig make bzImage make modules make modules_install make install 以上がLinuxカーネルを設定とコンパイルするための通常コマンドである. 特殊な設定が必要な場合,Kernel_Howtoを参照して下さい. カーネルを設定する際,以下の特点を使用することにするのが重要である. Networking support (NET) [Y/n/?] y * * Networking options * PF_KEY sockets (NET_KEY) [Y/n/m/?] y IP: AH transformation (INET_AH) [Y/n/m/?] y IP: ESP transformation (INET_ESP) [Y/n/m/?] y IP: IPsec user configuration interface (XFRM_USER) [Y/n/m/?] y Cryptographic API (CRYPTO) [Y/n/?] y HMAC support (CRYPTO_HMAC) [Y/n/?] y Null algorithms (CRYPTO_NULL) [Y/n/m/?] y MD5 digest algorithm (CRYPTO_MD5) [Y/n/m/?] y SHA1 digest algorithm (CRYPTO_SHA1) [Y/n/m/?] y DES and Triple DES EDE cipher algorithms (CRYPTO_DES) [Y/n/m/?] y AES cipher algorithms (CRYPTO_AES) [Y/n/m/?] y カーネルのバージョンにもよるが,IPv6のサポートも使用することにする 必要があるかもしれない. カーネルがコンパイルされてインストールできたら,ユーザスペース ツールをインストールする.現在これらのツールが http://ipsec-tools.sourceforge.net/で保守されている.自分でコンパイル する場合,カーネルヘッダファイルの場所を指定する必要があるかもしれない. このパッケージがカーネルバージョン2.5.47以上のカーネルヘッダを 必要とする. ./configure --with-kernel-headers=/lib/modules/2.5.47/build/include make make install これで準備完了. setkeyで手動鍵接続 手動鍵接続とは,接続設定に必要なパラメータがすべて管理者に指定 されること.IKEプロトコルによる自動ピア認証とパラメータ交渉を 行なわない.管理者がSA生成やSADに追加するのに使用するプロトコル, アルゴリズムと鍵を決定する. トランスポートモード この節は最初にトランスポートモードにおける手動鍵接続を説明する. これがたぶん一番いい方法であろう.なぜなら,一番簡単だから. この節は,IPアドレス 192.168.1.100 と 192.168.2.100 の二台の マシンがIPsecで通信を行なうことを仮定する. SADとSPDに保存されるパラメータがすべてsetkeyコマンドで修正できる. このコマンドは結構詳細なmanページを持っている.だからここでは トランスポートモード接続を確立するのに必要なオプションだけを 説明する.setkeyは,setkey -f /etc/ipsec.confのように実行されると ファイルからコマンドを読み込む.以下は妥当な /etc/ipsec.confを リストする. #!/usr/sbin/setkey -f # 192.168.1.100用の設定 # SADとSPDをフラッシュする flush; spdflush; # 注意: 以下の鍵はテスト用だけにしなさい! # 自分の鍵を生成せよ. # AH SAは128ビット長の鍵を用いる add 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md5 \ 0xc0291ff014dccdd03874d9e8e4cdf3e6; add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md5 \ 0x96358c90783bbfa3d7b196ceabe0536b; # ESP SAは192ビット(168ビット + 24パリティ)長の鍵を用いる. add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc \ 0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831; add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc \ 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df; # SP(セキュリティポリシー) spdadd 192.168.1.100 192.168.2.100 any -P out ipsec esp/transport//require ah/transport//require; spdadd 192.168.2.100 192.168.1.100 any -P in ipsec esp/transport//require ah/transport//require; テスト目的以外に手動鍵接続を利用する場合,このスクリプトにある 鍵を変えて下さい.例えば以下のように自分の鍵を生成できる: $ # 128ビット長の鍵 $ dd if=/dev/random count=16 bs=1| xxd -ps 読み込んだブロック数は 16+0 書き込んだブロック数は 16+0 cd0456eff95c5529ea9e918043e19cbe $ # 192ビット長の鍵 $ dd if=/dev/random count=24 bs=1| xxd -ps 読み込んだブロック数は 24+0 書き込んだブロック数は 24+0 9d6c4a8275ab12fbfdcaf01f0ba9dcfb5f424c878e97f888 鍵を生成する際に,ランダムな鍵が生成されることを保証するデバイス /dev/random を使って下さい. このスクリプトはまずSADをSPDをフラッシュする.その次にAH SAと ESP SAを作成する.コマンドaddはSAをSADに追加する.発信元,目的地 IPアドレス,IPsecプロトコル(AH), SPI (0x200)とアルゴリズムが 必要である.認証アルゴリズムは-Aで指定する(暗号化は-E,圧縮は-C; IP圧縮はまだサポートされていない).アルゴリズムの次は鍵を指定 する必要がある.鍵は"ASCII"のような文字列か,0xで始まる16進数で 指定できる. LinuxはAHとESPのために以下のアルゴリズムをサポートしている: hmac-md5とhmac-sha,des-cbcと3des-cbc.まもなく次のアルゴリズムも サポートされるようになるだろう:simple(暗号化なし),blowfish-cbc, aes-cbc,hmac-sha2-256及びhmac-sha512. spdaddは,SPをSPDに追加する.これらのSPはどんなパケットをIPsecで 保護するのか,どんなプロトコルと鍵を使うのかを定義する.この コマンドは,保護したいパケットの発信元と目的地のIPアドレス, (任意の)保護したいプロトコル(とポート)及び用いるポリシー(-P)を 必要としている.ポリシーは方向(in/out=入/出),適用する動作 (ipsec/discard/none=ipsec/破棄/何もしない),プロトコル(ah/esp/ipcomp), モード(transport=トランスポート)とレベル(use/require=使う/必須)を 指定する. 設定ファイルはIPsec通信を行なうピア両側に作る必要がある.上記の リストは修正無にピア192.168.1.100上で動くが,ピア192.168.2.100 ではパケットの方向に応じて多少修正が必要.一番簡単な方法は,SPの 方向を入れ換えるのである:-P inを-P outで,またその逆も置き換える. 次のリストでそれを示す. #!/usr/sbin/setkey -f # 192.168.2.100用設定 # SADとSPDをフラッシュする flush; spdflush; # 注意: 以下の鍵はテスト用だけにしなさい! # 自分の鍵を生成せよ. # AH SAは128ビット長の鍵を用いる add 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md5 \ 0xc0291ff014dccdd03874d9e8e4cdf3e6; add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md5 \ 0x96358c90783bbfa3d7b196ceabe0536b; # ESP SAは192ビット(168ビット + 24パリティ)長の鍵を用いる. add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc \ 0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831; add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc \ 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df; # SP(セキュリティポリシー) spdadd 192.168.1.100 192.168.2.100 any -P in ipsec esp/transport//require ah/transport//require; spdadd 192.168.2.100 192.168.1.100 any -P out ipsec esp/transport//require ah/transport//require; 作成が終ったら,設定ファイルは setkey -f /etc/ipsec.conf で ロードできる.成功したロードがSADとSPDを表示することで確認できる. # setkey -D # setkey -DP 確立は図4に示しているような感じ. ------------------------ | IP | AH | ESP | ICMP | ---- ------------------------ ---- | | ---------------------------- | | ---- ---- 192.168.1.100 192.168.2.100 図4.AHとESPを用いたトランスポートモード状態のマシン この時ピアからpingをやると,トラフィックが暗号化されtcpdumpの 出力は次のようなパケットになる: 12:45:39.373005 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x1): ESP(spi=0x00000201,seq=0x1) (DF) 12:45:39.448636 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x1): ESP(spi=0x00000301,seq=0x1) 12:45:40.542430 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x2): ESP(spi=0x00000201,seq=0x2) (DF) 12:45:40.569414 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x2): ESP(spi=0x00000301,seq=0x2) トンネルモード トンネルモードは,二つのピアがゲートウェイとしてIPsecを用いて ネットワーク間通信を保護する際に使われる.オリジナルのIPパケットは 片方のゲートウェイで暗号とカプセル化された後,もう一方のピアに 送信される.そのピアはカプセル化されたパケットを復元し,さらに オリジナルの保護なしのパケットを処理する. 図5.二つのピアがネットワーク間通信を保護する. トンネルモードにおけるSAとポリシーの設定はトランスポートモード 時のと似ている.以下にリストする: #!/usr/sbin/setkey -f # SADとSPDをフラッシュする flush; spdflush; # ESP SAは,暗号化のために192ビット(168 + 24パリティ)長の鍵を用いるが, # 認証のためには128ビット長の鍵を用いる add 192.168.1.100 192.168.2.100 esp 0x201 -m tunnel -E 3des-cbc \ 0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831 \ -A hmac-md5 0xc0291ff014dccdd03874d9e8e4cdf3e6; add 192.168.2.100 192.168.1.100 esp 0x301 -m tunnel -E 3des-cbc \ 0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df \ -A hmac-md5 0x96358c90783bbfa3d7b196ceabe0536b; # SP(セキュリティポリシー) spdadd 172.16.1.0/24 172.16.2.0/24 any -P out ipsec esp/tunnel/192.168.1.100-192.168.2.100/require; spdadd 172.16.2.0/24 172.16.1.0/24 any -P in ipsec esp/tunnel/192.168.2.100-192.168.1.100/require; この例はESPプロトコルだけを用いた.ESPプロトコルは整合性と機密性を 保証できる.この場合はESPアルゴリズムの順番が重要である.まず 暗号化アルゴリズムと鍵,その次に認証アルゴリズムと鍵を定義する 必要がある. BSDのIPsec実装と対照に,LinuxのSAはトランスポートモードとトンネル モードのどれか一つにのみ利用できる.トランスポートモードが デフォールトである.従ってトンネルモードがほしい場合,SAが -m tunnelで定義されることが必要である. 今度は,SPが保護するネットワークのIPアドレスを指定する.これらの 発信元と目的地IPアドレスを使用するパケットはIPsecで保護されるはず. トンネルモードを利用する際に,SPはtunnelと実際に保護を行なう通信 同士のIPアドレスを指定する必要がある.この情報は適切なIPsec SAを 見つけ出すのに必要である. racoonを用いる自動鍵接続 KAME IKEデーモンracoonもLinuxに移植された.このデーモンは自動鍵 IPsec接続を確立できる.racoonはPSK(事前共有鍵),X.509証明書及び Kerborosに基づく認証をサポートしている.このデーモンはIKE第一 段階においてメインモード,アグレシブモードとベースモードを利用 することができる.この章はメインモードでPSKとX.509証明書(ToDo: Kerboros)を用いる場合のracoonの設定を見せる.最後にロードウォリア (訳注:モバイルユーザ)の設定について簡単に説明する. PSK(事前共有鍵) racoonで認証を行なうもっと簡単な方法はPSK.鍵は/etc/psk.txtに 定義する必要がある.このファイルを特権なしの一般ユーザが読めない ようにして下さい(chmod 400 /etc/psk.txt).ファイル構文は以下の ようになっている: # IPv4アドレス 192.168.2.100 simple psk 5.0.0.1 0xe10bd52b0529b54aac97db63462850f3 # USER_FQDN ralf@spenneberg.net This is a psk for an email address # FQDN www.spenneberg.net This is a psk このファイルは列に編成される.第一列はPSKで認証するピアの 身分.第二列以後はPSKである. racoonの設定は直感的.典型的な/etc/racoon.conf設定ファイルを 以下に示す. path pre_shared_key "/etc/psk.txt"; remote 192.168.2.100 { exchange_mode main; proposal { encryption_algorithm 3des; hash_algorithm md5; authentication_method pre_shared_key; dh_group modp1024; } } sainfo address 172.16.1.0/24 any address 172.16.2.0/24 any { pfs_group modp768; encryption_algorithm 3des; authentication_algorithm hmac_md5; compression_algorithm deflate; } この設定ファイルはまずracoonが探すPSKの場所を定義する. その後に,ピア192.168.2.100とIKEネゴシエーション第一段階に 使われるパラメータを定義する.(その中の)第二段落はSA確立に 使えるパラメータを指定する.定義は,特定のIPアドレスまたは 汎用(IPアドレスの代わりにanonymousを使う)に対して行なうことが できる.ここで(訳注:sainfo),SAに使う暗号化,認証と圧縮 アルゴリズムを定義している.以上の三つはracoon起動時のエラーを なくすのに定義される必要がある. IKEデーモンracoonは起動時にすぐトンネルネゴシエーションを 行なわない.トンネルが必要となるまで待つのである.これが 機能するのに,カーネルはいつracoonに通知するかを知る必要が ある.そのため,管理者が適切なSAのないSPを定義する必要が ある.Linuxカーネルは,SPに従ってパケットを保護しようと するが,SAがない場合,racoonを呼び出して必要なSAを取得する. RacoonがIKEネゴシエーションを行ない,完了したらSAを作成する. それでLinuxカーネルがパケットを送信できるようになる. 目的達成のための192.168.1.100のポリシーを以下に示す. #!/usr/sbin/setkey -f # # SADとSPDをフラッシュする flush; spdflush; # racoonのためのポリシーを作る spdadd 172.16.1.0/24 172.16.2.0/24 any -P out ipsec esp/tunnel/192.168.1.100-192.168.2.100/require; spdadd 172.16.2.0/24 172.16.1.0/24 any -P in ipsec esp/tunnel/192.168.2.100-192.168.1.100/require; これらのポリシーがsetkey -f /etc/ipsec.confによってロード されたら,racoonを起動していい.テストのため,racoonを racoon -F -c /etc/racoon.confのように起動させて下さい. 繰りかえしになるが,もう一方のピアにおいては,異なる方向の ため設定を変える必要がある./etc/psk.txt,/etc/ipsec.conf と/etc/racoon.confにあるIPアドレスを入れ換える必要がある. トンネルの初期化は次のログで見ることができる. 2003-02-21 18:11:17: INFO: main.c:170:main(): @(#)racoon 20001216 20001216 sakane@kame.net 2003-02-21 18:11:17: INFO: main.c:171:main(): @(#)This product linked Open SSL 0.9.6b [engine] 9 Jul 2001 (http://www.openssl.org/) 2003-02-21 18:11:17: INFO: isakmp.c:1365:isakmp_open(): 127.0.0.1[500] use d as isakmp port (fd=7) 2003-02-21 18:11:17: INFO: isakmp.c:1365:isakmp_open(): 192.168.1.100[500] used as isakmp port (fd=9) 2003-02-21 18:11:37: INFO: isakmp.c:1689:isakmp_post_acquire(): IPsec-SA r equest for 192.168.2.100 queued due to no phase1 found. 2003-02-21 18:11:37: INFO: isakmp.c:794:isakmp_ph1begin_i(): initiate new phase 1 negotiation: 192.168.1.100[500]<=>192.168.2.100[500] 2003-02-21 18:11:37: INFO: isakmp.c:799:isakmp_ph1begin_i(): begin Identit y Protection mode. 2003-02-21 18:11:37: INFO: vendorid.c:128:check_vendorid(): received Vendor ID: KAME/racoon 2003-02-21 18:11:37: INFO: vendorid.c:128:check_vendorid(): received Vendor ID: KAME/racoon 2003-02-21 18:11:38: INFO: isakmp.c:2417:log_ph1established(): ISAKMP-SA es tablished 192.168.1.100[500]-192.168.2.100[500] spi:6a01ea039be7bac2:bd288f f60eed54d0 2003-02-21 18:11:39: INFO: isakmp.c:938:isakmp_ph2begin_i(): initiate new p hase 2 negotiation: 192.168.1.100[0]<=>192.168.2.100[0] 2003-02-21 18:11:39: INFO: pfkey.c:1106:pk_recvupdate(): IPsec-SA establish ed: ESP/Tunnel 192.168.2.100->192.168.1.100 spi=68291959(0x4120d77) 2003-02-21 18:11:39: INFO: pfkey.c:1318:pk_recvadd(): IPsec-SA established: ESP/Tunnel 192.168.1.100->192.168.2.100 spi=223693870(0xd554c2e) X.509証明書 Racoonは認証のためX.509証明書をサポートしている.証明書はCA (certificate authority,認証局)に対してチェックできる.設定は PSK設定と似ていて,認証部分だけが異なる. path certificate "/etc/certs"; remote 192.168.2.100 { exchange_mode main; certificate_type x509 "my_certificate.pem" "my_private_key.pem"; verify_cert on; my_identifier asn1dn; peers_identifier asn1dn; proposal { encryption_algorithm 3des; hash_algorithm md5; authentication_method rsasig; dh_group modp1024; } } sainfo address 172.16.1.0/24 any address 172.16.2.0/24 any { pfs_group modp768; encryption_algorithm 3des; authentication_algorithm hmac_md5; compression_algorithm deflate; } 証明書秘密鍵は証明書パス/etc/certsの下に保管される.このパスは 設定ファイルの path certificate オプションで指定する.証明書と 証明書廃止リストは,opensslで生成できるPEMフォーマットで保存 される.証明書の生成については章「X.509証明書」を参照すること. ピアの証明書をCAに対してチェックする場合(verify_cert on;は デフォールト),CAの証明書も同じディレクトリに置く必要がある. この証明書は,OpenSSLで見つけるようにするために,ハッシュした 名前に変えるか,リンクを作る必要がある. ln -s CAfile.pem `openssl x509 -noout -hash < CAfile.pem`.0 もし,証明書をさらにCRL(certificate revocation file,証明書 廃止ファイル)に対してチェックするなら,CRLも同じディレクトリに 置く必要ある.同様にリンクしたハッシュ名前も: ln -s CRLfile.pem `openssl x509 -noout -hash < CAfile.pem`.r0 証明書と秘密鍵を保存する際に,racoonが秘密鍵を解読できない ことに注意して下さい.そのため秘密鍵は平文で保存する必要が ある.暗号化秘密鍵を生成した場合は,解読する必要がある. # openssl rsa -in my_private_key.pem -out my_private_key.pem read RSA key Enter PEM pass phrase: password writing RSA key ロードウォリア(roadwarrior,出張者,モバイルユーザなど) ロードウォリアは未知の動的IPアドレスからVPNゲートウェイに 接続するクライアントである.これがracoonと併用する時に二つの 問題を引き起こす: IPアドレスが未知なのでracoonの設定ファイルや/etc/psk.txt ファイルに指定することができない.クライアントの身元を 確認する別の方法が必要である.PSKを用いる場合は,アグレシブ モードが必要になる! 最善な方法はX.509証明書の利用であるが. 目的地IPアドレスが知らないから,racoon用のSPを作成できない. racoonが接続開始時にSPもSAも生成する必要がある. そのため,設定ファイル/etc/racoon.confはいくつかの修正が必要. path certificate "/etc/certs"; remote anonymous { exchange_mode main; generate_policy on; passive on; certificate_type x509 "my_certificate.pem" "my_private_key.pem"; my_identifier asn1dn; peers_identifier asn1dn; proposal { encryption_algorithm 3des; hash_algorithm md5; authentication_method rsasig; dh_group modp1024; } } sainfo anonymous { pfs_group modp1024; encryption_algorithm 3des; authentication_algorithm hmac_md5; compression_algorithm deflate; } オプションgenerate_policy onがracoonに新接続の開始時に適切な ポリシーを生成するよう指示する.オプションpassive onはracoonに 外部からの新接続を待って受動状態を維持するよう指示する. racoonは(訳注:能動的に)接続をしない. しかし,最も重要な変化はremoteとsainfo行のanonymous定義である. これがracoonにどこからの接続も受け付けるよう指示する. Linuxカーネル2.5/2.6,OpenBSD isakmpd篇 Thomas WalpuskiはOpenBSD OSのIKEデーモンをLinuxに移植した (http://bender.thinknerd.de/~thomas/IPsec/isakmpd-linux.html). IPsec VPNを構築するisakmpdは現在Linuxカーネル2.5.47+と2.6.*で 利用可能となっている.本章はisakmpdのインストールと設定を説明する. インストール RPMベースのディストリビューションまたはDebianを使用しているなら 適切なパッケージツールでインストールできる.著者は,Linux カーネル2.6.0用isakmpdのRPMパッケージをコンパイルした (http://www.spenneberg.org/VPN/Kernel-2_6_IPsec).注意して ほしいのは,このパッケージは(訳注:Linuxカーネルの)テスト バージョンで動かないかもしれない.なぜならカーネルのABIが 数回変えられたから.Debianプロジェクトにパッケージを収録して いる.それが apt-get install isakmpd でインストールできる. ソースからインストールする際に,X.509証明書を使う予定なら, keynoteパッケージが必要となる (http://www1.cs.columbia.edu/~angelos/keynote.html).そのほか, Linuxカーネル2.5.47+または2.6.xも必要である. isakmpdのソースを入手するには,Thomas Walpuskiのウェブページに 書いてある手順に従って下さい.その後,GNUmakefileを必要に 応じて編集し,OS=linuxの行を有効にする.Linuxカーネルが /usr/src/linux以外の場所に保管している場合は,さらにファイル sysdep/linux/GNUmakefile.sysdepを修正する必要がある. コンパイルはコマンド make で行なうことができる. isakmpdにさらに二つのコマンド,keyconvとcertpatch,が附属 されている.これらのツールはappsサブディレクトリーにあり, 手動でコンパイルできる(私のRPMパッケージに含まれている). certpatchは既存の証明書にSubjectAltNameを追加することができる. 一方keyconvはDNSSECをopenssl鍵,またその逆に変換できる. 私は次のようにコンパイルできた(あなたのmileageが違うかも): gcc -DMP_FLAVOUR=MP_FLAVOUR_GMP -I../.. -I../../sysdep/linux -I /usr/src/linux-2.6.0 -lcrypto -lgmp certpatch.c -o certpatch gcc -I../.. -I../../sysdep/linux -I /usr/src/linux-2.6.0 -lcrypto -lgmp base64.c keyconv.c -o keyconv 最後の警告:すべてのmanページがLatin1フォーマットである. Red Hat 9では読めない.読むためには変換する必要がある (RPMパッケージは変換済):iconv --from-code LATIN1 --to-code UTF-8 --output isakmpd2.8 isakmpd.8 isakmpdがコンパイル済となったら,必須ディレクトリー構造を作る: mkdir /etc/isakmpd mkdir /etc/isakmpd/ca mkdir /etc/isakmpd/certs mkdir /etc/isakmpd/keynote mkdir /etc/isakmpd/crls mkdir /etc/isakmpd/private mkdir /etc/isakmpd/pubkeys PSK(事前共有鍵)を用いる isakmpdは設定ファイル一つとポリシーファイル一つを利用する.すなわち, /etc/isakmpd/isakmpd.confと/etc/isakmpd/isakmpd.policyである.設定 ファイルはよく知られている所謂.INIスタイルになっている.各セクションは 次のような一行から始まる: [section] セクション内に,タグに値を与えることができる. tag=value 値が一行よりも長い場合は,バックスラッシュで複数行で記述することが できる.コメントはハッシュ記号 # を使ってどこにでも置くことができる. さて,認証のため事前共有秘密を用いる簡単な設定を見てみよう.構成は 図5を参照するとよい. [General] Listen-on= 192.168.1.100 [Phase 1] 192.168.2.100= ISAKMP-peer-west [Phase 2] Connections= IPsec-east-west [ISAKMP-peer-west] Phase= 1 Local-address= 192.168.1.100 Address= 192.168.2.100 Authentication= ThisIsThePassphrase [IPsec-east-west] Phase= 2 ISAKMP-peer= ISAKMP-peer-west Configuration= Default-quick-mode Local-ID= Net-east Remote-ID= Net-west [Net-west] ID-type= IPV4_ADDR_SUBNET Network= 172.16.2.0 Netmask= 255.255.255.0 [Net-east] ID-type= IPV4_ADDR_SUBNET Network= 172.16.1.0 Netmask= 255.255.255.0 [Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-3DES-MD5-PFS-SUITE この設定ファイルはゲートウェイ192.168.1.100と192.168.2.100間の トンネルを記述している.このトンネルは172.16.1.0/24と 172.16.2.0/24で利用できる.上記の設定ファイルはゲートウェイ 192.168.1.100用である. 各セクションを見てみよう.最初のセクション[General]は一般的 設定を記述する.ここではisakmpdが起動時に特定のIPアドレスに バインド(bind)するかを定義する.これは,特にVPNゲートウェイが 複数のIPアドレスを持っている場合に推奨される. セクション[Phase 1] (訳注:第一段階)は,IPアドレス192.168.2.100の ピアがどの設定を使うのかを記述する.ピアのIPアドレスが未知 の場合(ロードウォリアー),代わりにデフォールトを使うとよい. セクション[Phase 2]は,第一段階の認証が成立した後生成される トンネルを記述する.isakmpdが主動的に接続するのをさせない 場合,代わりにPassive-connectionsを用いる. それでセクションPhase 1とPhase 2で引用した名前を定義する必要が ある.まずISAKMP-peer-westを定義しよう.この定義はPhase 1で 使われ,Local-addressと遠隔のAddressが分っている.遠隔の アドレスが知らない場合は,Addressタグを取り除くだけでよい. Authenticationについては平文のPSKで記述する必要がある. 次にトンネルIPsec-east-westが定義されている.これがPhase 2で 使われ,ISAKMP-peer ISAKMP-peer-westとの間に確立される. 接続の設定(Configuration),さらにトンネル用のID(Local-IPと Remote-ID)もここで定義したい. これらのIDはまた引用されるので,定義する必要がある.ID-typeは IPV4_ADDR,IPV6_ADDR,IPV4_ADDR_SUBNETとIPV6_ADDR_SUBNETの どれかになる. 最後--重要じゃないではない--に,トンネルを記述際に使った quick-modeの設定行なう.DOI(デフォールトIPSEC),EXCHANGE_TYPE (デフォールトQUICK_MODE)とSuitesを定義する.これが QuickMode-Encapsulated-Security-Payload-3DES-Encryption-MD5-HMAC-Perfect-Forward-Secrecy という.コンマ区切りで複数のsuiteを定義することができる. 利用可能の変形(transform)やsuiteについて,manページを参照すること. isakmpd.policyファイルは結構短い.以下例を示す: KeyNote-Version: 2 Authorizer: "POLICY" Licensees: "passphrase:ThisIsThePassphrase" Conditions: app_domain == "IPsec policy" && esp_present == "yes" && esp_enc_alg == "3des" && esp_auth_alg == "hmac-md5" -> "true"; テストのため,isakmpdを次のように起動する. isakmpd -d -4 -DA=90 これがisakmpdをバックグランド実行(-d),IPv4(-4),デバッグ レベル90で起動する. 接続が起動できたら片方のサブネットからもう一方のサブネットへ pingができるはず.もしipsec-toolsもインストールしていたら, コマンドsetkeyでisakmpdによって追加されたポリシーとSAを見る ことができる.バックグランド実行のisakmpdをctrl-cでkillしても SADとSPDがフラッシュされないので,コマンドsetkeyで手動で やる必要がある.しかしkill -TERMでisakmpdを止めると,SADと SPDがフラッシュされるのだ! X.509証明書の利用 isakmpdは認証のためX.509証明書を用いることができる.いつもの ツールで自分の証明書をマシン毎に生成し,VPNに参加し,次の ファイルを作ればよい: - /etc/isakmpd/private/local.key .pem形式マシンプライベート鍵. 600パーミッションに設定すること. - /etc/issakmpd/ca/ca.crt 信用するCAの証明書. - /etc/isakmpd/certs/ip-address.cert ローカルマシンの証明書. isakmpdに見つけられ利用されるには,証明書がSubjectAltNameを 含む必要がある.このX.509v3拡張は,証明書を生成する際に定義 することができるが,後でコマンドcertpatchを使って生成する こともできる.このコマンドはCAのプライベート鍵が必要である. 証明書を取りだし,拡張を付加し,もう一度署名することを行なう. certpatch -i ip-address -k ca.key originalcert.crt newcert.crt Certpatchは証明書にIPアドレス,FQDNまたはUFQDNを追加できる. これらのファイルを適切のフォルダに保存し適切なパーミッションに 設定できたら,設定とポリシファイルを作る.設定ファイルには, Authentication行を取り除き,セクションISAKMP-peer-westに 一行 ID=East を追加する.そしてEastを定義する.さらにX.509 証明書のディレクトリーを指定する必要がある.完全な設定ファイルが 以下の通り. [General] Listen-on= 192.168.1.100 [Phase 1] 192.168.2.100= ISAKMP-peer-west [Phase 2] Connections= IPsec-east-west [ISAKMP-peer-west] Phase= 1 Local-address= 192.168.1.100 Address= 192.168.2.100 ID= East [East] ID-type= IPV4_ADDR Address= 192.168.1.100 [IPsec-east-west] Phase= 2 ISAKMP-peer= ISAKMP-peer-west Configuration= Default-quick-mode Local-ID= Net-east Remote-ID= Net-west [Net-west] ID-type= IPV4_ADDR_SUBNET Network= 172.16.1.0 Netmask= 255.255.255.0 [Net-east] ID-type= IPV4_ADDR_SUBNET Network= 172.16..2.0 Netmask= 255.255.255.0 [Default-quick-mode] DOI= IPSEC EXCHANGE_TYPE= QUICK_MODE Suites= QM-ESP-3DES-MD5-PFS-SUITE [X509-certificates] CA-directory= /etc/isakmpd/ca/ Cert-directory= /etc/isakmpd/certs/ Private-key= /etc/isakmpd/private/local.key ポリシーファイルも修正する必要がある.信頼できるCAから サインされた証明書を持つピアからのみに対して許可を出すから, Authorizer行の後に以下に示す一行を追加する.完全なポリシー ファイルは以下の通り. KeyNote-Version: 2 Authorizer: "POLICY" Licensees: "DN:/C=DE/ST=NRW/L=Steinfurt/O=Spenneberg.Com/OU=VPN/CN=RootCA" Conditions: app_domain == "IPsec policy" && esp_present == "yes" && esp_enc_alg == "3des" && esp_auth_alg == "hmac-md5" -> "true"; DN:後のテキストはCA証明書のsubject行と一致する必要がある. openssl x509 -in ca/ca.crt -noout -subject これでisakmpdを起動して設定をテストできるようになる. Linuxカーネル2.6でFreeS/WANを利用 ToDo(来週 ;-) X.509証明書の生成 現在ほとんどのVPN実装は,ピア認証のためX.509証明書を利用 することが可能になっている.証明書は,HTTPプロトコルSSL (Secure Socket Layer)実装に使われているのと同じ. この章は簡単にこの証明書の生成を説明する. OpenSSL利用 Linux上でX.509証明書を生成するのに一番簡単な方法は,コマンド opensslとその補助ツールである.通常opensslパッケージが インストールされたら,補助コマンドCAと/またはCA.plも インストールされる.このコマンドで証明書を生成してみよう. まずコマンドがインストールされているかどうかを確認しよう. pathに入っていないことがよくある! Red Hat Linuxの場合, /usr/share/ssl/misc/CAになる. では,自分の認証局を生成しよう. $ mkdir certs $ cd certs $ /usr/share/ssl/misc/CA -newca CA certificate filename (or enter to create) Making CA certificate ... Using configuration from /usr/share/ssl/openssl.cnf Generating a 1024 bit RSA private key ................++++++ ..............++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase: capassword Verifying password - Enter PEM pass phrase: capassword ----- 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) [DE]: State or Province Name (full name) [NRW]: Locality Name (eg, city) [Steinfurt]: Organization Name (eg, company) [Spenneberg.com]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:RootCA 2003 Email Address []:ralf@spenneberg.net 国名など質問されたら適切の値を入力して下さい.適切の値を 提示してもらう(上記私の場合がそうである)には,ファイル openssl.cnfを編集するとよい.Red Hat Linuxシステムでは, このファイルは通常/usr/share/ssl/openssl.cnfとなる. 生成された認証局は一年のみ有効となっている.自分の認証局の 有効期間をもっと長くしたい場は合しばしばあるが,後程生成する 証明書が一般に短い有効期間となるため,openssl.cnfを編集 するのは実用ではない.代わりに手動で有効期間を編集する: $ cd demoCA/ $ openssl x509 -in cacert.pem -days 3650 -out cacert.pem -signkey ./private/cakey.pem Getting Private key Enter PEM pass phrase: capassword $ cd .. これで認証局の準備が完了.証明書署名要求(certificate signing request)を生成しよう. $ /usr/share/ssl/misc/CA -newreq Using configuration from /usr/share/ssl/openssl.cnf Generating a 1024 bit RSA private key ...............................++++++ ...................................++++++ writing new private key to 'newreq.pem' Enter PEM pass phrase: certpassword Verifying password - Enter PEM pass phrase: certpassword ----- 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) [DE]: State or Province Name (full name) [NRW]: Locality Name (eg, city) [Steinfurt]: Organization Name (eg, company) [Spenneberg.com]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:VPN-Gateway Email Address []:ralf@spenneberg.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Request (and private key) is in newreq.pem ファイルnewreq.pemには証明書署名要求と暗号化したプライベート 鍵が入っている.このファイルは後でFreeS/WANまたはRacoonの プライベート鍵として使われる.この要求が生成されれば,CAを 用いて署名することができる. $ /usr/share/ssl/misc/CA -sign Using configuration from /usr/share/ssl/openssl.cnf Enter PEM pass phrase: capassword Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows countryName :PRINTABLE:'DE' stateOrProvinceName :PRINTABLE:'NRW' localityName :PRINTABLE:'Steinfurt' organizationName :PRINTABLE:'Spenneberg.com' commonName :PRINTABLE:'VPN-Gateway' emailAddress :IA5STRING:'ralf@spenneberg.net' Certificate is to be certified until Apr 29 06:08:56 2004 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated コマンドCAのバージョンによって,証明書は標準出力に 出力されるかもしれない.そして次の証明書に似ているはず. Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=DE, ST=NRW, L=Steinfurt, O=Spenneberg.com, CN=RootCA 2003/Email=ralf@spenneberg.net Validity Not Before: Apr 30 06:08:56 2003 GMT Not After : Apr 29 06:08:56 2004 GMT Subject: C=DE, ST=NRW, L=Steinfurt, O=Spenneberg.com, CN=VPN-Gateway/Email=ralf@spenneberg.net Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:c5:3b:9c:36:3a:19:6c:a9:f2:ba:e9:d2:ed:84: 33:36:48:07:b2:a3:2d:59:92:b0:86:4c:81:2c:ea: 5c:ed:f3:ba:eb:17:4e:b3:3a:cc:b7:5b:5d:ca:b3: 04:ed:fb:59:3c:c5:25:3e:f3:ff:b0:22:10:fb:de: 72:0a:ee:42:4b:9a:d3:27:d3:b6:fb:e9:88:10:c8: 47:b7:26:4f:71:40:e4:75:c4:c0:ee:6b:87:b8:6f: c9:5e:66:cf:bb:e7:ad:72:68:b8:6d:fd:8f:4c:1f: 3a:a2:0d:43:25:06:b9:92:e7:20:6c:86:15:a0:eb: 7f:f7:0b:9a:99:5d:14:88:9b Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: CB:5C:19:9B:E6:8A:8A:FE:0E:C4:FD:5E:DF:F7:BF:3D:A8: 18:7C:08 X509v3 Authority Key Identifier: keyid:01:BB:C6:33:BE:F5:9A:5E:B0:0C:5D:BD:41:E9:78: 6C:54:AD:66:8E DirName:/C=DE/ST=NRW/L=Steinfurt/O=Spenneberg.com/ CN=RootCA 2003/Email=ralf@spenneberg.net serial:00 Signature Algorithm: md5WithRSAEncryption 6f:89:2b:95:af:f1:8d:4d:b7:df:e8:6d:f7:92:fb:48:8c:c4: 1a:43:68:65:97:01:87:a6:84:b5:a1:38:bd:62:74:70:db:9e: 78:19:d9:0c:af:18:ad:13:77:56:7d:3f:19:61:da:ba:74:30: 8e:c5:50:0e:e3:eb:ff:95:cd:8d:d6:7e:c3:0e:ab:5b:34:94: bc:16:0f:ef:dc:de:40:bb:7d:ba:a2:b8:5d:f9:74:e7:28:58: 75:a0:66:d2:8d:85:ba:38:82:08:10:33:ef:be:29:c9:31:9d: 63:a9:f7:e0:99:ea:a7:ed:b6:b5:33:1b:1c:4a:a4:05:40:6e: 40:7b -----BEGIN CERTIFICATE----- MIIDjDCCAvWgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBgjELMAkGA1UEBhMCREUx DDAKBgNVBAgTA05SVzESMBAGA1UEBxMJU3RlaW5mdXJ0MRcwFQYDVQQKEw5TcGVu bmViZXJnLmNvbTEUMBIGA1UEAxMLUm9vdENBIDIwMDMxIjAgBgkqhkiG9w0BCQEW E3JhbGZAc3Blbm5lYmVyZy5uZXQwHhcNMDMwNDMwMDYwODU2WhcNMDQwNDI5MDYw ODU2WjCBgjELMAkGA1UEBhMCREUxDDAKBgNVBAgTA05SVzESMBAGA1UEBxMJU3Rl aW5mdXJ0MRcwFQYDVQQKEw5TcGVubmViZXJnLmNvbTEUMBIGA1UEAxMLVlBOLUdh dGV3YXkxIjAgBgkqhkiG9w0BCQEWE3JhbGZAc3Blbm5lYmVyZy5uZXQwgZ8wDQYJ KoZIhvcNAQEBBQADgY0AMIGJAoGBAMU7nDY6GWyp8rrp0u2EMzZIB7KjLVmSsIZM gSzqXO3zuusXTrM6zLdbXcqzBO37WTzFJT7z/7AiEPvecgruQkua0yfTtvvpiBDI R7cmT3FA5HXEwO5rh7hvyV5mz7vnrXJouG39j0wfOqINQyUGuZLnIGyGFaDrf/cL mpldFIibAgMBAAGjggEOMIIBCjAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1P cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUy1wZm+aKiv4O xP1e3/e/PagYfAgwga8GA1UdIwSBpzCBpIAUAbvGM771ml6wDF29Qel4bFStZo6h gYikgYUwgYIxCzAJBgNVBAYTAkRFMQwwCgYDVQQIEwNOUlcxEjAQBgNVBAcTCVN0 ZWluZnVydDEXMBUGA1UEChMOU3Blbm5lYmVyZy5jb20xFDASBgNVBAMTC1Jvb3RD QSAyMDAzMSIwIAYJKoZIhvcNAQkBFhNyYWxmQHNwZW5uZWJlcmcubmV0ggEAMA0G CSqGSIb3DQEBBAUAA4GBAG+JK5Wv8Y1Nt9/obfeS+0iMxBpDaGWXAYemhLWhOL1i dHDbnngZ2QyvGK0Td1Z9Pxlh2rp0MI7FUA7j6/+VzY3WfsMOq1s0lLwWD+/c3kC7 fbqiuF35dOcoWHWgZtKNhbo4gggQM+++KckxnWOp9+CZ6qfttrUzGxxKpAVAbkB7 -----END CERTIFICATE----- Signed certificate is in newcert.pem ここでファイルnewreq.pemとnewcert.pemをもっと意味のあるものに 名前を変更することが賢明. $ mv newcert.pem vpngateway_cert.pem $ mv newreq.pem vpngateway_key.pem これでVPNの各ピアに証明書を生成してやることを楽しんで下さい. もしプライベート鍵が盗まれた,または怪しい場合,それを廃止 しなければならない.なぜならそれが有効期間内には有効である から.廃止した鍵はCRL(certificate revocation list,証明書 廃止リスト)に保存される.まず,(空)リストを作る: $ openssl ca -gencrl -out crl.pem Using configuration from /usr/share/ssl/openssl.cnf Enter PEM pass phrase: capassword 証明書を廃止するには,証明書ファイルが必要である.これも demoCA/newcerts/に保存されている.証明書の名前はdemoCA/index.txt から読み取れる.次は,次のコマンドを使う. $ openssl ca -revoke compromised_cert.pem Using configuration from /usr/share/ssl/openssl.cnf Enter PEM pass phrase: capassword Revoking Certificate 01. Data Base Updated 証明書が廃止されたら,上記のコマンドでCRLを再生成する 必要がある.