Установка FreeBSD на шифрованный корневой раздел

Андрей Романенко aka Camelium

2009-10-28

Введение

Тема безопасности всегда актуальна. Защита данных от посторонних один из основных ее аспектов. И утверждение "Если у вас паранойя, то это не значит что за вами не следят" имеет смысл.

Нашей целью будет полное шифрованние физического диска штатными средствами FreeBSD. В этом есть огромный плюс – с любого LiveCD невозможно определить содержимое винчестера, скроем само наличие ОС. Загружаться FreeBSD будет с флешки. Шифрование будет безпарольное, то есть на основе ключа. Это спасет от того момента (цитата с одного форума)

Паяльник в ж..., и все пароли вспоминаются :)

Ну, начнем...

ОС FreeBSD 7.1
Вся работа будет разбита на несколько этапов

  • подготовка
  • шифрование
  • установка
  • настройка и финиш

Этап первый: подготовка дисков, настройка среды шифрования

Загружаемся С DVD FreeBSD 7.1, в Sysinstall переходим в режим Fixit->CD/DVD

Забиваем диск и флешку мусором (ad4 мой жесткий диск, da0 флешка). Процес долгий, винт размером в 80Гб (на ноутбуке) – больше часа

Fixit# dd if=/dev/random of=/dev/ad4 bs=50m
Fixit# dd if=/dev/random of=/dev/da0 bs=5m

Создаем симлинки и загружаем модуль geom_eli

Fixit# ln -s /dist/lib /lib
Fixit# ln -s /dist/boot/kernel /boot/modules
Fixit# kldload geom_eli

Создаем ключ для шифрования размером 4096 байт, и временно храним его в /boot/keys

Fixit# mkdir /boot/keys
Fixit# dd if=/dev/random of=/boot/keys/ad4.key bs=512 count=8

Создаем точки монтирования загрузочной флешки и винта

Fixit# mkdir /mnt/crypt
Fixit# mkdir /mnt/boot0

Делаем редактором по дефолту ee (вместо vim)
А также указываем место установки ОС

Fixit# export EDITOR=/dist/usr/bin/ee
Fixit# export DESTDIR=/mnt/crypt

Теперь размечаем флеш-носитель (размер 4096Mb), форматируем и монтируем в /mnt/boot0. Новичку с fdisk будет немного сложно разобратся, но без него никак, советую прочитать www.opennet.ru

Fixit# fdisk -Bi /dev/da0
# На вопрос change the boot code ставим yes
Fixit# bsdlabel -Bw /dev/da0s1
Fixit# bsdlabe -e /dev/da0s1
# таблицу разделов к такому виду
# size offset fstype [fsize bsize bps/cfg]
# a: 8388497 16 4.2BSD 0 0 0
# c: 8388513 0 unused 0 0
Fixit# newfs -O2 -L BOOT0 /dev/da0s1a
Fixit# mount -t ufs -o rw /dev/da0s1a /mnt/boot0

Этап второй: шифрование диска и создание ФС

Geom Eli предоставляет такие алгоритмы шифрования с ключом от 128 до 256 бит (отсортированы по быстродействию)

  • blowfish
  • 3des
  • aes
  • camellia

Важно помнить: шифрование замедляет доступ к диску и создает нагрузку на процессор

Скорость падает почти в 2 раза (лично тест проводил на ASP12(ext3) и FreeBSD 7.1 45 MB/s против шифрованого 28 MB/s. В качестве алгоритма выступил Blowfish/192). У вас могут быть другие показатели, тестируйте и сравнивайте.

Свой выбор остановил на алгоритме Blowfish 192bit. Обьясняю почему (это всего лишь сугубо мое мнение):

  • первое, есть ассемблерная реализация для архитектуры i386 ()
  • второе, это самый быстрый из представленных алгоритмов
  • третье, разработан Брюсом Шнайером (авторитет среди криптологов)
  • четвертое, простота реализация позволяет личный аудит кода
  • пятое, длина в 192 бит обеспечивает оптимальное соотношение надежность:быстодействие

Советую почитать про Blowfish и Брюса Шнайера ru.wikipedia.org www.schneier.com

Вернемся к нашей задаче
Ключом /boot/keys/ad4.key шифруем диск и подключаем его

Fixit# geli init -b -v -P -K /boot/keys/ad4.key -P -e blowfish -l 192 -s 4096
Fixit# geli attach -p -k /boot/keys/ad4.key /dev/ad4
Fixit# ls /dev | grep "ad4"
ad4
ad4.eli

Размечаем шифрованный диск /dev/ad4.eli, создаем ФС, монтируем

Fixit# fdisk -Bi /dev/ad4.eli
# На вопрос change the boot code ставим yes
Fixit# bsdlabel -Bw /dev/ad4.eli
Fixit# bsdlabe -e /dev/ad4.eli
# таблицу разделов к такому виду
# size offset fstype [fsize bsize bps/cfg]
# a: 1024M 16 4.2BSD 0 0 0
# b: 1024M * swap
# c: 167771451 0 unused 0 0
# d: 512M * 4.2BSD 0 0 0
# e: 4096M * 4.2BSD 0 0 0
# f: 16384M * 4.2BSD 0 0 0
# g: * * 4.2BSD 0 0 0
Fixit# newfs -O2 -U -L ROOT /dev/ad4.elia
Fixit# newfs -O2 -U -L TMP /dev/ad4.elid
Fixit# newfs -O2 -U -L VAR /dev/ad4.elie
Fixit# newfs -O2 -U -L USR /dev/ad4.elif
Fixit# newfs -O2 -U -L HOME /dev/ad4.elig
Fixit# mount -t ufs -o rw /dev/ad4.elia /mnt/crypt
Fixit# mkdir /mnt/crypt/var
Fixit# mkdir /mnt/crypt/usr
Fixit# mkdir /mnt/crypt/tmp
Fixit# mount -t ufs -o rw /dev/ad4.elid /mnt/crypt/tmp
Fixit# mount -t ufs -o rw /dev/ad4.elie /mnt/crypt/var
Fixit# mount -t ufs -o rw /dev/ad4.elif /mnt/crypt/usr
Fixit# mkdir /mnt/crypt/usr/home
Fixit# mount -t ufs -o rw /dev/ad4.elig /mnt/crypt/usr/home

Этап третий: установка FreeBSD

Устанавливать FreeBSD будем вручную :)

Переходим в /dist/7.1-RELEASE и устанавливаем. Использовать Sysinstall бессмысленно, он не понимает eli :(

Fixit# cd /dist/7.1-RELEASE
Fixit# ls
base doc kernels proflibs
catpages games manpages src
dict info ports
Fixit# cd base
Fixit# ./install.sh
Fixit# cd ../doc
Fixit# ./install.sh
Fixit# cd ../kernels
Fixit# ./install.sh GENERIC
Fixit# cd ../proflibs
Fixit# ./install.sh
Fixit# cd ../catpages
Fixit# ./install.sh
Fixit# cd ../games
Fixit# ./install.sh
Fixit# cd ../manpages
Fixit# ./install.sh
Fixit# cd ../src
Fixit# ./install.sh all
Fixit# cd ../dic
Fixit# ./install.sh
Fixit# cd ../info
Fixit# ./install.sh
Fixit# cd ../ports
Fixit# ./install.sh

Система установлена на шифрованный диск. Переходим к настройке ОС

Этап четвертый: создание конфигурации

Для начала сделаем доступным ядро

Fixit# cd /mnt/crypt/boot
Fixit# rmdir kernel
Fixit# mv GENERIC kernel

Создадим /mnt/crypt/etc/fstab и приведем его к такому виду:

/dev/ad4.elia / ufs rw 1 1
/dev/ad4.elib none swap sw 0 0
/dev/ad4.elid /tmp ufs rw 2 2
/dev/ad4.elie /var ufs rw 2 2
/dev/ad4.elif /usr ufs rw 2 2
/dev/ad4.elif /usr/home ufs rw 2 2
/dev/ufs/BOOT0 /boot0 ufs rw,noauto 1 1

Создаем папку для монтирования загрузочной флешки

Fixit# mkdir /mnt/crypt/boot0

Копируем /mnt/crypt/boot в /mnt/boot0/boot, /mnt/crypt/etc/fstab в /mnt/boot0/etc/fsatb, /boot/keys в /boot0/boot

Fixit# cp -Rpv /mnt/crypt/boot /mnt/boot0
Fixit# mkdir /mnt/boot0/etc
Fixit# cp -pv /mnt/crypt/etc/fstab /mnt/boot0/etc/
Fixit# cp -Rpv /boot/keys /mnt/boot0/boot

Создаем файл /mnt/boot0/boot/loader.conf и приводим его к такому виду:

autoboot_delay="5"

geom_eli_load="YES"

geli_ad4_keyfile0_load="YES"
geli_ad4_keyfile0_type="ad4:geli_keyfile0"
geli_ad4_keyfile0_name="/boot/keys/ad4.key"

kern.geom.eli.batch="1"

Все, теперь перезагружаемся не забыв отмонтировать все ФС и настраиваем FreeBSD по своему вкусу

Fixit# cd /
Fixit# umount /mnt/boot0
Fixit# umount /mnt/crypt/usr/home
Fixit# umount /mnt/crypt/usr
Fixit# umount /mnt/crypt/tmp
Fixit# umount /mnt/crypt/var
Fixit# umount /mnt/crypt/usr
Fixit# geli detach /dev/ad4.eli
Fixit# shutdown -r now

Заключение

В результате мы добились того, чего хотели. Теперь без флешки винчестер бесполезная железяка. И как говорится в man geli: "Даже очень заинтересованная сторона с достаточными ресурсами не сможет раскодировать данные на жестком диске". А в критической ситуации флешку легко уничтожить.

Совет: по своему горькому опыту скажу – сделайте бекап ключа (к примеру спрятать с помощью steghide в картинку и выложить на бесплатном фотохостинге). Этим вы себя застрахуете от неприятных моментов, связанных с потерей флеш-носителя.

Рекомендации, вопросы, замечания пишем в комментариях

Источники:

  • man geli
  • man fdisk
  • man bsdlabel
  • man mount
  • man newfs
  • man tunefs
  • www.opennet.ru