Пользователь
0,0
рейтинг
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 (если такие вообще существуют, я не нашёл). Поэтому буду рад принять от читателей возможные усовершенствования и указания на недочёты.

Спасибо за внимание! Надеюсь, хоть кому-нибудь я пользу принёс.
Кирилл @Raegdan
карма
29,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (57)

  • 0
    Для применения конфига в баше достаточно выполнить файл конфигурации
    . ~/.bashrc 
    (точка пробел в начале).

    Смысла городить винды а потом юзать внутри виртуалбокс не вижу. Ставьте юнити с самого начала. Конкретно аптитьюду я бы разрешил ходить наружу без прокси, ибо всё равно всё что нужно подписано на прикладном уровне.
    • +2
      Насчёт bashrc спасибо, буду знать.

      Насчёт городить винду и юзать бокс: я, например, не готов выделить отдельный ПК для системы. Винда мне нужна как геймеру. Дуалбут тоже не особо люблю, поскольку для защищённого сеанса придётся ребутить ПК.

      Аптитьюд, конечно, сам по себе безопасен, но кто может гарантировать нескомпрометированность репозиториев Убунты? Логгить IP они могут. Я вполне согласен пожертвовать скоростью скачки пакетов ради защиты.
      • +2
        Кстати, я хочу понять, вы действительно считаете, что iptables достаточно для того, чтобы защититься от софта в системе? Даже если он от рута работает?

        Если бы у меня была задача сделать отсылку чего-либо из системы, то первое, что я сделал бы, это netlink модуль, который на iptables клал бы с большим присвистом.
        • +1
          Да уж, «век живи — век учись»… Это обход вроде этой схемы в этом посте?
          Согласен, это уязвимость. Выходит, нужно просто внимательно следить, какие модули ядра ставить? Ведь без рута (т.е. без согласия юзера) модуль не вставить.
          • 0
            Не обязательно так сложно. Если бы я имел своим намерением что-то подобное сделать, то я бы просто прописывал соответствующее правило в iptables (рут может вполне). Альтернативно — можно просто посылать из ядерного модуля, без сложного интерфейса до-после (так работает большая часть серверного сетевого софта — nfs-kernel-server, iet, scst, drbd и т.д.)
            • +2
              Добавил в статью.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Так у автора ведь в зашифрованном файле как раз и будет весь диск защищенной ОС.
      • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          При физическом доступе к компу можно воткнуть и аппаратный кейлоггер (делается своими руками из 2 микросхем, схем в сети полно), который может записать абсолютно всё, включая пасс на биос. Естественно, я проверю систему, если она побывает в чужих руках.
          • НЛО прилетело и опубликовало эту надпись здесь
            • +1
              Дядя Женя будет ругаться и визжать по-поросячьи. Он даже на Пунто ругается — при включении функции кейлоггера срабатывает эвристика. Притом что Пунто — в целом нормальная прога и отсутствует в базах. А если будет скрытый кейлоггер — стопудово попадёт в базу и будет уже 2 срабатывания. А на добавление в доверенные пароль нужен.
              • НЛО прилетело и опубликовало эту надпись здесь
  • +6
    Как-то у меня не вяжется безопасные прием-передача конфиденциальной информации и tor. При пользовании тором, я исхожу из предположения, что весь трафик на всех exit нодах снифается и анализируется. А также любая полученная страница может быть пооддельной.
    Т.е. передавать можно только ту информацию, которая попав в чужие руки будет совершенно бесполезной.
    Да, и по такой схеме многие приложения будут спотыкаться на днс-е. Сам когда-то настраивал, далеко не многие умеют днс- запросы через тор пускать.
    А даже если умеют, то из-за тупняков с днс-ом, все будет жутко тормозить. В данной схеме хорошо бы поднять ttdnsd + pdnsd, т.е. принудительное проксирование днс запросов и проброс их в тор. Со стороны приложений это будет выглядеть как обычный днс сервер, а при множественных днс запросах, непосредственно сам запрос будет только раз для домена, потом моментом будет вылетать из кэша.
    Схема такая: UDP dns -> proxy -> TCP dns запрос -> tor
    • +1
      Насчёт сниффинга: разумеется, что это возможно; однако, это возможно не только на торе, но и на обычном прокси, и просто на любом маршрутизаторе по ходу пакета. Так что в данном случае спасёт только HTTPS, и сам по себе тор — не угроза.

      Спасибо за добавления насчёт днс, попробую сделать. Однако сейчас особых тормозов не наблюдаю, за исключением торовских .onion доменов — но они всегда медленные. А днс в приложениях, в которых прописан тор, всегда уходит в тор — поскольку сайты открываются, а прямого днс-доступа нет (iptables), nslookup не проходит.
      • +1
        Нет тормозов, потому что у вас днс запросы наверняка идут напрямую. Это в принципе не проблема, но как бы несекурно считается, можно спалиться.

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

        Да, и http_proxy вообще много кто понимает. Большинство стандартных приложений не видят в упор, ну и чаще не могут работать по http.

        Как-то сам возился с подобными схемами, пришел к варианту с тоннелированием всего трафика через тор используя redsocks + tor + ttdnsd + pdnsd.
        • +3
          Как днс запрос может пройти напрямую?
          Доступ наружу есть только у пользователей, под которыми пущены демоны тора и i2p. Таким образом, браузер, работающий от меня, никак ничего не запросит напрямую. Писал же: команда вроде
          nslookup ya.ru
          не выполняется, ругаясь на отсутствие сети. Пинги тоже никуда не ходят.
  • +2
    Пользуюсь Liberté Linux с зашифрованной флешки. Все идет через TOR. Рекомендую
    • 0
      То есть, флешка без пароля бесполезна?
      • +5
        Полезна конечно же, но с паролем еще полезнее
        • +1
          Посмеялись.
          Я имел в виду, флешку можно потерять без боязни за данные на ней?
          • +2
            Совершенно верно, можно потерять, без пароля данные не увидят
    • +1
      Весь весь трафик идет через тор? Без проксей? Днс запросы тоже?
  • 0
    Не совсем понял необходимость установки TOR & I2P.
    Разве последнего недостаточно, зачем еще и TOR нужен? Если зачем-то нужен, хорошо бы эти пару объяснительных предложений добавить в статью.
    • +2
      Смысл в том, что для работы в инете лучше подойдёт TOR, поскольку это его основное назначение. У него много выходов по всему миру — большое разнообразие IP и хорошая скорость. И плюс .onion-ресурсы доступны только через него.

      У I2P же шлюзов в инет — всего ничего, поэтому ни разнообразия адресов, ни скорости нормальной. Хотя как запасная система сойдёт. Он рулит для работы внутри своей собственной сетки — на .i2p-ресурсах.
      • 0
        Можно еще воспользоваться каким-нибудь платным или бесплатным тунелем, например от VPN от Comodo
        • НЛО прилетело и опубликовало эту надпись здесь
        • +2
          И лишиться доступа к защищённым .onion и .i2p ресурсам? Эти ресурсы довольно ценны.

          Например, будь я на месте Ассанжа — я бы разместил на сайте в обычном интернете эту статью + дистрибутив I2P + несколько ссылок на гейты «инет -> I2P» (для нежелающих ставить себе маршрутизатор), а сам Викиликс хостил бы внутри I2P. И никакие «фуражки» к серверу бы не притронулись.
  • +1
    О, а паранойя не только у меня
  • +3
    >при помощи ядерных ракет можно не только устроить конец света, но и отогнать или расколоть угрожающий нашей планете астероид.

    только если брюс виллис поможет
  • +1
    Если бы вы создали готовый ISO диск типа Knoppix, то спрос, думаю, был бы хороший.
    С такого ISO диска можно загрузиться или запустить внутри VmWare или VirtualBox опять же.

    Но проблема с ISO диском — нет гарантии чистоты.
    Решение — создайте скрипт, который создаёт такой ISO диск, и всё будет прозрачно.
    • 0
      Tails же.
      • 0
        Мне кажется, или в нём на самом деле нет I2P? :)
        • 0
          Мне таки кажется:

          Tails' I2P integration is unfortunately not a very well documented (soon to be fixed) but it's there. It doesn't start by default, but can be started via:

          Applications -> Internet -> I2P

          In iceweasel, I2P will handle .i2p addresses while Tor will handle everything else-
  • +2
    Tor и I2P из песочницы надо выносить. Либо на хост (но тут надо думать об оставляемых следах и уязвимости хост-ОС, хотя о ней всегда надо думать), либо на соседнюю безголовую виртуалку с ограниченным роутингом и логами запросов на прокси-порты. Оба приложения обладают информацией о реальном IP (в общем случае, не знаю насчёт строго клиентских режимов работы), да и вирус, распространяемый среди пользователей этих программ, скорее всего будет внедряться в них же, чтобы работать с сетью.

    А потом надо молиться, чтобы в ядре VirtualBox и компонентах, типа Guest Additions (даже в самом программном интерфейсе, без установки), файрвола и сетевого драйвера на хосте, не было дырок.

    Как минимум, в такой схеме утекает информация о времени работы виртуалки (Prefetch, дата создания временных файлов и всё такое прочее), которое можно будет с чем-то сопоставить (это более общая проблема, которая, в частности, декларирует необходимость круглосуточной работы узла сети). Только полностью шифрованная система с загрузчиком либо на неперезаписываемом устройстве, либо криптографически подписанным.
    • +1
      В I2P можно отключить определение внешнего IP. При этом будет отключён транзит трафика, что снижает защищённость. TOR в клиентском режиме IP по идее не хранит, ему незачем — ведь логика работы такова: взял у трёх нод открытые ключи, закриптовал ими в три слоя пакет и послал.

      Насчёт дырок: как ни прискорбно, но дырки есть в любом софте. Поэтому единственный выход, ИМХО, регулярно обновляться. Но больше меня кошмарят не дырки, а закладки — поэтому для построения самого ядра безопасности я взял только открытые проги.

      Насчёт утечки данных о времени работы виртуалки: ну узнает кто-то, что есть у меня такая система, толку-то? Как я уже писал в статье, я не обязан сообщать пароль, нет такого закона в нашей стране, в отличие от Англии.
  • +4
    при помощи ядерных ракет можно не только устроить конец света, но и отогнать или расколоть угрожающий нашей планете астероид
    Вроде как по дискавери крутили, что, фактически, при приближении астероида ничего нам не поможет — на данный момент нет технических средств, способных сдвинуть с орбиты астероид достаточных размеров (размеров, когда он представляет действительную угрозу). Единственная причина существования ядерного оружия — человеческая натура. Люди ещё слишком тупы, чтобы обойтись без государств, воин, контроля над массами и проч. ненавистных некоторыми* суровых реалий жизни.

    По поводу tor. Явно выбор не для параноика. Его можно использовать как средство доступа к заблокированным ресурсам, но явно не как средство передачи секретных данных или нормальной анонимизации. I2P — да, тут лурк очень ярко и красочно рассказывает, как правильно фапать на эту сеть.
  • +1
    Спасибо за протестированный и доходчивый хау-ту. НО.

    Вводную часть и постановку задач нужно убрать. Просто «как настроить данную конфигурацию». Статья, претендующая на отношение к настоящей ИБ, должна содержать хоть какое-то подобие модели угроз. Что защищаем, от кого, в каких конкретно сценариях. А это вот «защитить целостность и конфиденциальность при приёме и передаче данных» — детский сад.
    Извините, ничего личного.
    • +2
      Да, возможно и правда глупо задачи выглядят. Убрал.
      Признаюсь: новичок я ещё в ИБ, студент. Но, думаю, всё ещё впереди.
      Введение всё же оставлю, а то получится обезглавленная статья. Да и нет там вроде ничего особенного, ИМХО.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      DNS запросы идут в тор, я уже об этом писал. Если бы они не шли в тор — они бы вообще никуда не ушли.
      А /home — для хранения защищаемых данных, разве не очевидно? Ведь система предназначена не только для сёрфинга, но и, как вариант, для скачивания/раздавания данных…
      • 0
        А не безопасней ли поставить свой DNS?
  • 0
    Интересное обсуждение
  • 0
    <шутка>
    Ну вот еще осталось спрятать шифрованный раздел например как я раннее писал:
    habrahabr.ru/post/59247/ и можно спокойно бояться чего нибудь другого. Хотя я б еще впн-чик прикрутил на хостовый компьютер и входящий по спутнику а исходящий канал по жопорезу пустил бы, ну и конечно же самому в бункер спрятаться не помешало бы в густонаселенной части города.
    </шутка>
  • 0
    Так и не понял причём тут NTFS.
    • +1
      На криптодиске лежат образы винтов VirtualBox, которые скорее всего больше 4 ГБ.
      Можно, конечно, и меньше сделать, но будет неудобно.
      • 0
        Ну автор вроде как писал без привязки к конкретной ОСи. было бы странным делать NTFS раздел под никсами.
        • +1
          с официального сайта трукрипта:
          You can create FAT (whether it will be FAT12, FAT16, or FAT32, is automatically determined from the number of clusters) or NTFS volumes (however, NTFS volumes can only be created by users with administrator privileges). Mounted TrueCrypt volumes can be reformatted as FAT12, FAT16, FAT32, or NTFS anytime.

          То есть, похоже, ни Ext, ни HFS не поддерживаются. Возможно, трукрипт при монтировании как-то работает с внутренним устройством ФС.

          В то же время современные линуксы поддерживают NTFS, маки вроде тоже, если поставить драйвер (у меня мака нет, не могу проверить).

          Что уж тут поделать, трукрипт явно ориентирован на винду. Например, умеет делать скрытой ОС только её, локализация тоже только в виндовой версии. Однако другого подобного кроссплатформенного и открытого проекта, AFAIK, не существует.
  • 0
    а почему бы не криптовать фс уже самой виртуальной Ubuntu её же средствами?
  • +1
    Спасибо, дай я тебя заплюсую!
  • 0
    Сделал все по инструкции – i2p не работает.
    • 0
      В каком смысле не работает? Не находит пиры, не устанавливает туннели или что?
      • 0
        504 Connect to www.i2p2.i2p:80 failed: SOCKS error: host unreachable
      • 0
        я так понял надо ставить privoxy и в нем зарзуливать что и куда пускать:
        все через tor socks5 127.0.0.1:9050
        i2p через 127.0.0.1:4444

        Но как быть с ssl i2p который нужно пустить через 127.0.0.1:4445
        • 0
          Я не ставил привокси. Разделение .i2p доменов и всего остального делаю при помощи аддона SwitchySharp в Хромиуме. Но это уже дело вкуса, кто-то использует Фокси и, например, аддон FoxyProxy. Можно и через привокси сделать, конечно.
          P.S. Советую именно хромиум, а не хром — поскольку хром не полностью опенсорсен.
          • 0
            Тогда понятно, просто в статье это не отражено
      • –1
        И все таки поддерживаю идею дописать использование своего dns + резолв таких зон как free, geek и тд.
        Ну и возможно использованием других анонимных сетей – была бы самая полная статья :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.