aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/articles/ipsec-must/article.xml
blob: 0d4840e3696d8c656e17b8e9331fec22eceedc6b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
<?xml version="1.0" encoding="euc-jp" standalone="no"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V4.2-Based Extension//EN"
	"../../../share/xml/freebsd42.dtd" [
<!ENTITY % entities PUBLIC "-//FreeBSD//ENTITIES DocBook FreeBSD Entity Set//JA" "../../share/xml/entities.ent">
%entities;
]>

<!--
    The FreeBSD Documentation Project
    The FreeBSD Japanese Documentation Project

    $FreeBSD$
    Original revision: 1.15
-->

<article lang='ja'>
  <articleinfo>
    <title>FreeBSD の IPsec 機能を独立検証するには</title>

    <author>
      <firstname>David</firstname>
      <surname>Honig</surname>

      <affiliation>
        <address><email>honig@sprynet.com</email></address>
      </affiliation>
    </author>

    <pubdate>199953</pubdate>

    <legalnotice id="trademarks" role="trademarks">
      &tm-attrib.freebsd;
      &tm-attrib.opengroup;
      &tm-attrib.general;
    </legalnotice>

    <releaseinfo>$FreeBSD$</releaseinfo>

    <abstract>
      <para>IPsec をインストールした時、
        それがきちんと動作しているかどうか調べるにはどうしたら良いでしょう?
        ここでは、IPsec の動作を検証する実験的な方法を紹介します。</para>
    </abstract>
  </articleinfo>

  <sect1 id="problem">
    <title>問題</title>

    <para>まず、<link linkend="ipsec-install"><emphasis>IPsec</emphasis>
        がインストールされていること</link>を前提に話を進めます。
      IPsec が<link linkend="caveat">きちんと動作している</link>かどうか知るにはどうしたら良いでしょう?
      もちろん設定が間違っていればネットワーク接続が行なえないでしょうし、
      接続できたということは設定が合っているからだ、という認識は間違っていません。
      接続状態は &man.netstat.1; コマンドで確かめることができます。
      しかし、それを独立して検証することは可能なのでしょうか?</para>
  </sect1>

  <sect1 id="solution">
    <title>解決方法</title>

    <para>最初に、暗号に使われている情報理論について考えます。</para>

    <orderedlist>
      <listitem>
	<para>暗号化されたデータは、一様に分布している。つまり、
          各情報源シンボルは最大のエントロピーを持っている。</para>
      </listitem>

      <listitem>
	<para>通常、未処理のデータや圧縮されていないデータは冗長である。
          つまり、各情報源シンボルのエントロピーは最大ではない。</para>
      </listitem>
    </orderedlist>

    <para>ネットワークインターフェイスを入出力するデータのエントロピーを測定できると仮定すると、
      「暗号化されていないデータ」と「暗号化されたデータ」の両者に、
      違いを見ることができるはずです。
      このことは、パケットのルーティングが行なわれる場合の一番外側の IP ヘッダなど、
      データの一部が <quote>暗号化モード</quote> で暗号化されなかったとしても成立します。</para>

    <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 id="experiment">
    <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
      を使っていない接続に対して同じコマンドを実行します。
      こちらも、しばらくしたらコマンドを停止させてください。</para>
      </step>

      <step>
	<para>ここで、<link linkend="code">MUST</link>
	を捕捉したパケットに実行すると、次のような出力が得られるはずです。
      この中で重要なのは、期待値 (7.18) に対して、
      IPsec を使った接続が 93% (6.7)、
      <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
Measuring file ipsecdemo.bin
Init done
Expected value for L=8 is 7.1836656
6.9396 --------------------------------------------------------
6.6177 -----------------------------------------------------
6.4100 ---------------------------------------------------
2.1101 -----------------
2.0838 -----------------
2.0983 -----------------</screen>
      </step>
    </procedure>
  </sect1>

    <sect1 id="caveat">
      <title>注意</title>

    <para>この実験は暗号化の理論が示すとおり、IPsec
      を使った通信では<emphasis>確かに</emphasis>ペイロード中のデータに含まれるシンボルの生起確率が<emphasis>一様に</emphasis>分布する、
      ということを示しています。
      しかし、ここで示した実験ではシステム上の欠陥 (あるのかどうか知りませんが)
      を検出することは<emphasis>できません</emphasis>。
      ここで言う「欠陥」とは、たとえば暗号鍵生成や交換の不備や、
      データや暗号鍵が他人に見られていないかどうかといった問題、
      あるいはアルゴリズムの強度はどうか、
      カーネルのバージョンは合っているかといったことです。
      これらはソースを調べれば確かめることができます。</para>
  </sect1>

  <sect1 id="IPsec">
    <title>IPsec の定義</title>

    <para>インターネットプロトコル セキュリティ拡張
      (Internet Protocol security extensions) は
      IP v4 と IP v6 に適用され、IP v6 への実装は必須となっています。
      このプロトコルは IP (ホスト間) レベルで暗号化と認証を実現するためのものです。
      たとえば 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="&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>

    <para>同一のコードを
      <ulink url="http://www.geocities.com/SiliconValley/Code/4704/uliscanc.txt">
        このリンク</ulink>から入手することができます。</para>

<programlisting>/*
  ULISCAN.c   ---blocksize of 8

  1 Oct 98
  1 Dec 98
  21 Dec 98       uliscan.c derived from ueli8.c

  This version has // comments removed for Sun cc

  This implements Ueli M Maurer's "Universal Statistical Test for Random
  Bit Generators" using L=8

  Accepts a filename on the command line; writes its results, with other
  info, to stdout.

  Handles input file exhaustion gracefully.

  Ref: J. Cryptology v 5 no 2, 1992 pp 89-105
  also on the web somewhere, which is where I found it.

  -David Honig
  honig@sprynet.com

  Usage:
  ULISCAN filename
  outputs to stdout
*/

#define L 8
#define V (1&lt;&lt;L)
#define Q (10*V)
#define K (100   *Q)
#define MAXSAMP (Q + K)

#include &lt;stdio.h&gt;
#include &lt;math.h&gt;

int main(argc, argv)
int argc;
char **argv;
{
  FILE *fptr;
  int i,j;
  int b, c;
  int table[V];
  double sum = 0.0;
  int iproduct = 1;
  int run;

  extern double   log(/* double x */);

  printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP);

  if (argc &lt; 2) {
    printf("Usage: Uliscan filename\n");
    exit(-1);
  } else {
    printf("Measuring file %s\n", argv[1]);
  }

  fptr = fopen(argv[1],"rb");

  if (fptr == NULL) {
    printf("Can't find %s\n", argv[1]);
    exit(-1);
  }

  for (i = 0; i &lt; V; i++) {
    table[i] = 0;
  }

  for (i = 0; i &lt; Q; i++) {
    b = fgetc(fptr);
    table[b] = i;
  }

  printf("Init done\n");

  printf("Expected value for L=8 is 7.1836656\n");

  run = 1;

  while (run) {
    sum = 0.0;
    iproduct = 1;

    if (run)
      for (i = Q; run &amp;&amp; i &lt; Q + K; i++) {
        j = i;
        b = fgetc(fptr);

        if (b &lt; 0)
          run = 0;

        if (run) {
          if (table[b] &gt; j)
            j += K;

          sum += log((double)(j-table[b]));

          table[b] = i;
        }
      }

    if (!run)
      printf("Premature end of file; read %d blocks.\n", i - Q);

    sum = (sum/((double)(i - Q))) /  log(2.0);
    printf("%4.4f ", sum);

    for (i = 0; i &lt; (int)(sum*8.0 + 0.50); i++)
      printf("-");

    printf("\n");

    /* refill initial table */
    if (0) {
      for (i = 0; i &lt; Q; i++) {
        b = fgetc(fptr);
        if (b &lt; 0) {
          run = 0;
        } else {
          table[b] = i;
        }
      }
    }
  }
}</programlisting>
  </sect1>
</article>