Содержание статьи
В первой части статьи «Использование средств криптографической защиты в ОС FreeBSD» я описывал установку ОС на зашифрованный корневой раздел. Но время идет, и враг не стоит на месте: с каждым новым днем появляются все более изощренные методы атак на безопасность систем. В этой статье я расскажу, как защитить носитель и мастер-ключи для загрузки ОС от заинтересованной стороны, дам рекомендации по выбору и использованию стеганографических инструментов, а также попытаюсь объяснить на пальцах трудности использования этой системы.
Видишь раздел? Нет? А он есть
Итак, у нас есть носитель, на котором записан каталог /boot с ключами. Было бы хорошо иметь на флешке скрытый раздел, с которого загружалась бы ОС, и чтобы ей самой можно было повседневно пользоваться в других системах. Это скрывает важность нашего накопителя от злоумышленника и на первый взгляд не вызывает никаких подозрений. Для UNIX-пользователей проблемы в этом нет, а вот для пользователей Windows они возникают на начальном этапе. Дело в том, что Microsoft «разрешила» сменным накопителям иметь только один активный раздел. Даже если поделить флешку на два раздела средствами все того же UNIX, а потом воспользоваться ей в ОС Windows, то будет виден только первый (активный) раздел.
Решений данной проблемы множество — от прошивки контроллера до подмены драйверов в ОС. Минусы и плюсы этих методов различны. Некоторые производители задумались об этом и предоставили соответствующие утилиты для тюнинга своей продукции. Другие просто забили. Собственно, про подмену драйверов и думать не стоит, так как такие девайсы будут работать только там, где об этом позаботились заранее. Поэтому воспользуемся одним элегантным способом, который поможет нам выполнить поставленную задачу. Иногда явные минусы ОС можно превратить в плюсы. Способность Windows иметь только один активный раздел нам поможет. Мы «распилим» наш носитель на две части и сделаем первый раздел активным. Им будем пользоваться в Windows-системах. Во второй, неактивный (с точки зрения Windows), мы запишем загрузчик, скопируем необходимые файлы и будем загружать нашу security OS. Так как неактивные разделы ОС Windows не отображает в обозревателе, мы скрываем само наличие раздела с загрузчиком.
Только не стоит забывать о том, что при использовании оснастки «Управление дисками» или другого стороннего софта этот неактивный раздел будет обнаружен.
Хакер #204. Шифровальщик для Android
Для еще большей правдоподобности необходимо будущий активный раздел рассчитать по «особой» технологии. Дело в том, что не бывает накопителей, равных 2, 4, 8, 16 Гбайт. Как правило, они меньше. Это своего рода маркетинговый ход, которым пользуются производители носителей информации, тем самым обманывая покупателей. Они считают, что в мегабайте не 1024 Кбайт, как нас учат в школе, а 1000. Поэтому, чтобы посчитать правильно раздел на четыре гигабайта, необходимо воспользоваться формулой:
4 000 000 000 / 1024 / 1024 / 1024 ≈ 3,725 290 298 461 914 байт, или 3720 Мбайт
Отлично! Теперь, когда все посчитано, поделено, сто раз перепроверено, будем действовать. Удалим все с нашего носителя:
WARNING
Перед уничтожением данных не забудь сделать бэкап!
# /sbin/gpart destroy -F da0
# /sbin/gpart create -s gpt da0
Создадим партиции для активного раздела Windows, загрузчика FreeBSD и каталога /boot:
# /sbin/gpart add -t ms-basic-data -s 3720 /dev/da0
# /sbin/gpart add -t freebsd-boot -s 64k /dev/da0
# /sbin/gpart add -t freebsd-ufs /dev/da0
Во второй строке мы указали тип партиции ms-basic-data
. Это основной раздел данных для семейства ОС Microsoft Windows. Он является эквивалентом FAT16, FAT32 и NTFS в MBR.
INFO
На странице справочного руководства man gpart(8) можно ознакомиться с полным списком поддерживаемых типов партиций.
Далее нужно записать загрузчик (так же, как в первой части статьи), но не забываем, что необходимо указывать, в какое место его поместить. Потому что первый, активный раздел (в терминологии Windows) у нас предназначен для повседневного использования. Для указания индекса партиции воспользуемся ключом -i:
# /sbin/gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 2 /dev/da0
Далее создаем ФС, монтируем раздел и копируем на него необходимые файлы для загрузки ОС. В итоге получилась физическая флешка, логически поделенная на две. Такой носитель будет работать в версиях Windows 7 и выше. Не забывай об этом, когда будешь использовать свой девайс.
При таком подходе стоит отметить одну маленькую, но очень важную деталь: наше ядро, которое лежит отдельно, мы не сможем обновлять напрямую. Об этом не следует забывать.
Есть несколько вариантов решения этой проблемы. На мой взгляд, самый надежный — это накладывать патчи безопасности непосредственно на GENERIC-ядро, которое лежит в системе. Дело в том, что наш каталог /boot, который остался на HDD после установки ОС, так там и лежит. По закону жанра, этот каталог должен был служить точкой монтирования для нашего съемного накопителя. То есть при загрузке системы флешка была бы смонтирована и стала бы частью файловой системы. Потом, чтобы ее извлечь после успешной загрузки ОС, пришлось бы сначала ее отмонтировать. Согласись, это не очень удобно. А оставлять ее торчащей в нашем сервере — не самая лучшая затея. Поэтому я намеренно не стал вносить изменения в /etc/fstab и делать /boot частью системы при инсталляции, а выбрал немного иной путь.
В директории /boot (на жестком диске) всегда лежит дефолтовое ядро, к которому можно применять патчи безопасности с помощью утилиты freebsd-update. По необходимости надо смонтировать съемный носитель и выполнить копирование пропатченного ядра на него. Если ты используешь кастомное ядро, то вначале его необходимо пересобрать из обновленных исходных кодов, а уже потом переносить. Не забывай, что утилита freebsd-update работает только с ядром GENERIC.
Бэкапомания, сэр!
Теперь необходимо подумать, как свести к минимуму ущерб от потери данных, которые записаны на flash-накопителе. Не секрет, что ничего вечного не бывает. И наш девайс не исключение. К тому же он может оказаться объектом пристального внимания злоумышленников, а также имеет для нас очень большую ценность. Решение напрашивается само собой — нужен бэкап. Люди делятся на три группы: тех, кто не делает бэкапы, тех, кто их делает, и тех, кто делает и иногда проверяет, что сделал. Я отношусь к третьей категории и поэтому сразу задумался, как бы безопасно сделать копию ключей.
На ум приходят разные мысли. Сразу оговорюсь, что дома, на работе и у близких родственников хранить что-либо не рекомендуется. Зачем впутывать кого-то в свои темные/светлые дела? Ни о чем не знающие родные люди расскажут всю подноготную, а на вопрос: «А не оставлял ли вам ваш внук/сын/брат что-нибудь?..» — не задумываясь, ответят утвердительно, так что не обольщайся. Можно спрятать, не поставив в известность, но тогда есть вероятность, что могут найти и выкинуть/подарить, а мы-то все время будем думать, что бэкап лежит целый и невредимый и ждет своего часа... Или можно просто передать и сказать, чтобы никому не отдавали, кроме... И таких ИЛИ будет сотня, если не две. Немного пораскинув мозгами и взвесив все за и против, я решил воспользоваться стеганографией.
Стеганография — это наука о скрытой передаче информации, когда сохраняется в тайне сам факт передачи. В отличие от криптографии, которая защищает от посторонних глаз содержимое секретного сообщения, стеганография скрывает сам факт его существования. Такое сообщение может выглядеть как что-либо иное: изображение, текст, музыкальный файл. Ее обычно используют совместно с методами криптографии, и они дополняют друг друга. Преимущество стеганографии над чистой криптографией состоит в том, что сообщения не привлекают к себе внимания.
Чтобы еще больше запутать следы, необходимо скрыть сам факт использования стеганографии. Советую не применять специализированное ПО на компьютере, где ты постоянно работаешь. Почему? Ответ, как ни странно, прост. Дело в том, что стеганография очень уязвима к атакам по обнаружению и вскрытию. Наличие стеганографического программного обеспечения на захваченном компьютере служит хорошей подсказкой для злоумышленника. Как показывает практика, многие программы для стегоанализа работают лучше, когда есть ключевая информация о типе использованных стеганографических алгоритмов. Обнаружение такого ПО на рабочей станции дает повод подозревать, что ты баловался стеганографией, и более детально изучить исследуемую машину. Для подобных целей лучше воспользоваться компьютером знакомого, портабельным софтом, виртуальной машиной или Live CD.
Инструментарий, который нам может помочь в этом нелегком деле, впечатляет изобилием. Как говорится, есть где разгуляться. Но при его выборе отдавай предпочтение свободно распространяемому ПО. Это сведет к минимуму наличие закладок в коде. Еще лучше, если оно будет кросс-платформенным. К сожалению, большинство программ-кандидатов скупы на функциональность: либо работают с одним форматом контейнера, либо скудны в выборе криптографических алгоритмов. Я остановился на steghide. Она хорошо документирована, подходит под мои требования и легка в использовании. Для Windows-пользователей ее можно скачать с официального сайта. Если ты решил воспользоваться FreeBSD, то устанавливай из портов:
# cd /usr/ports && /usr/bin/make search name=steghide
Далее я буду описывать работу программы под MS Windows. Все сказанное подойдет и под любую другую ОС. После распаковки архива и изучения мануала приступаем к работе. Утилита поддерживает несколько основных команд:
- embed — встроить файл в контейнер;
- info — получить информацию о содержимом контейнера;
- extract — извлечь файл из контейнера;
- encinfo — получить информацию об используемых алгоритмах шифрования (default AES-128).
Основные используемые опции:
- -ef file — имя скрываемого файла;
- -cf file — имя контейнера, в который скрываем файл;
- -sf file — имя контейнера при извлечении;
- -xf file — имя файла при извлечении из контейнера;
- -v — подробный режим;
- -e [mode] [algo] — выбор режима и алгоритма шифрования.
На основании перечисленного полная команда выглядит так:
# .\steghide embed -cf logo_xakep.bmp -ef da0.key -e cbc twofish
Контейнером для ключа da0.key (5 Кбайт) будет изображение logo_xakep.bmp (108 Кбайт), а криптографическим алгоритмом станет twofish в режиме сцепления блоков (cbc). Если все указанные файлы находятся в директории с программой, то steghide запросит два раза пароль и после этого сделает свое темное дело.
Получить информацию о контейнере можно с помощью команды info:
# .\steghide info logo_xakep.bmp
Steghide спросит разрешения, показывать или нет информацию о скрываемом объекте, его размере, алгоритме шифрования и прочем. Для извлечения информации из контейнера воспользуемся командой extract:
# .\steghide extract –sf logo_xakep.bmp
Программа спросит пароль и, если не указан флаг –xf, попросит разрешения на перезапись файла в каталоге на случай, если такой уже существует.
Обрати внимание, что программа поддерживает четыре формата файла-контейнера: AU, BMP, JPEG и WAV. Когда ты указываешь имя контейнера, программа сама автоматически определяет его формат.
Теперь поговорим о некоторых правилах использования стеганографии. Если контейнером служит картинка, то тут необходимо придерживаться некоторых условий. Во-первых, не нужно брать изображение из интернета. Если злоумышленник найдет оригинал и сравнит контрольные суммы его и модифицированного изображения, которое по совместительству работает контейнером, то он еще раз убедится в правильности хода своих мыслей. Звучит абсурдно, не правда ли? Но кто предупрежден, тот вооружен! Из этого следует вывод, что изображение должно быть уникальным.
Во-вторых, для скрытия информации лучше всего брать графические файлы высокого разрешения. Чаще всего используется подход самого младшего бита, или, как его еще называют, LSB (least significant bit). Многие типы файлов содержат определенное количество битов, которые могут быть изменены так, что это будет незаметно для человеческого глаза, а также не приведет к увеличению размера файла. Именно в этих битах скрывают информацию. Цифровое изображение — это файл, в котором хранится информация о цветах отдельных пикселей, составляющих изображение. Чем больше файл, тем больше битов в нем может быть незаметно изменено. Из этого следует другой вывод: не все файлы подходят для роли контейнеров.
В результате у нас есть скрытый в изображении или звуковом файле ключ, без которого загрузка ОС невозможна. Оставлять его в недрах своего ПК/сервера — не очень хорошая идея. Куда его можно припрятать? Это ограничивается только твоей фантазией. Если это картинка, то можно загрузить ее на фотообменник или на чужую страничку в социальной сети. Добавить на аукцион в виде описания продаваемого товара. Залить на фейковую страницу сайта знакомств или купить электронную фоторамку, записать туда фотографий и подарить любимой собаке :). Если же это MP3, то можно прожечь диск с любимыми треками, положить в машину, слушать со спокойной душой и не беспокоиться. Конечно, лучшее решение — сделать несколько копий, а потом раскидать их по разным уголкам глобальной сети.
Хочется также отметить, что это не все возможности утилиты. Прочитав внимательно руководство к ней, ты найдешь еще несколько вкусных фишек, которые помогут оставить твои маленькие секреты в неприкосновенности.
Ядерный передел
Напоследок хочется отметить, что было бы неплохо включить geli в ядро. Это даст прирост производительности при работе подсистемы шифрования в целом. Хотя на слабо нагруженной машине ты этого не почувствуешь. По поводу ядерных и модульных компонентов систем ведутся ожесточенные споры на просторах интернета. В лагерях сторонников и защитников не угасают страсти. Мое мнение таково: если ты собираешь свое кастомное ядро, то добавить одну-две строчки в конфигурационный файл ядра не составит труда. А если ты решил обезопасить свою систему, то кастомное ядро — это еще один кирпичик в твоей безопасности. Ты просто обязан пересобрать ядро, исключив из него все ненужное. Хуже от этого точно не станет, а вот приятный плюсик получишь наверняка.
В любом случае при использовании такой системы ты по умолчанию получаешь вагон неудобств. Например, если выключат свет, то система уже сама не загрузится до пользовательского режима без твоего участия. Постоянно следить за актуальностью ядра, своевременно его компилировать, переносить — это занятие не для ленивых. Каждый выбирает сам, под какие нужды ему использовать такую систему, а я, в свою очередь, постарался максимально доступно описать возможные подводные камни в ее повседневной работе. Безопасные системы трудны в построении и недружелюбны. Они громоздкие и неудобные. Но именно это делает их неприступными для тех, кто пытается ими завладеть.
Существует много примеров, когда до зубов вооруженные шпионы терпели фиаско перед грамотно спроектированными системами. Правда, это не дает нам права расслабиться. Поэтому будь бдителен и помни: идеальной защиты не существует.
INFO
На страницах «Руководства FreeBSD» можно прочитать про сборку и установку кастомного ядра и подсистему шифрования geli.