id: Гость   вход   регистрация
текущее время 23:19 19/04/2024
создать
просмотр
редакции
ссылки

Инструкция по отрицаемому хранению данных на носителе с Tails

Цель


Иметь на одном и том же носителе как загрузочный Tails, так и хранилище для дополнительных данных, которое не будет вычищаться перезагрузкой, причём это хранилище должно быть отрицаемым.

Общая идея


На носитель устанавливается Tails, а на оставшемся свободном месте диска (в хвосте) делается бессигнатурный шифрованный раздел для хранения данных.

Легенда


Затёрли флэшку/диск/SD-карточку рандомом, потом записали стандартный Tails по инструкции с сайта, и всё на том. Больше ничего не делали, никаких скрытых данных нет.

Подводные камни


  1. В ядре Linux решили не заморачиваться консистентностью разных компонент ядра, просто запретив их взаимодействие. Итог: всё dm-based (dmsetup, cryptsetup, LVM) совместимо между собой, но несовместимо с монтированием файловой системы. В частности, если на диске /dev/sda есть файловая система на /dev/sda<N>, и она подмонтирована, нельзя адресовать свободное (неразбитое) дисковое пространство на /dev/sda с помощью dmsetup или cryptsetup (ядро ставит bd_claim на блочное устройство /dev/sda, запрещая его использование dm'у; задаваемые оффсеты и размеры при этом совершенно неважны). Однако, если файловая система находится на ином блочном устройстве (важен логический, а не физический уровень) — к примеру, на /dev/mapper/name, который зацеплен на /dev/sda<N>, монтирование этой ФС не будет препятствовать использованию dm/cryptsetup на /dev/sda.1

  1. По умолчанию Tails не грузит все файлы в память, а каждый раз запрашивает их с диска/флешки, т.е. файловая система с диска будет всегда подмонтирована. Из-за предыдущего пункта это блокирует возможность использовать неразбитое дисковое пространство для хранения данных. Можно, конечно, загрузить Tails, потом на лету менять MBR, добавляя и убирая нужные разделы, но это геморройно, грязно и может испортить легенду.

Недокументированные возможности


С помощью реверс-инжиниринга можно выяснить, что в Tails есть тайная недокументированная опция загрузки, которая держится в строжайшем секрете — toram («to RAM»). Она позволяет вэйпонизировать Tails в нужном направлении: в самом начале загрузки, когда выводится меню isolinux с двумя вариантами (обычный и fail-safe), выбираем нам нужный, нажимаем tab, дописываем toram к опциям загрузки и грузим. После этого Tails будет загружен в память, а файловые системы на носителе, с которого он был загружен, не будут подмонтированы — носитель можно будет даже отключить, и Tails продолжит работать из RAM.

Семь шагов на пути к успеху


  1. Затираем весь диск/флешку [1], [2].

  1. Следуя инструкциям на сайте Tails, с помощью isohybrid преобразовываем iso в образ, нужный для записи на флешку/диск.2 (Примечание: возможно, в этом уже нет необходимости).

  1. Записываем получившийся образ с помощью команды
    # dd if=/path/to/file.iso of=/dev/sdb
    (предполагаем, что запись идёт на /dev/sdb). Это создаёт на устройстве MBR и таблицу разделов, в первом разделе (/dev/sdb1) будет находиться Tails.

  1. Создаём бессигнатурный шифрованный раздел на неразбитом пространстве диска:3
    # cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -o оффсет create NAME /dev/sdb
    Оффсет (задается в секторах) можно не запоминать, потому что его легко посмотреть fdisk-ом — это последний сектор первого раздела + 1. В данном случае мы используем вариант «выделяем всё пространство до конца диска». Однако, лучше сделать иначе: если размер носителя позволяет, взять какой-то фиксированный offset побольше, чтобы при последующем обновлении Tails и его записи на этот же носитель через dd (размер может увеличиться) наш бессигнатурный раздел не был затёрт.

    Вышеприведённая команда cryptsetup создаёт устройство /dev/mapper/NAME с несменяемым паролем на шифрование. Внутри него лучше создать LVM с LUKS-шифрованными логическими томами или просто один LUKS-раздел на всё устройство, чтобы не терять возможность менять пароль, убивать слоты и т.д. Как это сделать технически — уже обсуждалось [3], [4].

  1. Если работаем c SD-карточки, имеющей физический переключатель для блокировки записи, включаем его: на этапе загрузки запись на носитель нам не понадобится.

  1. Грузимся, включая опцию загрузчика toram (см. выше).

  1. При поставленном локе на адаптере (см. п.5, этот комментарий только на случай, если он используется) и dmsetup и cryptsetup позволяют создавать только read only mappings, причем cryptsetup умный и сам догадывается включить режимр r/o, а вот dmsetup'у надо указывать опцию -r явно. В предположении, что нужный раздел с данными уже заранее создан на свободном дисковом пространстве, монтируется он так же:
    # cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -o оффсет create NAME DEVICE
    (остальные опции подключения LUKS/LVM добавляем по вкусу, если нужны). Если же нужно сделать r/w-доступ к скрытому разделу на SD-карте, надо:

    1. Достать SD-карту (предполагаем, что она не подмонтирована).
    2. Объяснить ядру, что мы её достали (бывают «умные» адаптеры, которые usb disconnect не ловят, пока к SD-карте не обратишься).
    3. Cнять лок и перевставить SD-карточку.
    4. Подключить скрытый раздел и смонтировать его в режиме r/w.

    Потом аналогичным образом можно вернуть носитель в состояние r/o и снова поставить лок (и всё это делается без перезагрузки Tails!). Понятно, что загрузка с r/o-носителя, а также физическое отключение записи на время, когда она ненужна, повышают безопасность (Вдруг Tails будет взломан? Атакующему будет тяжелее поменять загрузочный образ).


1Уже давно пора разделы диска делать принудительно через dm, тогда бы такой проблемы не возникло вообще. Некоторые пояснения:

1) fdisk (а равно dd и т.п. проги) не делают так называемый bd_claim — это обращение к ядру с заявкой на использование, а dmsetup его делает, и именно на этой стадии его обламывают. Судя по всему, авторов Linux заботит консистентность ядра самого с собой, а не ядра и юзерленда.
2) Дело не в том, что раздел открыт на запись; дело в том, что при монтировании ФС ядро делает bd_claim. Таким образом, никакая другая компонента ядра не может сделать bd_claim на подраздел и блочное устройство (диск) в целом (т.е. дело не в том, где физически находится монтируемый подраздел, а в том, логической частью какого блочного устройства он является — bd_claim делается именно на блочное устройство; из-за этого можно без проблем подмонтировать mapping и это ни на что не повлияет — каждый mapping сам по себе блочное устройство).
3) Это проблемы Linux, а точнее — интерференция системы подразделов и системы dm. Во имя консистентности был забит костыль, дабы эти подсистемы не мешали друг другу. В общем, как всегда, проблема legacy и эволюционного проектирования.

Монтирование ФС — это частный случай bd_claim. Важно то, что

a) Никакие две раздельные компоненты ядра не могут одновременно делать bd_claim на блочные устройства и подразделы в них.
b) Одна и та же компонента ядра может это делать без ограничений. Например, всё, что делается через dm (это и dmsetup linear, и dm-crypt, и LVM) совместимо друг с другом.

Т.е. dm внутри себя поддерживает консистентность маппингов, а костыль с bd_claim сделан, чтобы не заморачиваться консистентностью разных подсистем ядра для доступа к одним и тем же блочным устройствам.
2Обычные iso'шки не поддерживают загрузки с флэшек хотя бы потому, что там нет MBR нет и т.п. Гибридные iso когда делаются, а когда нет — это от авторов зависит. Не исключаю, что в Debian iso гибридные по умолчанию.
3Поскольку по умолчанию TRIM отключен, микроконтроллер не знает, какие сектора диска ОС считает свободными. Для нашего случая это хорошо, т.к. неиспользуемое место не будет обнуляться в случае флэшек и SD-карточек.


 
На страницу: 1, 2, 3, 4, 5, 6, 7, 8 След.
Комментарии [скрыть комментарии/форму]
— Гость (01/02/2015 12:49)   <#>
Все здесь конечно красиво пишется, но сам факт использования Tails на флеш может привлечь дополнительное внимание.
— Гость (01/02/2015 12:50)   <#>
В ТС все таки более фундаментальный подход к скрытию информации (секретная ОС). Так же не размеченное пространство, но хоть система основная-типовая.
— Гость (01/02/2015 13:45)   <#>

Fxd. Паранойте по полной, если параноите.


Кстати, в описанном случае думаю, что лучше иметь на флешке простую Убунту, а на сокрытом разделе уже TAILS со всем вышеописанным, чтобы не было вопросов по факту наличия криптодистра на флешке при угрозе выдачи пароля.
Всё можно, но цена этого — лишний геморрой по приезду на новое место. Если думать в этом ключе, достаточно взять любой нормальный нейтральный LiveCD и SD-карточку с бессигнатурно шифрованными данными (ОС, дистры, данные). На месте на неё же или на другую карточку записываем Tails и вперёд.


На pgpru подход фундаментальней, а TC сосёт. И вообще...

То, что в этом топике — это некий концепт. При желании он переносится на любой другой LiveCD / бессигнатурку / что-либо ещё. Просто, как говорится, раз даже в Tails геморятся с persistent-разделом, значит, это кому-то нужно. ☺
— Гость (01/02/2015 15:38)   <#>

Сам факт использования Tails в данной схеме уже говорит о том, что эта ОСь из модели угрозы исключена.


Существует ли возможность развить схему и отрицаемо засунуть перзистентный раздел в неразбитую часть флешки?
— Гость (01/02/2015 16:10)   <#>

Думаю, да, но для этого придётся курить внутренности Tails и того, как там организован этот самый persistent-раздел. Лично мне он не нужен, и я этим поэтому пока заниматься не собираюсь. Если у кого-то есть желание потерпеть успех на пути имплементации это фичи — всегда welcome.
— Гость (01/02/2015 16:33)   <#>

Понятно. Может быть есть рекомендации по отрицаемому сохранению настроек и БД пользовательских аппликаций без перзистентного раздела, т.е. в неразбитой части флешки?
— Гость (01/02/2015 18:03)   <#>
Я не вижу сложностей в том, чтобы легко цеплять конфиги не из $HOME, а из /path/to/dir; переопределение домашней директории для всего или конкретного приложения — основа основ работы в UNIX. Возможно, чтобы цеплять persistent-раздел откуда-то с другого места, достаточно пары лишних комнад, но это надо смотреть, как оно там устроено.
— Гость (01/02/2015 20:39)   <#>

OK.


Перечитываю форум, но инфы много и пока не получается уяснить для себя некоторые особенности. Какие угрозы безопасности данных и отрицаемости их существования могут возникнуть, если не создавать LVM/LUKS-тома, а пользоваться просто бессигнатурным контейнером с несменяемым паролем на шифрование?
— Гость (01/02/2015 21:13)   <#>

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

Во-вторых, мало ли где и когда в будущем вы решите, что ваш пароль мог утечь или кем-то подсмотрен. Есть такой риск? Есть. Вам когда-нибудь снились криптокошмары, нет? Значит вы ещё не знаете, что такое ИБ. А мне снились. Что в случае криптокошмара будете делать? Для LUKS — это одна команда и всё, проблем нет (если, конечно, атакующий не получил административный доступ и не сдампил мастер-ключ), для бессигнтурно шифрованного же вам придётся переносить куда-то все данные, затирать диск, а потом снова создавать «раздел», но уже с другим паролем. Тут я для простоты не учитываю нюансы типа существования бэкапов хидеров LUKS (что рекомендуется), но концептуально картину они не меняют. Внешний пароль на бессигнатурку — это именно что затычка против внешнего анализа, ничего более она не даёт, а LUKS — удобный комбайн для всего и вся, но показывать всем его наличие на диске не стоит.

Кстати, учтите, что на один пароль можно иметь только один бессигнатурно шифрованный раздел. Я это осознал слишком поздно, месяцы спустя. Очередной раз про себя подумал:

Я каждый раз убеждаюсь и самостоятельно, и с чужой помощью, как легко это можно сделать в любой момент [взломать меня], что давно надоело относиться всерьёз ко всему этому "security theater".

Я тут круглосуточно пасусь 10 лет, но продолжаю палиться на таких мелочах. А сколько ещё у меня дыр в безопасности, о которых до сих даже не подрзреваю? Страшно подумать. Каждый месяц, каждый год открываю для себя что-то новое, о чём не знал раньше (всякие «оказывается, ещё и вот так можно атаковать!»).
— Гость (01/02/2015 21:18)   <#>

Ну да.. А вообще, проглотил флешку перед границей и высрал вынул на "вражеской" территории.
FXD. Пользуемся и наслаждаемся.
— Гость (01/02/2015 21:19)   <#>

просветите в чем геморррр?
— Гость (01/02/2015 21:22)   <#>

Все. Гипс снимают, клиент уезжает. Все плохо.
А в чем собствено трагедия, что вы не хотите этим заниматься? В том что в мире вообще больше некому этим заняться? Вы единственная надежда?
— Гость (01/02/2015 21:28)   <#>


Так ваш кошмар из МТС. Там когда меняешь пароль для входа в Личный кабинет приходит такой СМС. Поменяйте провайдера и все встанет на место. А лучше перестаньте пользоваться сотовой связью. Берите пример со старших товарищей (unknown).
— Гость (01/02/2015 21:34)   <#>

no comments. Начните себя вести уже как человек.

Можно отметить, что вы пытаетесь развиваться.
Первый абзац ответа по сути, остальное – пустая лирика.
— Гость (01/02/2015 22:25)   <#>

Не один вы такой умник. Контроль безопасности в аэропорту не пройдёте, там же сканеры. ☺


В том, что есть некая фича, которую-таки решили имплементить и поддерживать несмотря на её риски для безопасности (амнезия при persistent-разделе не полная).


Нет конечно, наоборот, добровольцы горячо приветствуются:

Если у кого-то есть желание потерпеть успех на пути имплементации это фичи — всегда welcome.


У меня никогда в жизни не было МТС-овской симки. Получение СМС — стандартная процедура у всех ОПСОСов. Не могу сказать, что часто ею пользовался, максимум — считанные разы в жизни.


Я и так ей почти не пользуюсь.


Что именно вам не нравится?


Развёрнутый ответ на чей-то вопрос. Ответы на ваши вопросы, которые другим кажутся глупыми, кто-то тоже может посчитать пустой лирикой, но вы ж в публичном месте общаетесь, а не у себя дома, чтобы ориентироваться исключительно на себя.
На страницу: 1, 2, 3, 4, 5, 6, 7, 8 След.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3