b55bb8ba3f
+ cups/article.xml r43184 --> r46469 + explaining-bsd/article.xml r43184 --> r46457 + fonts/article.xml r43184 --> r46439 + freebsd-questions/article.xml r43184 --> r46431 + hubs/article.xml r43184 --> r46284 + mailing-list-faq/article.xml r43184 --> r46073 + new-users/article.xml r43184 --> r46448
355 lines
11 KiB
XML
355 lines
11 KiB
XML
<?xml version="1.0" encoding="koi8-r"?>
|
||
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
|
||
"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
|
||
<!--
|
||
The FreeBSD Russian Documentation Project
|
||
|
||
$FreeBSD$
|
||
$FreeBSDru: frdp/doc/ru_RU.KOI8-R/articles/ipsec-must/article.xml,v 1.7 2004/07/16 12:06:05 den Exp $
|
||
|
||
Original revision: r44703
|
||
-->
|
||
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="ru">
|
||
<info><title>Независимое исследование работы IPsec во FreeBSD</title>
|
||
|
||
|
||
<author><personname><firstname>David</firstname><surname>Honig</surname></personname><affiliation>
|
||
<address><email>honig@sprynet.com</email></address>
|
||
</affiliation></author>
|
||
|
||
<pubdate>1999-05-03</pubdate>
|
||
|
||
<legalnotice xml:id="trademarks" role="trademarks">
|
||
&tm-attrib.freebsd;
|
||
&tm-attrib.opengroup;
|
||
&tm-attrib.general;
|
||
</legalnotice>
|
||
|
||
<releaseinfo>$FreeBSD$</releaseinfo>
|
||
|
||
<abstract>
|
||
<para>Вы только что установили и настроили IPsec, и оно,
|
||
кажется, заработало. Как это можно проверить? Я опишу метод
|
||
экспериментальной проверки правильного функционирования
|
||
IPsec.</para>
|
||
</abstract>
|
||
</info>
|
||
|
||
<sect1 xml:id="problem">
|
||
<title>Постановка задачи</title>
|
||
|
||
<para>Для начала предположим, что Вы <link linkend="ipsec-install">
|
||
настроили <emphasis>IPsec</emphasis></link>. Как Вы
|
||
узнаете, что IPsec <link linkend="caveat">работает</link>?
|
||
Несомненно, соединения не будет, если Вы неверно его
|
||
сконфигурировали. И оно, конечно, появится в выводе команды
|
||
&man.netstat.1;, когда Вы всё сделаете верно. Но можно ли
|
||
как-то подтвердить сам факт функционирования IPsec?</para>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="solution">
|
||
<title>Решение</title>
|
||
|
||
<para>Для начала немножко криптографической теории:</para>
|
||
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>Шифрованные данные равномерно распределены по области
|
||
определения, то есть каждый символ имеет максимальную
|
||
энтропию;</para>
|
||
</listitem>
|
||
|
||
<listitem>
|
||
<para><quote>Сырые</quote> и несжатые данные как правило
|
||
избыточны, то есть их энтропия меньше максимально
|
||
возможной.</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
|
||
<para>Предположим, что у Вас имеется возможность измерить энтропию
|
||
входящего и исходящего трафика на сетевом интерфейсе. В этом
|
||
случае Вы сможете легко отличить зашифрованные данные от
|
||
открытых, причём даже в том случае, когда часть данных в
|
||
<quote>режиме шифрования</quote> передаётся в открытом виде, к
|
||
примеру внешние заголовки IP, которые используются для
|
||
маршрутизации.</para>
|
||
|
||
<sect2 xml:id="MUST">
|
||
<title>MUST</title>
|
||
|
||
<para><quote>Универсальный Статистический Тест для Генераторов
|
||
Случайных Чисел</quote> Уэли Маурера (Ueli Maurer's Universal
|
||
Statistical Test for Random Bit Generators), сокращённо <link xlink:href="http://www.geocities.com/SiliconValley/Code/4704/universal.pdf">
|
||
<acronym>MUST</acronym></link> позволяет быстро измерить
|
||
энтропию последовательного набора данных. Используемый
|
||
алгоритм похож на алгоритм сжатия. <link linkend="code">В
|
||
приложении</link> приведён исходный код, позволяющий измерять
|
||
энтропию последовательных кусков данных размером около
|
||
четверти мегабайта.</para>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="tcpdump">
|
||
<title>Tcpdump</title>
|
||
|
||
<para>Ещё нам нужен способ сохранения информации,
|
||
проходящей через интерфейс. Программа &man.tcpdump.1;
|
||
позволяет сделать это в случае, если Вы <link linkend="kernel">сконфигурировали своё ядро</link> с
|
||
поддержкой <emphasis>Пакетного Фильтра Беркли (Berkeley Packet
|
||
Filter)</emphasis>.</para>
|
||
|
||
<para>Команда</para>
|
||
|
||
<screen><userinput>tcpdump -c 4000 -s 10000 -w <replaceable>dumpfile.bin</replaceable></userinput></screen>
|
||
|
||
<para>сохранит 4000 пакетов в файл
|
||
<replaceable>dumpfile.bin</replaceable>. В данном примере объём
|
||
записываемой информации в каждом пакете не может превышать
|
||
10,000 байтов.</para>
|
||
</sect2>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="experiment">
|
||
<title>Эксперимент</title>
|
||
|
||
<para>Повторите следующие шаги эксперимента:</para>
|
||
|
||
<procedure>
|
||
<step>
|
||
<para>Откройте два окна терминала и свяжитесь в одном из них с
|
||
каким-нибудь компьютером через канал IPsec, а в другом — с
|
||
обычным, <quote>незащищённым</quote> компьютером.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Теперь начните <link linkend="tcpdump">сохранять
|
||
пакеты</link>.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>В <quote>шифрованном</quote> окне запустите команду &unix;
|
||
&man.yes.1;, которая будет выдавать бесконечный
|
||
поток символов <literal>y</literal>. Немножко подождите и
|
||
завершите её. Затем переключитесь в обычное окно (не
|
||
использующее канал IPsec) и сделайте то же самое.</para>
|
||
</step>
|
||
|
||
<step>
|
||
<para>Заключительный этап: запустите <link linkend="code">
|
||
MUST</link>, передав ему для обработки только что
|
||
сохранённые пакеты через командную строку. Вы должны
|
||
увидеть что-то вроде изображённого чуть ниже. Заметьте, что
|
||
безопасное соединение имеет 93% (6,7) от ожидаемого значения
|
||
(7,18), а обычное соединение — всего лишь 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 xml:id="caveat">
|
||
<title>Замечание</title>
|
||
|
||
<para>Этот эксперимент показывает, что IPsec
|
||
<emphasis>действительно</emphasis> распределяет передаваемые
|
||
байты по области определения <emphasis>равномерно</emphasis>,
|
||
как и любое другое шифрование. Однако этот метод <emphasis>не
|
||
может</emphasis> обнаружить множество других изъянов в системе
|
||
(хотя я таковых не знаю). Для примера можно привести плохие
|
||
алгоритмы генерации или обмена ключами, нарушение
|
||
конфиденциальности данных или ключей, использование слабых в
|
||
криптографическом смысле алгоритмов, взлом ядра и т. д. Изучайте
|
||
исходный код, узнавайте, что там происходит.</para>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="IPsec">
|
||
<title>Определение IPsec</title>
|
||
|
||
<para>IPsec представляет собой протокол безопасного обмена
|
||
информацией по Internet. Существует в виде расширения к IPv4;
|
||
является неотъемлемой частью IPv6. Содержит в себе протокол
|
||
шифрования и аутентификации на уровне IP (межмашинное
|
||
<quote>host-to-host</quote> взаимодействие). SSL защищает
|
||
только лишь конкретный прикладной сокет;
|
||
<application>SSH</application> защищает вход на машину;
|
||
<application>PGP</application> защищает определённый файл или
|
||
письмо. IPsec шифрует всю информацию, передаваемую между двумя
|
||
машинами.</para>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="ipsec-install">
|
||
<title>Установка IPsec</title>
|
||
|
||
<para>Большинство современных версий FreeBSD уже имеют поддержку
|
||
IPsec. Вероятно, Вы должны будете лишь добавить опцию
|
||
<option>IPsec</option> в конфигурационный файл ядра, и после
|
||
сборки и инсталляции нового ядра, сконфигурировать соединение
|
||
IPsec с помощью команды &man.setkey.8;.</para>
|
||
|
||
<para>Более подробно о том, как запустить IPsec во FreeBSD можно
|
||
прочесть в <link xlink:href="&url.books.handbook;/ipsec.html">Руководстве
|
||
пользователя</link>.</para>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="kernel">
|
||
<title>src/sys/i386/conf/KERNELNAME</title>
|
||
|
||
<para>Для того, чтобы захватывать сетевой трафик при помощи
|
||
&man.tcpdump.1;, следующие строки должны присутствовать
|
||
в конфигурационном файле ядра. Не
|
||
забудьте после модификации запустить &man.config.8;, и, как
|
||
обычно, пересобрать и установить новое ядро.</para>
|
||
|
||
<programlisting>device bpf</programlisting>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="code">
|
||
<title>Универсальный Статистический Тест Маурера (размер блока
|
||
— 8 бит)</title>
|
||
|
||
<para>Оригинал нижеприведённого кода находится по <link xlink:href="http://www.geocities.com/SiliconValley/Code/4704/uliscanc.txt">
|
||
этому адресу</link>.</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<<L)
|
||
#define Q (10*V)
|
||
#define K (100 *Q)
|
||
#define MAXSAMP (Q + K)
|
||
|
||
#include <stdio.h>
|
||
#include <math.h>
|
||
|
||
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 < 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 < V; i++) {
|
||
table[i] = 0;
|
||
}
|
||
|
||
for (i = 0; i < 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 && i < Q + K; i++) {
|
||
j = i;
|
||
b = fgetc(fptr);
|
||
|
||
if (b < 0)
|
||
run = 0;
|
||
|
||
if (run) {
|
||
if (table[b] > 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 < (int)(sum*8.0 + 0.50); i++)
|
||
printf("-");
|
||
|
||
printf("\n");
|
||
|
||
/* refill initial table */
|
||
if (0) {
|
||
for (i = 0; i < Q; i++) {
|
||
b = fgetc(fptr);
|
||
if (b < 0) {
|
||
run = 0;
|
||
} else {
|
||
table[b] = i;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}</programlisting>
|
||
</sect1>
|
||
</article>
|