Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть II

Этап #11.
Добавление tcplay в образ initrd.

Для этого создаем какой-нибудь временный каталог и распаковываем туда из пакета (tc-play-2.0-i486-1.tgz в моем случае) полученного на этапе 8 файлы (дальнейшие пути внутри пакета)
usr/lib/libtcplay.so.2.0
usr/sbin/tcplay
Я просто воспользовался mc, зашел им в архив и нужное скопировал клавишей F5 в /tmp/tc-play, mc сам вызвал архиватор и распаковал все за меня.
Далее, выходим из архива и копируем во временный каталог (ну чтоб все нужные файлы были в одном месте и мы не запутались) файл
/lib/libdevmapper.so.1.02 (если при создании initrd, вы пользовались опцией –L, то эта библиотека уже на месте)
Теперь из временного каталога (да, можно было и сразу) скопируем файлы
libtcplay.so.2.0
libdevmapper.so.1.02
в /boot/initrd-tree/lib
(каталог библиотек файловой системы initrd)
а файл
tcplay
в /boot/initrd-tree/bin

Также tcplay во время своей работы, а конкретно подключения зашифрованных разделов вызывает из каталога /usr/sbin программу dmsetup. Соответственно, необходимо положить dmsetup в /boot/initrd-tree/usr/sbin

Чтобы dmsetup работал правильно, ему необходим каталог /dev/mapper, его тоже надо создать
mkdir /boot/initrd-tree/dev/mapper

Далее выходим из каталога initrd-tree, удаляем из директории /boot ранее созданный initrd.gz и запускаем mkinitrd без параметров, далее примонтируем нашу загрузочную флешку, заменяем файл /mnt/sda2/absolute/initrd.gz на пересозданный initrd.gz, перезагружаем компьютер и выбираем созданный на этапе 8 пункт для тестирования initrd.gz

Если все сделано правильно, то в конце загрузки будет выведено сообщение «Hello, world!» и приглашение оболочки, в котором мы введем команду tcplay. Программа должна выдать краткую справку по своим параметрам. После чего вводим команду exit и загружаемся в основную ОС.

Этап #12.
Генерация ключа для шифрования.

Для генерации ключа можно взять данные из /dev/urandom.
Если было несколько перезагрузок основной ОС и ОС некоторое время работала, то это должно быть довольно надежно. Хотя при написании данной статьи я и сомневался в этом, но мои сомнения были развеяны более опытными специалистами 🙂
Можно также воспользоваться генератором ключевых файлов, входящим в комплект Windows или Linux-версии Truecrypt, в таком случае следует использовать версию 7.1a, последнюю на момент закрытия проекта Truecrypt, скачать каковую можно, например отсюда.

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

Вот команда для генерации ключа с помощью /dev/random – стандартного устройства для получения псевдослучайных последовательностей
dd if=/dev/random of=/путь/к/файлу/имя_файла bs=1 count=256

Команда dd подробно описана, например, здесь


Этап #13
Или о хранении ключа.
Есть два, на мой взгляд, очевидных места, где наш ключ должен храниться:
1. Либо в самом образе initrd
2. Либо на разделе флешки с загрузчиком ОС

В первом случае, можно создать отдельный каталог, например keys в /boot/initrd-tree, куда скопировать ключ (либо скопировать его в любое понравившееся место в /boot/initrd-tree и запомнить, куда вы скопировали ключ), после чего пересоздать initrd, выполнив mkinitrd без параметров.

Во втором случае – просто положить ключ в любое удобное место на ext2 разделе загрузочной флешки.

Недостаток первого способа в том, что если вы поменяете ключ, или добавите дополнительный, вам придется опять пересоздавать initrd. Недостаток второго в том, что нам придется добавлять в наш скрипт лишнюю команду для монтирования флешки, а после вызова tcplay для расшифровывания раздела (-ов) отмонитровать флешку.

Но это мелочи, и как поступать решать вам.

Во втором случае в наш скрипт myinit нужно добавить команды:
mkdir /mnt/bootflash
mount –t ext2 /dev/sdb2 /mnt/bootflash
Естественно, если вы делаете это в тестовом initrd, то команды надо добавлять перед вызовом /bin/sh

Первая команда – создание точки монтирования, и она обязательно должна быть добавлена перед командой монтирования, если вы перед созданием initrd не создали пустой каталог под точку монтирования. Помните – изменения, внесенные в файловую систему образа initrd, когда он загружен в память сохранены не будут и исчезнут после того, как скрипты в initrd передадут управление программе инициализации основной системы.

После вызова команды расшифровки (о которой будет сказано далее) необходимо вызвать команду размонтирования флешки:
umount /dev/sdb2

В дальнейшем я буду считать, что ключ доступен, и путь к нему указывать в условном виде /path/to/key/keyfile.key

Этап #14
Дополнение тестового образа initrd программой mkfs и kpartx

К сожалению, в моем initrd не оказалось программы для форматирования раздела жесткого диска в файловую систему ext2 (busybox смог только в fat32, а это меня не устраивало по понятным причинам). Поэтому я дополнил initrd программой mkfs, скопировав в соответствующие подкаталоги /boot/initrd-tree из рабочей ОС файлы:

В каталог sbin
бинарные файлы
mke2fs
mkfs

и ссылки
mkfs.ext2
mkfs.ext3
mkfs.ext4
mkfs.ext4dev

(все они указывали на mke2fs)

в каталог lib
файлы
libcom_err.so.2.1
libe2p.so.2.3
libext2fs.so.2.4

и соответствующие им ссылки
libcom_err.so.2
libe2p.so.2
libext2fs.so.2

Внимание! Проверьте до шифрования, имеется ли в созданном скриптом mkinitrd initrd.gz программа для форматирования разделов диска в нужную вам файловую систему. В случае с ext2 это можно сделать, введя команду mkfs, либо mkfs.ext2 без параметров. В случае наличия, программа должна выдать справку по своим параметрам, либо что-то похожее, главное, чтоб не было ругани на отсутствующие so файлы, или file not found’а

Я не пробовал создавать из образа initrd файловые системы ReiserFS и NTFS, но ext2, ext3 и ext4 должны создаваться нормально.

После копирования файлов в соответствующие подкаталоги каталога initrd-tree не забудьте пересоздать initrd командой makeinitrd и заменить файл initrd.gz на флешке новым initrd.gz

Далее необходимо добавить программу kpartx из пакета multipath-tools. Она нужна для того, чтобы в дальнейшем получить доступ к разделам на зашифрованном диске. Если у вас на оном будет единственный раздел, то можно без нее обойтись.

Итак, я сделал следующее:
Установил и настроил менеджер пакетов Sbopkg, произвел синхронизацию, ввел в поиске название пакета и установил его в основную ОС. После чего скопировал в initrd-tree следующие файлы (из полученного пакета, или соответствующих каталогов ОС):
В подкаталог etc/udev/rules.d файл kpartx.rules
В подкаталог lib/udev файл kpartx_id
В подкаталог sbin файл kpartx

Этап #15
Бэкап системы.

Загружаемся в тестовом initrd в его консоли создаем точки монтирования, в моем случае:
-для раздела основной системы
mkdir /mnt/sda1
-для раздела home
mkdir /mnt/sda5

-для раздела, на котором будем хранить бэкапы:
mkdir /mnt/sdb1

В моем случае, под бэкапы я использовал первый раздел (fat32) загрузочной флешки.

Далее монтируем разделы

mount –t ext2 /dev/sda1 /mnt/sda1
mount –t ext2 /dev/sda5 /mnt/sda5
mount –t vfat /dev/sdb1 /mnt/sda1

соответственно, 1-й, 2-й раздел HDD и первый fat32 раздел флешки

также я создал отдельную директорию для бэкапов на ней
mkdir /mnt/sdb1/bak

Собственно осталось только ввести команды архивации, а в случае созданного с помощью mkinitrd образа нам даже не надо заботиться о наличии отдельного архиватора, его функции выполняет bisybox, а mkinitrd заботливо создал ссылки на него, каковые соответствуют командам архивации в linux, и заодно экономят нам место в образе initrd.
Мы используем не целый зоопарк программ, а один маленький bisybox, который располагает огромнейшим набором функций, дублирующим множество программ, в т.ч. и архиватор.

Итак, для бэкапа основного раздела необходимо ввести команду
tar –czvpf /mnt/sdb1/bak/system.tar.gz /mnt/sdb1

где:
tar – вызов архиватора, а после знака «-» идут параметры
c – создать архив
z – использовать сжатие gzip
v – отображать ход процесса (правда не будет никаких процентов, оставшегося времени и т.д., только имена архивируемых файлов)
p — включает сохранение владельцев и прав доступа для файлов, для суперпользователя этот режим активирован по умолчанию, так что его использование, вообще-то, не обязательно
f – сохранять полные пути к файлам

/mnt/sdb1/bak/system.tar.gz – имя создаваемого архива
/mnt/sda1 – директория, с которой начнется архивация.
Внимание! В отличие от, например, архиватора rar в windows, который тоже сохраняет полный путь, но относительный, в данном случае в архив будет включен путь абсолютный. Т.е. если бы это была windows и мы пользовались winrar’ом или winzip’ом, то путь /mnt/sda1 для файлов в архиве был бы в самом архиве не сохранен, здесь же он будет сохранен. Соответственно распаковывать архив придется, создав такую же точку монтирования /mnt/sda1, и распаковывать сам архив в корень.

Введя команду я ушел пить кофе :), а когда вернулся, заархивировал раздел home:
tar –czvpf /mnt/sdb1/bak/home.tar.gz /mnt/sda5

Замечание: После шифрования наш диск будет выглядеть как одна неразмеченная область, и нам надо будет повторно его разметить, восстановить ранее установленную ОС.

Замечание: Если что-то пойдет не так во время шифрования, произойдет какая-то ошибка, очень хотелось бы быстро вернуться к исходному состоянию системы, потому, я на всякий случай сделал еще один бэкап всего жесткого диска и загрузочной флешки с помощью Acronis True Image Home. Ну он у меня был еще и лицензионный. Если у вас нет его (лицензионного или не совсем) и вам влом, то можете, конечно, начхать, но я для надежности сделал.

One Response to Установка Linux и шифрование ее и всего содержимого жесткого диска. Часть II

  1. Pingback: Домашний сервер на базе Slackware Linux | Персональный блог Толика Панкова

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *