Этап #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
Естественно, если вы делаете это в тестовом initrd, то команды надо добавлять перед вызовом
mount –t ext2 /dev/sdb2 /mnt/bootflash
/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. Ну он у меня был еще и лицензионный. Если у вас нет его (лицензионного или не совсем) и вам влом, то можете, конечно, начхать, но я для надежности сделал.
Pingback: Домашний сервер на базе Slackware Linux | Персональный блог Толика Панкова