Установка FreeBSD 9.1 с шифрованием корневого раздела

в 18:49, , рубрики: freebsd, безопасность, информационная безопасность, шифрование дисков, метки: , , ,

«Если у вас паранойя, это ещё не значит, что за вами не следят» © Народная мудрость

Прочитав пост Как я внедрял первое правило ведения бизнеса в России, у меня возник вот такой вопрос:

Что делать если компания разрабатывает программный продукт (SaaS), и в процессе разработки необходимо использовать локальные develop и stage сервера? Что будет если “злоумышленник” получит физический доступ к дискам и как не отдать ему все исходные коды проектов? А если мы раскатываем код на боевую через скрипты, Chef или Puppet, то отдаём ещё и все доступы к боевым площадкам.

Ответ очевиден: шифрование всего ценного. Но как мы все знаем, вариантов шифрования масса. Начиная от шифрования отдельных файлов и создания криптоконтейнеров (например TrueCrypt) и заканчивая полным шифрованием дисков.

Вы можете сказать «так ты же сам нарушаешь правило и держишь свои локальные сервера в офисе?». И я соглашусь, но с оговоркой. Для комфортной разработки, чем ближе исходники, тем лучше, а учитывая скорость интернета для юридических лиц в регионах, которую можно получить за разумные деньги, держать develop и stage сервера где-то далеко приведёт к мучительной боли. Здесь я говорю про схему, при которой на машинах разработчиков нет исходных кодов. Весь код лежит на сетевой шаре develop сервера. Да и в целом пинг наружу и пинг в локальном гигабите немножечко разные вещи.

Итак, приступим к шифрованию.

Дано: сервера на FreeBSD.
Задача: зашифровать все разделы.

Схемы шифрования

Какие есть варианты шифрования?

  • Шифрование средствами файловой системы (например ZFS)
  • Шифрование сторонними средствами
  • Штатные механизмы FreeBSD для любой файловой системы gbde и geli.

Уточним условия, которым должна удовлетворять наша схема:

  1. Прозрачное шифрование всего диска
  2. Отсутствие внешних носителей для хранения ключей или загрузки ядра
  3. Минимальные требования к железу

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

Всё так, но если у нас используется виртуализация, то в общем случае, нам надо по флешке на каждую виртуальную машину, что немного грустно.
ZFS для своей работы требует довольно много ресурсов, что противоречит третьему пункту условий.

Так что выбираем наиболее универсальный и родной для системы вариант, а именно шифрование разделов с помощью geli. Подробнее про geli можно прочитать в хендбуке.

Примечание:

При использовании этой схемы необходимо убедиться, что есть консольный доступ к серверу. В случае удалённых серверов обязательно должен быть KVM или его аналог. Это связано с тем, что при загрузке система будет спрашивать пароль для зашифрованного раздела!

Подготовка и установка системы

Для начала нам понадобится образ операционной системы (я использовал образ FreeBSD 9.1 x64). Загружаемся и запускаем установку.

Начиная с FreeBSD 9 всем знакомый sysinstall был заменён на bsdinstall. Этот факт делает установку с шифрованием диска немного легче, в основном по причине того, что загруженное окружение более просто в использовании, чем на предыдущих версиях системы, например требуемые модули ядра загружаются автоматически.

  • В меню «Welcome» выбираем «Install»
  • Выбираем раскладку клавиатуры
  • Указываем имя хоста
  • Выбираем требуемые компоненты системы. (я добавляю исходные коды, по причине того что всё равно далее нужно пересобирать ядро)
  • Далее в меню «Partitioning», выбираем «Shell»

Разбиение диска

Диск который мы используем для установки системы 'da0'. Мы будем использовать GPT разметку.

Модули ядра загружаются автоматически в тот момент когда они нам нужны, поэтому мы можем пропустить загрузку модуля geli и сразу перейти к разбиению диска и созданию крипто раздела. Вот что мы должны сделать:

  1. Создать GPT схему разбиения
  2. Создать загрузочный блок
  3. Создать и отформатировать загрузочный раздел
  4. Создать раздел подкачки (если он нужен), и да, он тоже будет шифроваться
  5. Создать и инициализировать основной зашифрованный раздел
  6. Отформатировать зашифрованный раздел
  7. Смонтировать файловые системы в /mnt
  8. Продолжить установку

1. Создание загрузочного блока

Для начала удаляем все разделы диска и создаём GPT схему разбиения диска:

# gpart destroy -F da0
# gpart create -s gpt da0

2. Создаём загрузочный блок

Создаём раздел с типом “freebsd-boot” и размером 64Кб и устанавливаем загрузчик.

Важно:

в настоящее время раздел не должен быть больше 512K. Это связано с ограничениями кода загрузчика.

# gpart add -t freebsd-boot -s 64k –l gpboot da0
# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 da0

3. Создаём и форматируем загрузочный раздел

Загрузочный раздел размером 1 гигабайт и меткой boot

# gpart add -t freebsd-ufs -s 1g -l boot da0

Создаём файловую систему на разделе. Флаг –U включает soft-update на разделе. Использовать soft-update или нет решать вам. Есть аргументы как за, так и против.

# newfs -U gpt/boot

4. Создание раздела подкачки

Создаём раздел размером 4 гигабайта

# gpart add -t freebsd-swap -l swap –s 4g da0

5. Создание и инициализация зашифрованного тома

На всё оставшееся место создаём основной раздел

# gpart add -t freebsd-ufs -l enc da0

Примечание: это не ufs том, это geli том

Инициализируем geli том

# geli init -b gpt/enc

Geli спросит пароль для доступа к разделу

Подключаем зашифрованный раздел

# geli attach gpt/enc

6. Форматируем шифрованный том

# newfs -U gpt/enc.eli

Обратите внимание, тут мы указываем '.eli'!

7. Монтируем файловые системы в /mnt

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

# mount /dev/gpt/enc.eli /mnt

Поскольку у нас отдельный загрузочный раздел, то нам надо чтобы при установке каталог /boot был записан на наш загрузочный раздел

# mkdir /mnt/boot2
# mount /dev/gpt/boot /mnt/boot2
# mkdir /mnt/boot2/boot
# cd /mnt
# ln -s boot2/boot boot

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

# mkdir gelibackups
# cp /var/backups/* gelibackups

8. Продолжаем установку

# exit

После этого запустится процесс установки системы. Время выпить чашечку кофе, чая или иных напитков.

После установки нам будет предложено ввести пароль root, настроить сеть, создать пользователей.

Когда вы увидите на экране «Manual Configuration», где будет предложено открыть «Shell» для внесения изменений в только что установленную систему. Соглашаемся. Это действие предоставит нам консоль chroot нашей установленной системы.

Конфигурационные файлы

Файлы который нам необходимо отредактировать, это fstab(5), loader.conf(5) и rc.conf(5).

loader.conf

# vi /boot/loader.conf

Добавляем следующие строки:

geom_eli_load="YES"
vfs.root.mountfrom="ufs:/dev/da0p4.eli"

Примечание:

если вы не создавали swap раздел, то вероятно шифрованный том будет ad0p3.eli. Так же вы должны заключить путь к GPT разделу во второй строке в кавычки, если этого не сделать, файл не будет корректно обработан системой.

fstab

# vi /etc/fstab

Добавим следующие строки:

/dev/gpt/enc.eli  /        ufs    rw,noatime    1    1
/dev/gpt/boot     /boot2   ufs    rw,noatime    1    1
/dev/gpt/swap.eli none     swap   sw            0    0

rc.conf

# vi /etc/rc.conf

Для шифрования раздела подкачки добавим следующую строку из хендбука:

geli_swap_flags="-e blowfish -l 128 -s 4096 -d"

На этом настройка закончена.
В консоли наберите:

# exit

и выберите «Reboot».

Цель достигнута. Мы получили полностью зашифрованный диск информацию с которого не получить без знания пароля.
Теперь при загрузке системы в консоли будет приглашение ввести пароль для шифрованных разделов. В нашем случае это корневой раздел.

При написании статьи использовались следующие ресурсы:
FreeBSD Handbook
Installing FreeBSD 9.0 with encrypted root fs (all ufs)
Disk Setup On FreeBSD

Автор: fenix8422

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js