В данной статье рассмотрим процесс шифрования корневого раздела в 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
В источнике я нашел несколько неточностей при монтировании шифрованных разделов.