9 мая 2012 в 19:07
Строим защищённую систему на основе TOR и I2P
из песочницы
Введение
В этом посте я попробую расписать по шагам о том, как построить защищённую систему для безопасного приёма, передачи, хранения и обработки конфиденциальных и иных опасных данных. Ни для кого не секрет, что сейчас различные лица и организации пытаются удушить свободу как самого интернета, так и его пользователей, и зачастую им это удаётся. Поэтому сейчас мы попробуем соорудить небольшую, но прочную крепость внутри нашего компьютера.
На провокации вида «при помощи такой системы можно слить гостайну врагу» я отвечаю сразу: при помощи ядерных ракет можно не только устроить конец света, но и отогнать или расколоть угрожающий нашей планете астероид.
TrueCrypt
VirtualBox (качать с официального сайта пока не торопитесь) Ubuntu. Я делал на версии 11.10 x86, поскольку 12.04 на тот момент не было. Поставьте образ качаться прямо сейчас, чтобы не терять времени. На диск резать не надо. TOR I2P Обращаю внимание, что всё вышеперечисленное ПО имеет открытый код.
Это очень важно, поскольку эти программы — ядро нашей безопасности, и какая-нибудь проприетарная закладка могла бы очень дорого обойтись.
Начнём!
Для того, чтобы защитить данные от прямого захвата жёсткого диска, нам необходимо их зашифровать. Для этого мы будем использовать утилиту TrueCrypt.
Создадим с её помощью зашифрованный том, хранящийся в файле. Можно создать и на разделе, но, на мой взгляд, это менее удобно.
Создавать ли скрытый том? Вопрос неоднозначный. Эта фича предназначена для использования в Англии, где невыдача паролей при конфискации ПК сама по себе является преступлением. В то же время в России такой законодательной нормы нет, а использование скрытого раздела съедает полезный объём диска. Я создавать скрытый раздел не стал.
Размер раздела выберем на своё усмотрение. Лично я выбрал 50 ГБ.
Алгоритм шифрования — я выбрал AES. Во-первых, ему доверяют американские военные для защиты высших грифов секретности, а во-вторых, он аппаратно ускоряется новыми процессорами Intel и TrueCrypt имеет поддержку этого ускорения.
Далее всё стандартно: придумываем сложный и длинный пароль, генерируем энтропию хаотичными движениями мыши и создаём раздел. Тип раздела обязательно должен быть NTFS, поскольку в нём будут храниться большие файлы.
Далее нам потребуется виртуальная машина. Всё, что мы оберегаем — будет храниться в ней.
Связано это с тем, что:
- работа в основной ОС оставляет в различных местах разнообразные следы;
- если основная ОС проприетарна (не буду показывать пальцем) — в ней не исключено наличие закладок;
- прикладное ПО в основной ОС тоже подпадает под предыдущее требование (вспомним PunkBuster, EULA которого позволяет сканировать жёсткий диск пользователя).
Мы будем использовать VirtualBox, но не основной дистрибутив, а портативный. Скачаем инсталлятор на заранее примонтированный шифрованный диск, запустим и скачаем поддерживаемый дистрибутив Бокса посредством самой утилиты. Далее утилита распакует его и настроит на портативность.
Создадим в Боксе машинку с двумя жёсткими дисками: одним — на 8-10 ГБ и вторым на всё оставшееся место, разумеется, расположив оба на шифрованном диске. Пройдёмся по настройкам, поставим сеть в NAT и настроим остальное по своему вкусу — особо критичного там ничего нет. Подключим образ Убунты (который, надеюсь, уже скачался) в качестве дисковода.
Запускаем машину и начинаем установку ОС. При разбиении дисков поступим примерно так: разместим на первом, маленьком, корень и своп, а на большом — /home. Все данные мы будем хранить в /home. Таким образом, разделение системы и данных происходит между разными файлами жёстких дисков Бокса. Далее всё выполняем по своему вкусу.
Установилось! Теперь начинаем настройку.
Идея заключается в том, чтобы оставить прямой доступ в сеть только двоим избранным — маршрутизаторам TOR и I2P.
Сначала ставим TOR из их собственного репозитория (в официальном версия может быть устаревшей) по инструкции с официального сайта. Потом поставим и I2P, опять же из собственного PPA-репа разработчиков — инструкция.
Обратим внимание, что TOR сам по себе предоставляет только SOCKS5-прокси, и его поддержка есть не во всех программах. Поэтому установим Polipo — свободный HTTP-прокси:
sudo apt-get install polipo
Настроим его:
sudo nano /etc/polipo/config
Добавим в него строчку:
proxyPort = 8118
Ниже раскомментируем (или подправим, если что-то не так):
socksParentProxy = "localhost:9050"
socksProxyType = socks5
Сохраним. Перезапустим Полип:
sudo service polipo restart
Теперь настроим I2P:
sudo nano /etc/default/i2p
Включим запуск в качестве демона:
RUN_DAEMON="true"
Заодно видим в файле имя пользователя, от которого работает маршрутизатор — у меня это
i2psvc Сохраняем.
Запускаем: sudo service i2p start
Теперь узнаем пользователя, от которого работает TOR:
lsof -c tor
У меня это
debian-tor.
И теперь — самое вкусное: рубим доступ в сеть всему, что не TOR и не I2P. Ещё раз —
всему.
Вот готовый скрипт iptables-restore, только проверьте ещё раз имена пользователей.
Общая политика DROP, разрешён доступ всем на локалхост, I2P и TOR — во внешнюю сеть.
sudo nano /etc/iptables.up.rules
Содержимое:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A OUTPUT -d 127.0.0.1/32 -j ACCEPT
-A OUTPUT -m owner --uid-owner debian-tor -j ACCEPT
-A OUTPUT -m owner --uid-owner i2psvc -j ACCEPT
COMMIT
Откроем файл настройки сети:
sudo nano /etc/network/interfaces
Допишем команду загрузки правил:
pre-up iptables-restore < /etc/iptables.up.rules
У меня выглядит так:
auto lo
iface lo inet loopback
pre-up iptables-restore < /etc/iptables.up.rules
Поскольку управление сетью у меня идёт посредством network-manager — интерфейса eth0 в файле нет. Правила прописываются при поднятии лупбэка, но разницы нет, поскольку эти правила едины для всех интерфейсов.
Загрузим правила в iptables. Можно перезапустить сеть, но мы сделаем так:
sudo iptables-restore < /etc/iptables.up.rules
Готово! Крепость построена, ров вырыт, лучники на стенах выставлены. Но мы ещё не раздали пропуска её жителям! Исправим.
Для доступа во внешний интернет лучше применять TOR, HTTP-интерфейс которого у нас на 8118 порту.
nano ~/.bashrc
Допишем в конец:
export http_proxy="http://127.0.0.1:8118/"
Теперь в терминале просто
bash
При этом шелл перечитает свой конфиг. Однако apt, без которого в Убунте — как без воды (и ни туды, и ни сюды), чихать хотел на эту переменную окружения. Разъясним ему персонально внутриобъектный режим нашей крепости:
sudo nano /etc/apt/apt.conf.d/proxy
Там должно быть:
Acquire::http::Proxy "http://127.0.0.1:8118/";
Сохраняем, закрываем.
Ну вот вроде и всё. Теперь осталось поставить браузер (если чем-то не нравится установленный по умолчанию Фокси) и начинать пользоваться не очень быстрым, зато защищённым со всех сторон доступом. И повторюсь — программа внутри виртуалки может быть нашпигована хоть тысячей закладок — данные она, может, и сольёт, только они будут анонимными. Вычислить внешний IP не удастся никому.
Однако (спасибо amarao за дополнение)
смотрите внимательно, какие программы вы запускаете от рута! Поскольку вредоносная программа может обойти защиту двумя способами: прописав своё вредоносное правило в iptables или внедрив шпионский модуль ядра. Обе процедуры требуют рут.
Систему строил полностью своими силами, не опираясь на готовые How-To (если такие вообще существуют, я не нашёл). Поэтому буду рад принять от читателей возможные усовершенствования и указания на недочёты.
Спасибо за внимание! Надеюсь, хоть кому-нибудь я пользу принёс.
Как-то у меня не вяжется безопасные прием-передача конфиденциальной информации и tor. При пользовании тором, я исхожу из предположения, что весь трафик на всех exit нодах снифается и анализируется. А также любая полученная страница может быть пооддельной.
Т.е. передавать можно только ту информацию, которая попав в чужие руки будет совершенно бесполезной.
Да, и по такой схеме многие приложения будут спотыкаться на днс-е. Сам когда-то настраивал, далеко не многие умеют днс- запросы через тор пускать.
А даже если умеют, то из-за тупняков с днс-ом, все будет жутко тормозить. В данной схеме хорошо бы поднять ttdnsd + pdnsd, т.е. принудительное проксирование днс запросов и проброс их в тор. Со стороны приложений это будет выглядеть как обычный днс сервер, а при множественных днс запросах, непосредственно сам запрос будет только раз для домена, потом моментом будет вылетать из кэша.
Схема такая: UDP dns -> proxy -> TCP dns запрос -> tor
Tor и I2P из песочницы надо выносить. Либо на хост (но тут надо думать об оставляемых следах и уязвимости хост-ОС, хотя о ней всегда надо думать), либо на соседнюю безголовую виртуалку с ограниченным роутингом и логами запросов на прокси-порты. Оба приложения обладают информацией о реальном IP (в общем случае, не знаю насчёт строго клиентских режимов работы), да и вирус, распространяемый среди пользователей этих программ, скорее всего будет внедряться в них же, чтобы работать с сетью.
А потом надо молиться, чтобы в ядре VirtualBox и компонентах, типа Guest Additions (даже в самом программном интерфейсе, без установки), файрвола и сетевого драйвера на хосте, не было дырок.
Как минимум, в такой схеме утекает информация о времени работы виртуалки (Prefetch, дата создания временных файлов и всё такое прочее), которое можно будет с чем-то сопоставить (это более общая проблема, которая, в частности, декларирует необходимость круглосуточной работы узла сети). Только полностью шифрованная система с загрузчиком либо на неперезаписываемом устройстве, либо криптографически подписанным.