Tor и onion-сервисы на пальцах. Ещё раз

Что знают двое, знает и свинья.

Немецкая пословица

Вряд ли вы в курсе, но совсем скоро (этой осенью) произойдёт достаточно важное для криптопанков и оголтелых сторонников приватности событие - сетевая инфраструктура Тора переходит на новый стандарт onion-сервисов. Понимаю, для неподготовленного читателя это звучит как какая-то абракадабра, и, хоть я уже когда-то давно писал (ещё в почившем ЖЖ) на эту тему - за прошедшие годы многое изменилось, и, видимо, настал тот момент когда уместно повториться, начав с азов.

Я много раз упоминал Тор в контексте того, что это - один из лучших способов анонимизации.

Принцип его работы, в двух словах, заключается в том, что данные между вами и ресурсом, на который вы хотите попасть, идут не напрямую через интернет, а проходят через несколько промежуточных узлов, называемых нодами Тора. Таких узлов обычно три штуки - и математически доказано, что этого достаточно для анонимизации в подавляющем числе случаев.

Вторая особенность заключается в том, что ваши данные, передаваемые через Tor, несколько раз шифруются, для каждой ноды своим ключом. Делается это для того, чтобы промежуточные узлы не обладали полной информацией о том, кто, что и куда передаёт.

Всё вместе это называется "луковой маршрутизацией".

Например, вы хотите зайти на приснопамятный сайт некололи.ком через Тор. Для этого вы случайным образом выбираете три ноды из нескольких тысяч доступных - одна из них используется как входная (entry guard), вторая - промежуточная (middle relay), третья - как выходная (exit node). У вас есть публичные ключи всех трёх нод, а следовательно - вы можете зашифровать данные так, чтобы расшифровать их могла только соответствующая нода. Тогда последовательность действий будет выглядеть следующим образом:

  1. Вы берёте сообщение, в котором написано "хочу зайти на сайт некололи.ком" и шифруете его ключом выходной ноды (C).
  2. На получившемся пакете данных пишете "отправить ноде C" и шифруете получившееся ключом промежуточной ноды (B).
  3. На получившемся пакете данных пишете "отправить ноде B" и шифруете получившееся ключом входной ноды (A).
  4. Отправляете получившееся через интернет ноде A (оно зашифровано, поэтому никто посторонний не поймёт, что там внутри).
  5. Нода А расшифровывает пакет своим ключом, видит надпись "отправить ноде B" - и так и делает.
  6. Нода В расшифровывает пакет своим ключом, видит надпись "отправить ноде C" - и так и делает.
  7. Нода C расшифровывает пакет своим ключом, видит надпись "хочу зайти на сайт некололи.ком" - и отправляет ваше сообщение куда следует.

Таким образом формируется надёжно зашифрованный на всём пути (кроме сегмента между выходной нодой и сайтом) канал передачи данных, по которому могут свободно передаваться некололи. Нужно заметить, что все участники взаимодействия, кроме вас самих, в курсе только относительно части происходящего:

Важно понимать, что выходные ноды, в случае их компрометации или злонамеренного использования, могут прослушивать или даже вмешиваться в проходящий трафик - поэтому при посещении обычных интернет-сайтов необходимо (впрочем, как и без Тора) использовать исключительно HTTPS-версии.

Вот честно позаимствованная с сайта EFF инфографика, демонстрирующая, какую информацию могут получить нехорошие люди в различных случаях сочетания Тора и HTTPS. Обязательно покликайте на кнопки - это очень прикольно:

Несмотря на то, что через Тор могут работать практически любые приложения, просто брать и делать так не рекомендуется. Существует достаточно скромный список ПО, гарантированно корректно работающий с Тором, но фактически - чаще всего для работы используется форк Firefox`а под названием Tor Browser. При включении он автоматически подключается к сети, а встроенные плагины защищают от деанонимизации косвенными методами.

Но Тор не называли бы рассадником наркомании, отмывания денег и прочих милых слуху криптоанархиста терминов, если бы дело ограничивалось анонимным доступом к обычным интернет-сайтам. В самом деле - какой полезный сайт сейчас не просит для регистрации адреса почты, а то и номера телефона со сканом паспорта? Не-ет, так дело не пойдёт - какая же это анонминость?

И в этот момент мы возвращаемся к тому, с чего начали - к onion-сервисам.

Onion-сервис - это безумно крутая, на мой взгляд, реализация двусторонне-анонимного взаимодействия между, собственно сервисом (который может представлять собой любое ПО - веб-сайт, SSH-сервер, мессенджер, онлайн-игру и т. д.) - и клиентом, желающим этим сервисом воспользоваться. На заре становления Тора такие ресурсы называли Hidden Service, то есть - скрытыми.

И они действительно скрыты столь же надёжно, как и локация обычных пользователей Тора. Проводя параллель с обычным интернетом - это сайт, реального расположения которого не знает никто, кроме его владельца, и который невозможно заблокировать. Заманчивая штука? Мне кажется - более чем.

Как же работает всё это торжество приватности?

Концепция довольно изящна, но поначалу может быть немного сложна в понимании. Тем не менее, я попытаюсь, взяв для примера картинки из официального руководства.

Итак, у нас есть некий onion-сервис, отмеченный на картинке синим квадратиком SecureDrop. Чтобы желающие могли попасть на этот сайт, происходит следующая последовательность действий:

  1. Сервис случайным образом выбирает три ноды из списка доступных, строит к ним, абсолютно так же, как в предыдущем примере, защищённые каналы через промежуточные узлы, и спрашивает - не согласятся ли эти ноды стать так называемыми анонсирующими точками (introduction point) для него. Нода может отказаться - это дело добровольное, но рано или поздно сервис с кем-то договаривается.

  2. Получив в своё распоряжение три анонсирующих точки, сервис составляет т. н. дескриптор onion-сервиса, включающий в себя координаты анонсирующих нод, подписанные приватным ключом сервиса, после чего публикует этот дескриптор (тоже через анонимный защищённый канал) в распределённую хэш-таблицу (directory), являющуюся частью инфраструктуры сети Tor и доступную всем участникам.

  3. Клиент, желающий воспользоваться сервисом, должен знать наш onion-адрес - это довольно длинная последовательность символов, заканчивающаяся, как обычный домен, зоной - в данном случае .onion. Важный нюанс! Помимо наименования onion-адрес ещё и представляет собой публичный ключ, по подписи которого можно проверить дескриптор в хэш-таблице, что клиент и делает (опять же - через анонимный защищённый канал).

  4. Получив дескриптор, клиент проверяет его, сравнивая подпись с onion-адресом, и в случае совпадения смотрит внутрь, находя адреса анонсирующих точек.

  5. Клиент, не желая раскрывать кому бы то ни было своё расположение, случайно выбирает ноду из общего списка, и делает примерно то же, что делал сервис с анонсирующими точками - строит к ней защищённый канал и просит, чтобы эта нода стала его точкой встречи, или, по-французски, рандеву (rendezvous point). В случае согласия клиент передаёт рандеву-ноде одноразовый пароль, а также выбирает одну из анонсирующих точек сервиса - и передаёт ей тот же пароль вместе с адресом точки встречи.

  6. Анонсирующая нода, получившая пароль и адрес встречи, передаёт эту информацию onion-сервису, который критическим оком смотрит на неё.

  7. Если на предыдущем этапе всё прошло хорошо, наш сервис строит новый защищённый канал (через совершенно новые ноды) к точке встречи, и передаёт ей одноразовый пароль. Рандеву-нода сравнивает полученный от сервиса пароль с паролем клиента, и, в случае совпадения - соединяет участников между собой, становясь передаточным пунктом для трафика.

  8. Таким образом, установленное соединение onion-сервиса с клиентом использует шесть промежуточных узлов - три со стороны клиента (третьим из которых является точка встречи), и три со стороны сервиса, что позволяет организовать анонимную передачу данных, при которой ни один из узлов не обладает информацией, достаточной для деанонимизации.

С трудом выруливая обратно на тему, с которой начал, хочу рассказать вот про что. Наверное, наиболее отталкивающий неискушённого пользователя от использования Тора факт заключается в том, как выглядят адреса onion-сайтов - это, за редким исключением, нечто подобное: sejnfjrq6szgca7v.onion. Есть такое понятие, как Треугольник Зуко, постулирующее, что проблематично создать одновременно легко запоминающиеся, хорошо защищённые и децентрализованные имена ресурсов. Что мы, собственно, отлично видим на примере onion-сервисов.

Усугубляет положение вещей тот факт, что текущая версия onion-сервисов увидела свет аж 15 лет назад, и за прошедшее время катастрофически устарела. С этого-то, если помните, я и начал рассказ. Поскольку адрес сервиса представляет собой не просто имя, но и публичный ключ - легко догадаться, что чем оно короче, тем ниже его криптографическая стойкость. 15 лет назад сочетание SHA1/DH/RSA1024 (v2-имя представляет собой base32-закодированную 80-битную hex-строку) считалось достаточно надёжным, но время не стоит на месте - и вот, считая невозможным дальнейшее оттягивание решения назревающей проблемы, разработчики Тора анонсировали таймлайн перехода на новую, третью версию onion-сервисов, опирающуюся на другой набор криптографии - SHA3/ed25519/curve25519.

Посмотрите-ка, как выглядит v3-адрес onion-зеркала этого сайта: kyourakutrktytaxcjggj2nvdh7mpz4zh6flz2dlsagyxbva6tidvvad.onion.

Монстроузно, но весьма надёжно.

Легко заметить, что первые символы - не просто случайный набор букв. Это небольшой реверанс 90-ым годам прошлого века и охоте на короткие и красивые UIN`ы ICQ. В Торе коротко не сделаешь, но вот подобрать префикс покрасивше - ради бога :)

Основная претензия к Тору, помимо страшных адресов, заключается в низкой скорости работы. Хочу заметить, что, возможно, когда-то давно, когда число нод было совсем небольшим - так и было, но сейчас, судя по ощущениям и произведённым замерам, передача данных происходит достаточно шустро, в среднем со скоростью 4-5 Мбит/с. Собственно говоря, вы и сами можете легко проверить это утверждение, воспользовавшись Tor Browser`ом и зайдя на страницу с тестом скорости.

Понятное дело, что использовать Tor постоянно - не самая лучшая идея и лютый оверкилл. Но, на мой взгляд, в некоторых случаях, особенно если ваша деятельность хотя бы теоретически может вызвать бурления у многочисленных любителей совать нос не в свои дела - более оптимального способа не найти.

В особо важных случаях (или если нужно скрыть сам факт использования Тора) можно использовать Tor over VPN, разумеется, с надёжным, идеально - своим собственным VPN-туннелем.

Закончить хочу ссылкой на красивейшую визуализацию сети Тора в реальном времени - если обалдели от потока информации, возможно, это поможет слегка расслабиться :)