Catch up with the English version:

1.2   -> 1.8  	ipsec-must/article.sgml

Submitted by:	Shun SUZUKI <si006@ccm.gs.niigata-u.ac.jp>
Reviewed by:	SUGIMURA Takashi <sugimura@jp.FreeBSD.org>
References:	[doc-jp 8400]
This commit is contained in:
Hiroki Sato 2001-09-30 11:15:20 +00:00
parent ad04a286bb
commit f1f1b960ef
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=10852
2 changed files with 192 additions and 168 deletions
ja_JP.eucJP/articles

View file

@ -1,4 +1,4 @@
# $FreeBSD: doc/ja_JP.eucJP/articles/Makefile,v 1.6 2001/09/14 00:17:36 kuriyama Exp $
# $FreeBSD: doc/ja_JP.eucJP/articles/Makefile,v 1.7 2001/09/30 10:33:19 hrs Exp $
# Original revision: 1.18
#SUBDIR = committers-guide
@ -11,7 +11,7 @@ SUBDIR+= diskless-x
#SUBDIR+= freebsd-questions
#SUBDIR+= fonts
#SUBDIR+= formatting-media
#SUBDIR+= ipsec-must
SUBDIR+= ipsec-must
#SUBDIR+= laptop
#SUBDIR+= mh
SUBDIR+= multi-os

View file

@ -1,103 +1,138 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- The FreeBSD Documentation Project -->
<!-- The FreeBSD Japanese Documentation Project -->
<!-- $FreeBSD: doc/ja_JP.eucJP/articles/ipsec-must/article.sgml,v 1.1 2001/03/07 19:38:40 hrs Exp $ -->
<!-- Original revision: 1.2 -->
<!--
The FreeBSD Documentation Project
The FreeBSD Japanese Documentation Project
<html>
<head>
$FreeBSD$
Original revision: 1.8
-->
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
%man;
]>
<article>
<articleinfo>
<title>FreeBSD の IPSec 機能を独立検証するには</title>
</head>
<body text="#000000" bgcolor="#FFFFFF">
<h1>FreeBSD 3.0 における IPSec 機能を独立検証するには</h1>
<p align="center"><i>IPsec をインストールした時,
<author>
<firstname>David</firstname>
<surname>Honig</surname>
<affiliation>
<address><email>honig@sprynet.com</email></address>
</affiliation>
</author>
<pubdate>1999 年 5 月 3 日</pubdate>
<abstract>
<para>IPsec をインストールした時,
それがきちんと動作しているかどうか調べるにはどうしたら良いでしょう?
ここでは, IPsec の動作を検証する実験的な方法を紹介します.</i></p>
<h2>問題</h2>
<p>まず, <a href="#Installing IPsec"><i>IPsec</i>
がインストールされていること</a>を前提に話を進めます.
IPsec が<a href="#Caveat">きちんと動作している</a>かどうか知るにはどうしたら良いでしょう?
ここでは, IPsec の動作を検証する実験的な方法を紹介します.</para>
</abstract>
</articleinfo>
<sect1>
<title>問題</title>
<para>まず, <link linkend="ipsec-install"><emphasis>IPsec</emphasis>
がインストールされていること</link>を前提に話を進めます.
IPsec が<link linkend="caveat">きちんと動作している</link>かどうか知るにはどうしたら良いでしょう?
もちろん設定が間違っていればネットワーク接続が行なえないでしょうし,
接続できたということは設定が合っているからだ, という認識は間違っていません.
接続状態は <i>Netstat</i> コマンドで確かめることができます.
しかし, それを独立して検証することは可能なのでしょうか?</p>
<h2>解</h2>
<p>最初に, 暗号に使われている情報理論について考えます.</p>
<ol>
<li>
<p>暗号化されたデータは, 一様に分布している. つまり,
各情報源シンボルは最大のエントロピーを持っている.</p>
</li>
<li>
<p>通常, 未処理のデータや圧縮されていないデータは冗長である.
つまり, 各情報源シンボルのエントロピーは最大ではない.</p>
</li>
</ol>
<p>ネットワークインターフェイスを入出力するデータのエントロピーを測定できると仮定すると,
接続状態は &man.netstat.1; コマンドで確かめることができます.
しかし, それを独立して検証することは可能なのでしょうか?</para>
</sect1>
<sect1>
<title>解決方法</title>
<para>最初に, 暗号に使われている情報理論について考えます.</para>
<orderedlist>
<listitem>
<para>暗号化されたデータは, 一様に分布している. つまり,
各情報源シンボルは最大のエントロピーを持っている.</para>
</listitem>
<listitem>
<para>通常, 未処理のデータや圧縮されていないデータは冗長である.
つまり, 各情報源シンボルのエントロピーは最大ではない.</para>
</listitem>
</orderedlist>
<para>ネットワークインターフェイスを入出力するデータのエントロピーを測定できると仮定すると,
「暗号化されていないデータ」と「暗号化されたデータ」の両者に,
違いを見ることができるはずです.
このことは, パケットのルーティングが行なわれる場合の一番外側の IP ヘッダなど,
データの一部が「暗号化モード」で暗号化されなかったとしても成立します.</p>
<h4><a name="MUST"></a>MUST</h4>
<p>Ueli Maurer 氏の "Universal Statistical Test for Random Bit Generators"
("MUST") は, サンプルデータのエントロピーを高速に測定します.
これには圧縮と良く似たアルゴリズムが使われています.
<a href="#Maurer's Universal Statistical Test">
文末に示すのは, 一つのファイル中で連続するデータ (最大 0.25 メガバイト)
を測定するコードです.</a></p>
<h4><a NAME="Tcpdump"></a>Tcpdump</h4>
<p>さて次に, 上記に加えてネットワーク上の生データを捕捉するための手段も必要になります.
それを実現するプログラムに, "<i>tcpdump</i>" と呼ばれるものがあります.
ただし, tcpdump を使うには,
<a href="#usr/src/sys/i386/conf/KERNELNAME">カーネルコンフィグレーションファイル</a>において
bpf (<i>Berkeley Packet Filter</i>)
インターフェイスが有効化されていなければなりません.</p>
<p>次のコマンド</p>
データの一部が<quote>暗号化モード</quote>で暗号化されなかったとしても成立します.</para>
<blockquote><b>tcpdump</b> <b>-c</b> 4000 <b>-s</b> 10000 <b>-w</b>
<i>dumpfile.bin</i></blockquote>
<p>は, 4000 個の生パケットを捕捉し, <i>dumpfile.bin</i> に記録します.
この例のでは 10,000 バイト以下のパケットのみ記録されます.</p>
<h2>実験</h2>
<p>では, 実験してみましょう.
まず, IPsec ホストと IPsec
を使っていないホストの両方にネットワーク接続してください.</p>
<p>そして<a href="#Tcpdump">パケットの捕捉</a>を開始します.</p>
<p>次に, IPsec を使っている接続で "yes" という unix コマンドを実行します.
これは, "y" という文字の連続データを出力するものです.
<sect2 id="MUST">
<title>MUST</title>
<para>Ueli Maurer 氏の <quote>Universal Statistical Test for Random
Bit Generators</quote>
(<ulink url="http://www.geocities.com/SiliconValley/Code/4704/universal.pdf"><acronym>MUST</acronym></ulink>)
は, サンプルデータのエントロピーを高速に測定します.
これには圧縮と良く似たアルゴリズムが使われています.
<link linkend="code">文末に示すのは</link>,
一つのファイル中で連続するデータ (最大 0.25 メガバイト)
を測定するコードです.</para>
</sect2>
<sect2 id="tcpdump">
<title>Tcpdump</title>
<para>さて次に, 上記に加えてネットワーク上の生データを捕捉するための手段も必要になります.
それを実現するプログラムに, &man.tcpdump.1; と呼ばれるものがあります.
ただし, tcpdump を使うには,
<link linkend="kernel">カーネルコンフィグレーションファイル</link>において
<emphasis>Berkeley Packet Filter</emphasis>
インターフェイスが有効化されていなければなりません.</para>
<para>次のコマンド</para>
<screen><userinput><command>tcpdump</command> -c 4000 -s 10000 -w <replaceable>dumpfile.bin</replaceable></userinput></screen>
<para>は, 4000 個の生パケットを捕捉し, <replaceable>dumpfile.bin</replaceable> に記録します.
この例のでは 10,000 バイト以下のパケットのみ記録されます.</para>
</sect2>
</sect1>
<sect1>
<title>実験</title>
<para>では, 実験してみましょう.</para>
<procedure>
<step>
<para>IPsec ホストと IPsec
を使っていないホストの両方にネットワーク接続してください.</para>
</step>
<step>
<para>そして <link linkend="tcpdump">パケットの捕捉
</link>を開始します.</para>
</step>
<step>
<para>次に, <quote>IPsec を使っている</quote>接続で &man.yes.1; という unix コマンドを実行します.
これは, <literal>y</literal> という文字の連続データを出力するものです.
しばらくしたらコマンドを停止させ, IPsec
を使っていない接続に対して同じコマンドを実行します.
こちらも, しばらくしたらコマンドを停止させてください.</p>
<p>ここで, <a href="#Maurer's Universal Statistical Test">MUST</a>
を捕捉したパケットに実行すると, 次のような出力が得られるはずです.
こちらも, しばらくしたらコマンドを停止させてください.</para>
</step>
<step>
<para>ここで, <link linkend="code">MUST</link>
を捕捉したパケットに実行すると, 次のような出力が得られるはずです.
この中で重要なのは, 期待値 (7.18) に対して,
IPsec を使った接続が 93% (6.7),
通常の接続が 29% (2.1)
という結果になっていることです.</p>
<pre>% tcpdump -c 4000 -s 10000 -w ipsecdemo.bin
% uliscan ipsecdemo.bin
<quote>通常の</quote>接続が 29% (2.1)
という結果になっていることです.</para>
<screen>&prompt.user; <userinput>tcpdump -c 4000 -s 10000 -w <replaceable>ipsecdemo.bin</replaceable></userinput>
&prompt.user; <userinput>uliscan <replaceable>ipsecdemo.bin</replaceable></userinput>
Uliscan 21 Dec 98
L=8 256 258560
@ -109,81 +144,72 @@ Expected value for L=8 is 7.1836656
6.4100 ---------------------------------------------------
2.1101 -----------------
2.0838 -----------------
2.0983 -----------------</pre>
2.0983 -----------------</screen>
</step>
</procedure>
</sect1>
<h2><a NAME="Caveat"></a>注意</h2>
<p>この実験は暗号化の理論が示すとおり, IPsec
を使った通信では<i>確かに</i>ペイロード中のデータに含まれるシンボルの生起確率が<i>一様に</i>分布する,
<sect1 id="caveat">
<title>注意</title>
<para>この実験は暗号化の理論が示すとおり, IPsec
を使った通信では<emphasis>確かに</emphasis>ペイロード中のデータに含まれるシンボルの生起確率が<emphasis>一様に</emphasis>分布する,
ということを示しています.
しかし, ここで示した実験ではシステム上の欠陥 (あるのかどうか知りませんが)
を検出することは<i>できません</i>.
を検出することは<emphasis>できません</emphasis>.
ここで言う「欠陥」とは, たとえば暗号鍵生成や交換の不備や,
データや暗号鍵が他人に見られていないかどうかといった問題,
あるいはアルゴリズムの強度はどうか,
カーネルのバージョンは合っているかといったことです.
これらはソースを調べれば確かめることができます.</p>
<h2><a NAME="IPsec"></a>IPsec の定義</h2>
これらはソースを調べれば確かめることができます.</para>
</sect1>
<p>インターネットプロトコル セキュリティ拡張
<sect1 id="IPsec">
<title>IPsec の定義</title>
<para>インターネットプロトコル セキュリティ拡張
(Internet Protocol security extensions) は
IP v4 と IP v6 に適用され, IP v6 への実装は必須となっています.
このプロトコルは IP (ホスト間) レベルで暗号化と認証を実現するためのものです.
たとえば SSL は一つのアプリケーションソケット, SSH はログイン,
PGP は特定のファイルやメッセージのみに対してそれぞれ安全性を提供しますが,
IPsec は 2 ホスト間のすべての通信を暗号化します.</p>
たとえば SSL は一つのアプリケーションソケット, <application>SSH</application> はログイン,
<application>PGP</application> は特定のファイルやメッセージのみに対してそれぞれ安全性を提供しますが,
IPsec は 2 ホスト間のすべての通信を暗号化します.</para>
</sect1>
<sect1 id="ipsec-install">
<title>IPsec のインストール</title>
<para>FreeBSD の最近のバージョンでは
IPsec のサポートが基本のソースコードに含まれています.
それ故, あなたはおそらく
<option>IPSEC</option> オプションをカーネルコンフィグファイルに追加し,
カーネルを再構築/再インストールして &man.setkey.8; コマンドで
IPsec 接続を設定すればよいはずです.</para>
<para>FreeBSD で IPsec を実行する包括的なガイドは
<ulink url="../../books/handbook/ipsec.html">FreeBSD
ハンドブック</ulink>で提供されています.</para>
</sect1>
<sect1 id="kernel">
<title>src/sys/i386/conf/KERNELNAME</title>
<para>ネットワークデータを &man.tcpdump.1;
で補足するためにはカーネルコンフィグファイルには以下の行が必要です.
追加後 &man.config.8; を実行しカーネルの再構築/再インストールを
行なってください.</para>
<programlisting>device bpf</programlisting>
</sect1>
<sect1 id="code">
<title>Maurer's Universal Statistical Test (ブロックサイズ = 8 ビット)</title>
<h2><a NAME="Installing IPsec"></a>IPsec のインストール</h2>
<para>同一のコードを
<ulink url="http://www.geocities.com/SiliconValley/Code/4704/uliscanc.txt">
このリンク</ulink>から入手することができます.</para>
<p>ここでは FreeBSD 3.0 stable を想定しています.</p>
<ol>
<li>
<p>IPsec v0.04 をインストールして,
カーネル再構築とインストールを行なう.</p>
</li>
<li>
<p>管理用のツール (たとえば <i>ipsecadm</i>) を実行し,
暗号鍵を配布 (もしくは <i>Photuris</i> を使って鍵交換) する.</p>
</li>
<li>
<p>ネットワーク経路 (<i>rt</i>) を適切に設定する.</p>
</li>
</ol>
<p><i>ipsecadm</i> および <i>rt</i> を実行して
IPsec トンネルを確立するための "ipsec_setup"
スクリプトを作成しても良いでしょう.
スクリプトは, 起動時に <i>/etc/rc.local</i> から自動で実行させることができます.
ipsec_setup でトンネルを確立するには, 少なくとも 2 つの
<i>ipsecadm</i> コマンドと, 1 つの
<i>rt</i> コマンドが含まれている必要があるでしょう.</p>
<h2><a NAME="KERNELNAME"></a>usr/src/sys/i386/conf/KERNELNAME</h2>
<p>IPsec を実行するには,
カーネルコンフィグレーションファイルに以下の行が含まれていなければなりません.
これらの行を追加して <i>config</i> を実行し,
カーネルの再構築とインストールを行なってください.</p>
<pre># The `bpfilter' pseudo-device enables the Berkeley Packet Filter. Be
# aware of the legal and administrative consequences of enabling this
# option. Heh heh. The number of devices determines the maximum number of
# simultaneous BPF clients programs runnable.
pseudo-device bpfilter 2 #Berkeley packet filter
# IPSEC
options IPSEC
options "MD5"
pseudo-device enc 1</pre>
<h2><a name="Maurer's Universal Statistical Test"></a>Maurer's Universal Statistical Test
(ブロックサイズ = 8 ビット)</h2>
<pre><![ CDATA [/*
<programlisting>/*
ULISCAN.c ---blocksize of 8
1 Oct 98
@ -212,13 +238,13 @@ pseudo-device enc 1</pre>
*/
#define L 8
#define V (1<<L)
#define V (1&lt;&lt;L)
#define Q (10*V)
#define K (100 *Q)
#define MAXSAMP (Q + K)
#include <stdio.h>
#include <math.h>
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
int main(argc, argv)
int argc;
@ -236,7 +262,7 @@ char **argv;
printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP);
if (argc < 2) {
if (argc &lt; 2) {
printf("Usage: Uliscan filename\n");
exit(-1);
} else {
@ -250,11 +276,11 @@ char **argv;
exit(-1);
}
for (i = 0; i < V; i++) {
for (i = 0; i &lt; V; i++) {
table[i] = 0;
}
for (i = 0; i < Q; i++) {
for (i = 0; i &lt; Q; i++) {
b = fgetc(fptr);
table[b] = i;
}
@ -270,15 +296,15 @@ char **argv;
iproduct = 1;
if (run)
for (i = Q; run && i < Q + K; i++) {
for (i = Q; run && i &lt; Q + K; i++) {
j = i;
b = fgetc(fptr);
if (b < 0)
if (b &lt; 0)
run = 0;
if (run) {
if (table[b] > j)
if (table[b] &gt; j)
j += K;
sum += log((double)(j-table[b]));
@ -293,16 +319,16 @@ char **argv;
sum = (sum/((double)(i - Q))) / log(2.0);
printf("%4.4f ", sum);
for (i = 0; i < (int)(sum*8.0 + 0.50); i++)
for (i = 0; i &lt; (int)(sum*8.0 + 0.50); i++)
printf("-");
printf("\n");
/* refill initial table */
if (0) {
for (i = 0; i < Q; i++) {
for (i = 0; i &lt; Q; i++) {
b = fgetc(fptr);
if (b < 0) {
if (b &lt; 0) {
run = 0;
} else {
table[b] = i;
@ -310,8 +336,6 @@ char **argv;
}
}
}
}]]></pre>
</body>
</html>
}</programlisting>
</sect1>
</article>