Шифрование корневого раздела в FreeBSD

В данной статье рассмотрим процесс шифрования корневого раздела в FreeBSD с использованием класса GEOM ELI.
Корневой раздел / будет шифроваться паролем, который будет запрошен во время загрузки системы. Разделы var, usr, tmp шифруются ключем и будут монтироваться автоматически после корневого раздела.

Перед прочтением данной статьи прочтите нашу предыдущую статью Шифруем разделы, виртуальные диски и Swap в FreeBSD, в которой описываются базовые команды при работе с классом GEOM ELI и пути изменения стандартных алгоритмов шифрования.

Установим систему в один минимальный корневой раздел ad0s1a (рекомендуется использовать минимальную установку), для будущих разделов /, var, usr, tmp создадим соответствующие фиктивные точки монтирования.
Таблица разделов должна иметь примерно такой вид:

ad0s1a / 256M
ad0s1b swap 4G
ad0s1d /new-root 2G
ad0s1e /new-tmp 2G
ad0s1f /new-var 2G
ad0s1g /new-usr *

Загружаемся в установленную систему.

В /boot/loader.conf добавляем строчку geom_eli_load=»YES»

Отмонтируем раздел /new-root, в котором будет размещен новый шифрованный корень

umount /new-root

Шифруем, присоединяем и форматируем раздел для будущего корня

geli init -b -l 256 /dev/ad0s1d
geli attach /dev/ad0s1d
newfs -L root /dev/ad0s1d.eli

В /etc/fstab меняем /dev/ad0s1d на /dev/ad0s1d.eli

Монтируем шифрованный раздел

mount /new-root

Создаем ключи для шифрования разделов usr, var, tmp и заполняем их случайными данными:

dd if=/dev/random of=/new-root/ad0s1e.key bs=512 count=1
dd if=/dev/random of=/new-root/ad0s1f.key bs=512 count=1
dd if=/dev/random of=/new-root/ad0s1g.key bs=512 count=1

Отключаем активный раздел swap и зашифруем его:

swapoff -a
geli onetime -l 256 -s 4096 /dev/ad0s1b

В /etc/fstab меняем /dev/ad0s1b на /dev/ad0s1b.eli

Включаем уже зашифрованный раздел swap:

swapon -a

Размонтируем будущие разделы перед шифрованием:

umount /new-tmp
umount /new-var
umount /new-usr

Шифруем разделы ранее созданными ключами:

geli init -K /new-root/ad0s1e.key -l 256 -P /dev/ad0s1e
geli init -K /new-root/ad0s1f.key -l 256 -P /dev/ad0s1f
geli init -K /new-root/ad0s1g.key -l 256 -P /dev/ad0s1g

Присоединяем зашифрованные разделы:

geli attach -k /new-root/ad0s1e.key -p /dev/ad0s1e
geli attach -k /new-root/ad0s1f.key -p /dev/ad0s1f
geli attach -k /new-root/ad0s1g.key -p /dev/ad0s1g

Форматируем разделы:

newfs -L tmp /dev/ad0s1e.eli
newfs -L var /dev/ad0s1f.eli
newfs -L usr /dev/ad0s1g.eli

Подготавливаем каталоги в корневом разделе:

cd /new-root

mkdir tmp
mkdir var
mkdir usr

mount /dev/ad0s1e.eli /new-root/tmp/
mount /dev/ad0s1f.eli /new-root/var/
mount /dev/ad0s1g.eli /new-root/usr/

Монтируем установочный диск с FreeBSD:

mount /cdrom

Копируем с примонтированного установочного диска в новый корень образ базовой системы:

cd /cdrom/7.2-RELEASE/base
cat base.?? | tar —unlink -xpzf — -C /new-root/

Готовим новый корень к загрузке:

mkdir /new-root/mnt/boot

Копируем fstab в новый шифрованный раздел:

cp /etc/fstab /new-root/etc/fstab

В /new-root/etc/fstab добавляем новые разделы:

/dev/ad0s1b.eli none swap sw 0 0
/dev/ad0s1a /mnt/boot ufs rw 1 1
/dev/ad0s1e.eli /tmp ufs rw 1 1
/dev/ad0s1g.eli /usr ufs rw 1 1
/dev/ad0s1f.eli /var ufs rw 1 1

В /new-root/etc/rc.conf определяем монтирование шифрованных разделов и пути к их ключам.

geli_devices=»ad0s1e ad0s1f ad0s1g»
geli_ad0s1e_flags=»-p -k /ad0s1e.key»
geli_ad0s1f_flags=»-p -k /ad0s1f.key»
geli_ad0s1g_flags=»-p -k /ad0s1g.key»

В текущем /etc/fstab должна оставатся только строчка

/dev/ad0s1d.eli / ufs rw 1 1

Перезагружаемся.

После загрузки необходимо почистить /mnt/boot, в котором находится наша старая система.
Необходимо оставить только /mnt/boot/boot/* и /mnt/boot/etc/fstab

В источнике я нашел несколько неточностей при монтировании шифрованных разделов.

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