SATtva Персональная страница
темы архив все rss xml 2.0
 
 
блог
досье
связь
english
 

Шифрование дисковых разделов действующей Linux-системы

16.07.2008
линукс

Предпочтительный подход к шифрованию дисковых разделов Linux-систем заключается в их подготовке на этапе инсталляции дистрибутива, что реализовано во многих из них или может быть выполнено вручную с помощью большого разнообразия руководств (например, исчерпывающая инструкция для Генты). Так минимизируется риск утечки открытого текста при последующем переходе на шифрование системы. Однако, зачастую пользователь приходит к необходимости шифрования диска уже в процессе работы с системой, в связи с чем возникает закономерная проблема: как произвести операцию за минимальный срок и с минимальным ущербом для системы в её текущей конфигурации.

Простейшее решение, наиболее пригодное для обычных дистрибутивов, а не custom-систем собственной сборки, -- сделать на внешнем носителе зашифрованную копию /etc и /home, затем многократно перезаписать разделы с ценными данными (простым dd или wipe/shred) и, наконец, переустановить систему, но уже с шифрованием диска. После чего можно восстановить пользовательские данные и системную конфигурацию из резервной копии.

Такое решение, однако, менее пригодно для той же оптимизированной Генты, где перекомпиляция свежеустановленной системы может занять до нескольких десятков часов машинного времени. Как одно из решений для такой ситуации можно предложить изготовление Stage4. Если есть, куда положить готовый стейдж на время работы с диском. Также в этом случае понадобится альтернативная система (скажем, LiveCD), из которой будет выполняться работа. В остальном порядок операции тот же, как описанный в предыдущем абзаце.

Третье решение, которое лично мне нравится больше, требует наличия на жёстком диске (на основном или подключаемом) некоторого свободного места. Сколько? Столько, сколько занято на самом заполненном из ваших разделов (в абсолютных величинах, а не в процентном соотношении); вы ведь не пихали всю систему на один раздел, не так ли? Помимо сравнительно небольшого количества свободного места этот вариант требует некоторых телодвижений, зато позволяет производить операцию в несколько присестов, т.е. совершенно без простоя работы. Итак:

0. С помощью fdisk/cfdisk создайте дисковый раздел (предположим, что это /dev/sda10, будем называть его временным) такого объёма, чтобы туда поместилось содержимое из самого заполненного раздела. Зашифруйте раздел с помощью cryptsetup, отформатируйте под ext2 и монтируйте в произвольную точку (пусть это будет /dev/mapper/tmp, а монтировать его будем в /mnt/tmp). (Пытливый читатель может самостоятельно прибегнуть к Reiser4 со сжатием, чтобы ещё более снизить требования к объёму раздела.)

1. Выберите любой из дисковых разделов, исключая содержащий корневую ФС (допустим, /usr), скопируйте его содержимое в /mnt/tmp.

2. Отредактируйте /etc/fstab, указав для точки монтирования /usr устройство /dev/mapper/tmp, и перемонтируйте файловую систему.

3. Дисковый раздел, где /usr находилась изначально, многократно перезапишите (чтобы исключить восстановление открытого текста, хотя для таких разделов, как /usr, это может быть и не критичным), зашифруйте, отформатируйте, подмонтируйте (теперь это будет криптоустройство /dev/mapper/usr, смонтировать можно в ту же /mnt/tmp) и перенесите обратно файлы из временного раздела (который сейчас смонтирован как /usr).

4. Повторно измените настройки fstab: теперь для точки монтирования /usr нужно указать устройство /dev/mapper/usr (или как вы его назвали). Перемонтируйте файловую систему.

5. Укажите в настройках dmcrypt (/etc/conf.d/dmcrypt или в ином месте, в зависимости от вашего дистрибутива) нечто подобное:
target=usr
source='/dev/sda5'

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

Прежде чем зашифровать корневую ФС, необходимо создать initramfs. Описание этого процесса выходит далеко за рамки этого поста и подробно изложено, в частности, в отмеченном в начале руководстве. Более того, гентушная утилита genkernel автоматически создаёт подходящий образ initrd (в этом случае убедитесь, что cryptsetup собран статически, т.е. без use-флага dynamic). Имейте в виду, образ initrd от genkernel не поддерживает работу с ключами, зашифрованными GnuPG; если нужна такая функциональность, образ придётся допиливать вручную (это тема для отдельного поста, если кто-нибудь выкажет интерес в материале).

Когда initrd будет готов и работоспособен (обязательно проверьте, загружается ли с ним система), можно завершить зашифрование корневой ФС. На всякий случай запаситесь LiveCD (очень желательно, если с cryptsetup; Gentoo LiveCD 2008 его содержит), с которого в экстренном случае можно будет исправить настройки загрузчика и fstab. Затем:

1. Выполните шаги 1 и 2 (список выше), но без перемонтирования ФС.

2. Внимательно настройте загрузчик, используя опции initrd (их вы можете найти в руководстве, по которому создавали образ; если использовали genkernel, смотрите man, раздел INITRD OPTIONS). Зачастую, это что-то вроде
kernel /boot/kernel init=/init root=/dev/ram0 crypt_root=/dev/sda10
initrd /boot/initramfs
(Обратите внимание на /dev/sda10 -- это пока зашифрованная копия корневой ФС из временного раздела.)

3. Перезагрузите машину. Если всё пройдёт нормально, вам будет предложено ввести пароль к загрузочному разделу. Если нормально не пройдёт -- запускайте LiveCD, возвращайте назад настройки fstab (с незашифрованной копии корневой ФС) и загрузчика и ищите причину проблемы.

4. После успешной загрузки выполните шаги 3 и 4 (тоже по первому списку), опять же, без перемонтирования ФС.

5. Перенастройте загрузчик, чтобы теперь crypt_root указывал на постоянный раздел с корневой ФС (вероятно, это /dev/sda1, но очень может быть и иначе). Пункт 5 из первого списка для корневой ФС не нужен. Можете перезагружать машину.

Если загрузка пройдёт штатно, удалите временный раздел. Вот и всё, собственно. До новых встреч.

Ниже -- пара частых вопросов. Не столько по содержанию этой краткой инструкции, сколько по опыту общения с людьми на данную тему.

А какой смысл в том, чтобы шифровать систему целиком, если реально ценные данные лежат у меня только в /home?

Оставляя незашифрованными, скажем, /usr или /etc, пользователь оставляет и вектор атаки: противник с физическим доступом к системе может легко подменить любой исполняемый файл на затрояненную копию или иным образом компрометировать систему. Можно минимизировать такой риск тонкой настройкой AIDE (аналог Tripwire), но здесь велик шанс перетянуть гайки или, напротив, оставить где-то окно.

Хорошо, а зачем держать ядро и initramfs на отторгаемом носителе?

По той же причине: имея физический доступ к ПК, можно подменить ядро копией, содержащей, например, модуль-кейлоггер, который запротоколирует и отправит по сети шифровальные ключи от разделов диска. И здесь уже не поможет никакая AIDE.

Как сделать, чтобы при загрузке системы не спрашивался пароль для каждого из зашифрованных разделов?

Можно зашифровать паролем только корневую ФС. Остальные разделы зашифровать случайными ключами. Сами ключи положить в /root/.keys (или иной каталог, находящийся на коневой ФС и доступный только для рута). Путь к этим ключевым файлам указать в настройках dmcrypt: key='/root/.keys/usr-keyfile' для каждого из крипторазделов.

Почему здесь не приведено пошаговое руководство?

Потому что это не пошаговое руководство (ссылку на таковое я привёл в самом начале). :-) А также ради экономии моего времени и дабы побудить интересующихся почитать маны. Иначе и с пошаговым можно наделать косяков и остаться с неработающим компом.
Комментарии

Re: Шифрование дисковых разделов действующей Linux-системы от paranoid ant

17.07.2008 10:36

шифруя систему целиком, а не только раздел содержащий приватную информацию вы устраняете еще один возможный способ оказать на вас давление, к сожалению существует практика "подбрасывания" компрометирующей информации на компьютер в процессе проведения следственных действий против вас

коментарии от paranoid ant

17.07.2008 10:39

Влад, уберите отображение email в комментариях или хотя бы не отображайте их открытым текстом спам боты не дремлют

емэйлы комментаторов от SATtva

17.07.2008 15:01

Угу, убрал.
Оставить комментарий
Заголовок:

Текст:

Ваше имя:

Ваш e-mail:


Код подтверждения: