Одежки с застежками
Автор: Павел Протасов
Опубликовано в журнале "Компьютерра" №7 от 24 февраля 2005 года
Приватность и анонимность в Сети — удел не только хулиганов и спамеров, она может понадобиться и законопослушным гражданам. Сегодня поговорим об одной из наиболее любопытных и действенных программ, которая такую анонимность обеспечивает.
Сначала была «луковица»…
Проект Onion Routing, предтеча Tor (Ну, или наоборот: можно сказать, что Tor — это, собственно, и есть Onion Routing в том виде, в котором он задумывался изначально), предполагает создание распределенной сети маршрутизаторов, обеспечивающих передачу зашифрованных пользовательских данных. Однако поначалу дело ограничилось запуском прототипа сети на одном из компьютеров вашингтонской исследовательской лаборатории ВМС США, с возможностью для каждого желающего эту сеть потестировать. Программа Tor была разработана впоследствии при поддержке Electronic Frontier Foundation. В ней были сделаны кое-какие усовершенствования: иной способ формирования защищенного канала связи, защита передаваемых данных от искажения и др.
Tor распространяется свободно и работает как в клиентском режиме, так и в режиме сервера. Иными словами, каждый скачавший программу сможет запустить свой собственный Onion-маршрутизатор. Разумеется, такой подход к формированию сети чреват тем, что в нее могут попасть всякие злоумышленники и просто хулиганы, намеревающиеся воровать чужие данные, проходящие через их сервер. Ведь для того, чтобы создать свой сервер, им придется только поправить конфигурационный файл и сообщить по электронной почте о своем намерении влиться в сеть, чтобы быть добавленным в список серверов. Но, как мы увидим ниже, с этой проблемой удается справиться.
Основная идея Onion Routing — пустить данные от клиентского компьютера к серверному по защищенному каналу связи. При этом каждое из звеньев будет знать лишь о тех своих соседях по цепочке, с которыми оно обменивается информацией. При передаче данных применяется асимметричная криптография, и каждый пакет шифруется открытым ключом сервера, через который он проходит.
Из-за этого проект и назвали «Луковой маршрутизацией»: на каждый пакет данных , как «одежки» на луковицу, накладываются «слои шифрации» с помощью ключей серверов. А кто вздумает раздеть пакет, тот, как водится, слезы проливает: если в возможность расшифровать в реальном времени один «слой» этой луковицы я, может быть, и поверю, то проделать то же самое сразу с несколькими в обозримый промежуток времени явно не удастся.
Технология стриптиза
Tor может применяться для организации защищенных каналов связи между любыми программами, общающимися между собой по протоколу TCP. UDP не поддерживается. По умолчанию она работает на портах 80 (HTTP) и 443 (HTTPS), но может настраиваться с помощью конфигурационного файла на любой другой порт. Конфиг, в случае с версией для Windows, находится в каталоге С:\Documents and Settings\<имя пользователя>\Application Data\Tor. Соответственно через программу можно «пустить» трафик любого приложения, работающего по TCP, — от обычного веб-браузера до «аськи» с IRC.
Сеть «луковых» маршрутизаторов состоит из обычных серверов, осуществляющих передачу данных, и серверов удостоверяющих, на которых хранятся «слепки» открытых ключей серверов. При первом запуске клиентское приложение обращается к удостоверяющему серверу, где находятся данные о маршрутизаторах вместе со слепками их ключей. Считав эти данные и сохранив их у себя, клиент приступает к формированию канала связи; по умолчанию канал формируется из трех узлов. По нему передаются зашифрованные данные пользователя.
К первому маршрутизатору в цепочке (так называемому входу) обращается клиентское приложение, передающее и получающее данные непосредственно от него. Последний (соответственно выход) служит для связи с тем сервером, данные от которого пользователю нужны и связь с которым ведется в незашифрованном виде (В случае с настройками «по умолчанию» — с обычным HTTP-сервером).
Чтобы сформировать канал, программе-клиенту надо, во-первых, получить от каждого из узлов его открытый «ключ идентификации», используемый для проверки идентичности сервера. После сравнения ключа со слепком, который мы скачали при первом запуске, мы убеждаемся, что сервер — действительно, тот, за кого себя выдает (или же — в обратном). После чего принимаем решение задействовать его в качестве одного из узлов канала (или просим пойти погулять и ищем кого-нибудь еще). Когда мы наберем достаточное количество узлов, каждый из них сгенерирует свою пару ключей, которая будет использована исключительно в рамках данного сеанса связи. То же самое делает и программа-клиент. После обмена открытыми ключами со всеми серверами канал можно считать сформированным.
Затем Tor получает от клиентской программы (браузера, например) те данные, которые нужно передать в Сеть, и формирует из них специальные пакеты размером по 512 байт каждый. Делается это для того, чтобы по объему исходящих данных нельзя было определить, какое именно приложение работает. Пользователи «аськи» и любители чатов имеют основание быть недовольными таким подходом, поскольку для них трафик резко возрастет. Однако анонимность требует жертв.
Затем пакет с данными шифруется с помощью открытых ключей всех серверов, входящих в состав канала связи, последовательно от самого дальнего в цепочке до самого ближнего, так, что последним примененным ключом является ключ «входа». Туда пакет и передается. Там он расшифровывается и передается далее, к «выходу», последовательно расшифровываясь каждым из маршрутизаторов.
Между собой маршрутизаторы связываются по протоколу TLS, он же Transport Layer Security Protocol, при этом каждый из них может установить связь с любым другим. После того как пакет с данными подойдет к «выходу», он расшифровывается, преобразуется из «лукового» в нормальный, пригодный для обработки обычными приложениями, и передается веб-серверу. Процесс обратной передачи данных, от сервера к браузеру, малость попроще: «выход» получает порцию данных и шифрует их с помощью одного-единственного ключа клиентского приложения. Тоже, кстати, разумная мера: поток данных, идущих от сервера к клиенту, намного больше, чем от клиента к серверу, так что на их шифрование логично тратить меньше времени, заворачивая только в одну обертку. После этого зашифрованный пакет идет по цепочке обратно.
Вот, в общих чертах, и весь процесс. Однако тот, кто читал статью внимательно, может заметить неувязку в рассуждениях: канал связи от сервера к клиентскому приложению защищен лишь одним уровнем шифрования.
Так вот, при использовании Tor клиентская программа периодически образует новый канал из других маршрутизаторов. Кроме того, по одному каналу может идти сразу несколько потоков данных, в отличие от OR, где мог быть только один поток на канал.
В «луковой» сети есть еще и «серверы» с доменным суффиксом .onion, которые используются для организации двусторонних анонимных соединений. При таких соединениях два приложения, клиентское и серверное, строят каждое по защищенному каналу связи, которые впоследствии друг с другом «встречаются».
Для установления соединения серверное приложение организует несколько «мест знакомства» (introduction point), устанавливая канал к каждому из них. Клиент просто заходит, тоже через шифрованный канал, в одно из таких мест, и передает запрос на установление связи, по которому сервер определить его личность не может. В ответ сервер устанавливает соединение или отказывает в нем. В терминологии программы точка, в которой устанавливается соединение, именуется rendevous point, то есть место встречи.
При таком способе общения свою личность может скрыть пользователь как клиентского, так и серверного приложений. В качестве примера подобного сайта приведу Hidden Wiki (6sxoyfb3h2nvok2d.onion). А поскольку суффикс .onion — нестандартный, то поддерживается он только внутри сети маршрутизаторов, и если вы остановите Tor, то доступа к сайтам лишитесь.
За более подробными инструкциями обращайтесь к _www.wiki.noreply.org/wiki/TheOnionRouter/TorFAQ и _www.tor.eff.org/documentation.html.
Важное замечание: Tor обеспечивает анонимность самого соединения, а не передаваемых данных. Иными словами, сервер на другом конце защищенного канала не будет знать лишь того, откуда вы к нему пришли, однако все передаваемые браузером данные (кроме IP-адреса), по которым можно установить вашу личность, Tor исправно зашифрует и пошлет туда, куда вы ему сказали. Соответственно, понадобится еще одна программа, которая бы вырезала такого рода данные из исходящего потока. То есть фильтрация нужна еще и на уровне приложения, и если для веб-серфинга она может быть обеспечена локальным прокси-сервером, то для других приложений (скажем, модуля обновления Windows…) программ, фильтрующих личные данные, может и не быть.
Собственно, настроить на благое дело анонимного серфинга можно любой локальный прокси-сервер, но — именно настроить. А мы поищем легких путей и последуем совету разработчиков Tor — будем пользоваться Privoxy (_www.privoxy.org). Это как раз и есть локальный прокси-сервер (рис. 1), но «заточенный» специально для резки того, что мы хотим вырезать: всякого рода приватной информации. К тому же он умеет блокировать «куки», всплывающие окна и баннеры — это при настройках по умолчанию. В каталоге программы есть конфигурационный файл config.txt, где вы можете вдоволь покопаться, гибко изменяя настройки, однако в общем случае работать он будет так, как нам надо, безо всяких дополнительных ухищрений. Дистрибутивы программы существуют для кучи платформ: Windows, различных дистрибутивов Linux, OS/2, NetBSD, FreeBSD и др.
Делай — раз!
В простейшем случае, дабы обеспечить работоспособность Tor, нужно сделать следующее:
Установить Tor и Privoxy.
Добавить в упомянутый конфиг Privoxy строчку: «forward-socks4a / localhost:9050 .» (с точкой!). Это нужно для того, чтобы предотвратить утечку данных и обеспечить анонимность всех отправляемых в сеть запросов, включая запросы к серверам DNS.
В список прокси-серверов вашего браузера добавить «localhost» через порт 8118 — через этот локальный сервер пойдет шифрованный трафик. Если хотите шифровать все — можете прописать сервер в настройках конкретного сетевого подключения «намертво», однако этого делать не рекомендуется, поскольку объем передающихся данных возрастет, а скорость работы, наоборот, снизится. Возможность быстрой смены прокси-серверов можно обеспечить при работе с большинством браузеров — и с помощью «надстроек» над Internet Explorer, и с помощью «примочек» к Firefox.
Запустить Privoxy и Tor.
Собственно, сам по себе Tor немногословен: при начале работы он просто выведет окошко с командной строкой, в котором сообщит, что жив, здоров и, несколько погодя, — что канал связи установлен (Об установлении канала он говорит почему-то не всегда, но работает при этом нормально). Чтобы проверить работоспособность всей связки, можно зайти на одну из специально для этого предназначенных страниц (peertech.org/privacy-knoppix) и посмотреть на реакцию сервера. Он «знает» большинство «луковых» маршрутизаторов и, если ваш IP-адрес совпадает с одним из них, сразу вам об этом сообщит (рис. 2): скажет, что сервер, с которого вы зашли, и есть один из известных ему «выходов» Tor. Правда, и тут бывает на него проруха: IP он может показать явно чужой, а вот собственно на сервер — сказать, что и не «луковый» он вовсе. Вероятнее всего, данных о нем в базе просто нет, поскольку, обновив через некоторое время страницу и соединившись по новому каналу, я вновь получал сообщение о том, что все работает.
И оно, кажется, действительно, работает.