Что такое onion-сервис на самом деле
Onion-сервис Tor — это сервер, доступный только через сеть Tor, по адресу, который заканчивается на .onion и получен из криптографического ключа, а не выдан регистратором. Здесь нет ни DNS-запроса, ни публичного IP в каком-либо реестре, ни TLS-сертификата, который нужно покупать: 56-символьный адрес и есть публичный ключ сервиса, поэтому соединение аутентифицировано и зашифровано end-to-end уже по построению. Посетитель с Tor Browser вводит адрес; сеть устраивает зашифрованную точку встречи; обе стороны общаются, не узнавая местоположение друг друга. Никто посередине — ни релей, ни интернет-провайдер, ни хостинг-провайдер — не видит оба конца разговора одновременно.
Следствие, которое действительно важно для хостинга, структурное, а не косметическое. Обычный веб-сервер вынужден слушать публичный порт, а значит, его адрес обнаружим, сканируем и в конечном счёте связываем с тем, кто платит по счёту. Onion-сервис не слушает ничего, до чего может дотянуться интернет. Tor на машине устанавливает только исходящие соединения, строит цепочки до нескольких introduction points и ждёт. Сервис онлайн и обслуживает трафик, пока ss -tlnp не показывает ничего привязанного к маршрутизируемому адресу. Именно эта инверсия — вся причина запускать такой сервис.
Когда это правильный инструмент — а когда нет
Прибегайте к onion-сервису, когда местоположение машины — часть того, что вы защищаете: сайт, который должен оставаться доступным, даже если его домен в клирнете изъят; ящик для приёма материалов от источников или исследователей; админ-панель, которую вы предпочли бы вообще не показывать сканирующему интернету; или сервис, чья аудитория и так пользуется Tor и ценит то, что вы не можете залогировать IP, который никогда не получаете. Это и честный ответ в случаях, когда «скрыть источник» — это и есть настоящее требование: reverse proxy перед сервером в открытом интернете лишь сдвигает цель, тогда как onion-сервис убирает её вовсе.
Это неподходящий инструмент, если ваши посетители не хотят или не могут пользоваться Tor, если вам нужна необработанная пропускная способность и задержка меньше 100 миллисекунд, которую даёт напрямую доступный сервер, или если вся суть — в обнаруживаемости: на onion-адрес не натыкаются через поисковик. Многие операторы выбирают компромисс и держат оба варианта: обычный сайт ради охвата и onion-сервис для тех пользователей, которым он нужен, — причём отдаёт их одно и то же приложение. Этот вариант мы разбираем ниже. Ничто здесь не заменяет защиту самой машины: если сервер скомпрометирован, его местоположение и содержимое утекут независимо от того, как он опубликован, — так что относитесь к чек-листу защиты в первый час как к обязательному условию, а не как к чему-то второстепенному.
SP·03Что раскрывает эта настройка — и кому
Стоит точно понимать модель анонимности, потому что под «onion-сервисом» часто подразумевают «нельзя отследить», а реальность точнее и уже. Клиенты никогда не узнают IP-адрес сервера — это сильное свойство, и в этом вся суть. А вот ваш хостинг-провайдер по-прежнему видит машину в своей сети, которая поддерживает постоянный поток зашифрованных исходящих соединений к сети Tor; он не может увидеть onion-адрес, содержимое или посетителей, но видит, что машина «говорит» на Tor. На массовом хостинге, привязанном к вашей личности, это нить, за которую стоит потянуть. На офшорном VPS с анонимной оплатой и без имени в базе она никуда не ведёт — и именно поэтому эти два приёма стоит применять вместе.
Сценарии, которые на практике деанонимизируют onion-сервисы, почти никогда не связаны с самим Tor. Это приложение, которое светит реальный IP в странице ошибки, в заголовке, в отправленном письме или в исходящем запросе к аналитике или серверу обновлений в клирнете; неверно настроенный сервер, который выдаёт своё имя хоста или часовой пояс; или корреляция из-за того, что оператор переиспользует одну и ту же машину, ключ или манеру письма поверх личности в клирнете. Криптография держится; попадаются на обвязке вокруг неё. Каждый шаг ниже написан так, чтобы эта обвязка оставалась плотной: привязка к localhost, никакой открытой отправки данных наружу и реальная личность, которую держат подальше от машины, — по принципам из материала как не оставлять своё имя на сервере.
SP·04Установите актуальный Tor, а не тот, что идёт с дистрибутивом
Дистрибутивы замораживают Tor на той версии, что вошла в конкретный релиз, а средства защиты onion-сервисов развиваются быстро — защита от DoS-атак на introduction points, авторизация клиентов v3 и несколько исправлений стабильности появились в версиях новее тех, что по умолчанию несёт стабильный Debian или Ubuntu. Устанавливайте из собственного подписанного репозитория Tor Project, чтобы следовать актуальным релизам и получать обновления безопасности по их графику, а не по графику дистрибутива. Приведённый ниже сниппет автоматически определяет кодовое имя вашего релиза и привязывает репозиторий к ключу подписи проекта, так что атакующий, подделавший зеркало, не сможет подсунуть вам устаревший пакет.
Tor работает без привилегий, от имени пользователя debian-tor на Debian и Ubuntu, уходит в sandbox и не нуждается в особых сетевых привилегиях — он лишь дозванивается наружу, как любой клиент. Для самого onion-сервиса в firewall не нужно открывать вообще ничего, и это первый приятный сюрприз всего упражнения: ваш firewall с default-deny может оставаться настолько же строгим, каким был.
Привяжите приложение к localhost и больше ни к чему
Onion-сервис — это парадный вход к обычному локальному сервису: веб-серверу, приложению, SSH-демону, чему угодно, говорящему на TCP. Правило, которое делает всё это безопасным, — локальный сервис должен слушать только loopback-интерфейс, 127.0.0.1. Если он также слушает публичный IP, вы незаметно воссоздали ту самую проблему, которую onion-сервис должен был решить: содержимое теперь напрямую доступно и поддаётся снятию отпечатка, а сканирование, сопоставившее ваш клирнет-сервер с содержимым onion, одним запросом уничтожает всю анонимность. Привязывайтесь к loopback, подтверждайте это через ss -tlnp и не позволяйте ничему, кроме Tor, когда-либо подключаться к этому порту.
Поскольку трафик между Tor и вашим приложением остаётся на 127.0.0.1, он никогда не выходит в сеть и не нуждается в собственном TLS — цепочка Tor уже шифрует всё end-to-end. Не вешайте самоподписанный сертификат на loopback-listener: это добавляет поверхность для снятия отпечатка и не даёт ровным счётом ничего. Держите приложение скучным: никаких редиректов в клирнет, никаких зашитых в шаблоны абсолютных ссылок вида https://your-domain, никаких сторонних шрифтов или аналитики, из-за которых браузер посетителя потянется с onion наружу, в открытый интернет.
Объявите сервис, затем прочитайте свой адрес
Onion-сервис — это три строки torrc: директория, где Tor хранит ключевой материал, и сопоставление виртуального порта на onion-адресе локальному порту, который слушает ваше приложение. При первом перезапуске Tor генерирует в этой директории пару ключей Ed25519 и записывает файл hostname — 56-символьный адрес .onion, который вы будете раздавать. Этот адрес постоянен, пока вы храните ключ. Потеряете ключ — адрес исчезнет навсегда; допустите его утечку — кто-то другой сможет выдавать себя за ваш сервис. Относитесь к HiddenServiceDir как к фамильным драгоценностям: 0700, владелец — пользователь Tor, зашифрованный бэкап хранится вне машины.
Ещё две настройки заслуживают места рядом с сопоставлением портов. HiddenServiceEnableIntroDoSDefense 1 позволяет вашим introduction points ограничивать частоту соединений при флуде ещё до того, как он дойдёт до вашей машины, — это ближайший аналог защиты от DDoS, доступный onion-сервису. Фиксация HiddenServiceVersion 3 делает версию явной и защищённой на будущее. Если сервис должен быть приватным, а не публичным, авторизация клиентов v3 ограничивает доступ обладателями ключа, который вы распространяете вне сети, — чистый способ держать админ-панель, которая просто не отвечает никому без нужных учётных данных.
Анонсируйте его, держите оба варианта и выберите запоминающийся адрес
Если вы также держите сайт в клирнете, сообщите Tor Browser об onion-версии через заголовок ответа Onion-Location (или эквивалентный HTML-meta-тег). Браузеры с поддержкой onion затем сами предлагают посетителям .onion-адрес — так делают, например, крупные издания и поисковики. Обслуживать одно и то же приложение и на домене, и на onion-адресе — это норма, а не экзотика: одна кодовая база, одна база данных, две парадные двери, причём сторона в клирнете стоит за обычным reverse proxy, скрывающим источник, а onion-сторона вообще ничего не раскрывает.
Адрес по умолчанию — случайная 56-символьная строка: она надёжна, но её невозможно запомнить. Vanity-адрес позволяет перебором подобрать ключ, чья base32-кодировка начинается с выбранного вами префикса, — несколько читаемых символов подбираются быстро, но каждый дополнительный символ умножает объём работы на 32, так что всё, что длиннее семи-восьми букв, превращается в серьёзную вычислительную задачу. Генерируйте vanity-ключи на доверенной локальной машине, никогда на сервере, и помещайте полученный ключ в HiddenServiceDir точно так же, как восстанавливали бы его из бэкапа. Узнаваемый префикс заодно притупляет одну вполне реальную атаку: фишинговые клоны, которые рассчитывают, что никто не станет вчитываться в стену случайных символов.
Поддерживайте это: производительность, мониторинг и гигиена ключа
Onion-соединение проходит через шесть релеев вместо привычного нуля, поэтому задержка выше, а пропускная способность ниже, чем у напрямую доступного сервера, — это физика, а не ошибка конфигурации, и никакая настройка её не уберёт. Не поддавайтесь соблазну однохоповых или неанонимных режимов ради возврата скорости: они отдают ровно то свойство, ради которого всё это затевалось. Что вы действительно можете сделать — это держать Tor актуальным, оставить включённой DoS-защиту introduction points, прикрыть нагруженный сервис кешированием, чтобы каждый запрос требовал меньше работы, и заложить в машину запас по CPU, потому что криптография Tor не бесплатна. Скромный офшорный VPS от $8.00/мес спокойно справляется с типичным onion-сайтом.
В эксплуатации onion-сервис держат здоровым три привычки. Следите за journalctl -u tor@default на предмет ошибок доступности и публикации дескрипторов, а не считайте тишину признаком здоровья. Делайте бэкап HiddenServiceDir в день создания сервиса и после каждого изменения — зашифрованный и вне машины, — потому что этот ключ невозможно сгенерировать заново. И держите операционную идентичность машины чистой: свежий ключ на свежем анонимном VPS мало чего стоит, если те же привычки оператора связывают его с личностью в клирнете. Сам сервис годами будет спокойно работать без вмешательства; дисциплина нужна в обвязке вокруг него, а не в самом сервисе.
Шаг за шагом
-
01
Начните с защищённой анонимной машины
Разверните офшорный VPS — он выходит в онлайн примерно за 15 min — и сначала сделайте скучную, но обязательную работу: именованный sudo-пользователь, SSH только по ключу, firewall с default-deny и автоматические обновления безопасности. Onion-сервис не добавляет ничего, что нужно открывать в этом firewall, так что запертая машина остаётся запертой. Не пропускайте этот шаг: onion-адрес перед скомпрометированным сервером не скрывает ровным счётом ничего.
ssh admin@203.0.113.10 sudo apt update && sudo apt full-upgrade -y # firewall stays default-deny; the onion service needs no inbound port sudo ufw status verbose
-
02
Установите Tor из репозитория Tor Project
Добавьте подписанный репозиторий проекта, чтобы работать с актуальным Tor и последними средствами защиты onion-сервисов, а затем установите его. Кодовое имя релиза определяется из
/etc/os-release, а репозиторий привязан к ключу подписи Tor, так что подделанное зеркало не сможет подсунуть вам более старую версию.sudo apt install -y apt-transport-https wget gpg . /etc/os-release wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \ | gpg --dearmor | sudo tee /usr/share/keyrings/tor.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/tor.gpg] https://deb.torproject.org/torproject.org $VERSION_CODENAME main" \ | sudo tee /etc/apt/sources.list.d/tor.list sudo apt update && sudo apt install -y tor deb.torproject.org-keyring
-
03
Привяжите свой сервис только к localhost
Направьте то, что вы публикуете, на loopback-интерфейс и никуда больше. Здесь nginx отдаёт статический сайт на
127.0.0.1:8080; тот же принцип действует для любого приложения — привязывайтесь к127.0.0.1, а не к0.0.0.0. Перезагрузите конфигурацию, а затем черезssубедитесь, что ничего не слушает маршрутизируемый адрес.# /etc/nginx/sites-available/onion.conf server { listen 127.0.0.1:8080; server_name _; root /var/www/onion; index index.html; }Включите конфигурацию, перезагрузите её и убедитесь, что привязка идёт только к loopback:
sudo ln -s /etc/nginx/sites-available/onion.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx ss -tlnp | grep 8080 # must show 127.0.0.1:8080, never 0.0.0.0:8080
-
04
Объявите onion-сервис в torrc
Добавьте сервис в
/etc/tor/torrc: директорию с ключом и сопоставление виртуального порта 80 на onion-адресе с вашим локальным портом 8080. Включите DoS-защиту introduction points и зафиксируйте версию адреса. Затем перезапустите Tor — на Debian и Ubuntu запущенный экземпляр называетсяtor@default.# /etc/tor/torrc HiddenServiceDir /var/lib/tor/onion-www/ HiddenServicePort 80 127.0.0.1:8080 HiddenServiceVersion 3 HiddenServiceEnableIntroDoSDefense 1 sudo systemctl restart tor@default
-
05
Прочитайте адрес и заблокируйте доступ к ключу
Tor уже создал ключевой материал и записал ваш адрес. Прочитайте его, раздавайте — и убедитесь, что директория имеет права
0700и принадлежит пользователю Tor: это обеспечивает сам Tor, но неаккуратное восстановление из бэкапа может это сломать. Файлhs_ed25519_secret_keyв этой директории — это и есть ваша идентичность; больше ничего.sudo cat /var/lib/tor/onion-www/hostname # example: 2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion sudo ls -l /var/lib/tor/onion-www/ # hostname hs_ed25519_public_key hs_ed25519_secret_key sudo chown -R debian-tor:debian-tor /var/lib/tor/onion-www sudo chmod 700 /var/lib/tor/onion-www
-
06
Проверьте через Tor, затем анонсируйте
Проверьте сервис с машины, на которой запущен Tor, используя
torsocks, чтобы запрос шёл через сеть, а не через клирнет. Как только сервис ответит, при желании направьте посетителей из клирнета на onion-версию заголовкомOnion-Locationна вашем обычном сайте.# from any box running tor: torsocks curl -sSI http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion/ | head # advertise the onion from your clearnet nginx (inside the https server block): add_header Onion-Location "http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion$request_uri";
-
07
Сделайте бэкап ключа и напишите runbook
Адрес живёт и умирает вместе с директорией ключа. Заархивируйте её в тот же момент, как она появилась, перенесите архив с машины в зашифрованное хранилище и учтите, что восстановление в любом месте воспроизводит абсолютно тот же адрес
.onion. Затем запишите две команды, которые реально понадобятся вам через полгода, — где лежит ключ и как проверить работоспособность, — потому что сервис будет работать нетронутым достаточно долго, чтобы вы обязательно это забыли.sudo tar czf onion-www-key.tar.gz -C /var/lib/tor onion-www # copy onion-www-key.tar.gz to encrypted off-box storage, then delete the local copy # health check any time: sudo systemctl status tor@default sudo journalctl -u tor@default --since "1 hour ago" | grep -i "onion\|error"


