- PVSM.RU - https://www.pvsm.ru -
«Если у вас паранойя, это ещё не значит, что за вами не следят» © Народная мудрость
Прочитав пост Как я внедрял первое правило ведения бизнеса в России [1], у меня возник вот такой вопрос:
Что делать если компания разрабатывает программный продукт (SaaS), и в процессе разработки необходимо использовать локальные develop и stage сервера? Что будет если “злоумышленник” получит физический доступ к дискам и как не отдать ему все исходные коды проектов? А если мы раскатываем код на боевую через скрипты, Chef или Puppet, то отдаём ещё и все доступы к боевым площадкам.
Ответ очевиден: шифрование всего ценного. Но как мы все знаем, вариантов шифрования масса. Начиная от шифрования отдельных файлов и создания криптоконтейнеров (например TrueCrypt) и заканчивая полным шифрованием дисков.
Вы можете сказать «так ты же сам нарушаешь правило и держишь свои локальные сервера в офисе?». И я соглашусь, но с оговоркой. Для комфортной разработки, чем ближе исходники, тем лучше, а учитывая скорость интернета для юридических лиц в регионах, которую можно получить за разумные деньги, держать develop и stage сервера где-то далеко приведёт к мучительной боли. Здесь я говорю про схему, при которой на машинах разработчиков нет исходных кодов. Весь код лежит на сетевой шаре develop сервера. Да и в целом пинг наружу и пинг в локальном гигабите немножечко разные вещи.
Итак, приступим к шифрованию.
Дано: сервера на FreeBSD.
Задача: зашифровать все разделы.
Какие есть варианты шифрования?
Уточним условия, которым должна удовлетворять наша схема:
Можно сказать, что второй пункт снижает криптостойкость системы, ведь мы добровольно отказываемся от ключей шифрования (оставляем только пароль) и отказываемся от флешки, которую можно быстро выдернуть из сервера в случае необходимости.
Всё так, но если у нас используется виртуализация, то в общем случае, нам надо по флешке на каждую виртуальную машину, что немного грустно.
ZFS для своей работы требует довольно много ресурсов, что противоречит третьему пункту условий.
Так что выбираем наиболее универсальный и родной для системы вариант, а именно шифрование разделов с помощью geli. Подробнее про geli можно прочитать в хендбуке.
Примечание:
При использовании этой схемы необходимо убедиться, что есть консольный доступ к серверу. В случае удалённых серверов обязательно должен быть KVM или его аналог. Это связано с тем, что при загрузке система будет спрашивать пароль для зашифрованного раздела!
Для начала нам понадобится образ операционной системы (я использовал образ FreeBSD 9.1 x64). Загружаемся и запускаем установку.
Начиная с FreeBSD 9 всем знакомый sysinstall был заменён на bsdinstall. Этот факт делает установку с шифрованием диска немного легче, в основном по причине того, что загруженное окружение более просто в использовании, чем на предыдущих версиях системы, например требуемые модули ядра загружаются автоматически.
Диск который мы используем для установки системы 'da0'. Мы будем использовать GPT разметку.
Модули ядра загружаются автоматически в тот момент когда они нам нужны, поэтому мы можем пропустить загрузку модуля geli и сразу перейти к разбиению диска и созданию крипто раздела. Вот что мы должны сделать:
Для начала удаляем все разделы диска и создаём GPT схему разбиения диска:
# gpart destroy -F da0
# gpart create -s gpt da0
Создаём раздел с типом “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
Загрузочный раздел размером 1 гигабайт и меткой boot
# gpart add -t freebsd-ufs -s 1g -l boot da0
Создаём файловую систему на разделе. Флаг –U включает soft-update на разделе. Использовать soft-update или нет решать вам. Есть аргументы как за, так и против.
# newfs -U gpt/boot
Создаём раздел размером 4 гигабайта
# gpart add -t freebsd-swap -l swap –s 4g da0
На всё оставшееся место создаём основной раздел
# gpart add -t freebsd-ufs -l enc da0
Примечание: это не ufs том, это geli том
Инициализируем geli том
# geli init -b gpt/enc
Geli спросит пароль для доступа к разделу
Подключаем зашифрованный раздел
# geli attach gpt/enc
# newfs -U gpt/enc.eli
Обратите внимание, тут мы указываем '.eli'!
Монтируем шифрованный том
# 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
# exit
После этого запустится процесс установки системы. Время выпить чашечку кофе, чая или иных напитков.
После установки нам будет предложено ввести пароль root, настроить сеть, создать пользователей.
Когда вы увидите на экране «Manual Configuration», где будет предложено открыть «Shell» для внесения изменений в только что установленную систему. Соглашаемся. Это действие предоставит нам консоль chroot нашей установленной системы.
Файлы который нам необходимо отредактировать, это fstab(5), loader.conf(5) и rc.conf(5).
# vi /boot/loader.conf
Добавляем следующие строки:
geom_eli_load="YES"
vfs.root.mountfrom="ufs:/dev/da0p4.eli"
Примечание:
если вы не создавали swap раздел, то вероятно шифрованный том будет ad0p3.eli. Так же вы должны заключить путь к GPT разделу во второй строке в кавычки, если этого не сделать, файл не будет корректно обработан системой.
# 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
# vi /etc/rc.conf
Для шифрования раздела подкачки добавим следующую строку из хендбука:
geli_swap_flags="-e blowfish -l 128 -s 4096 -d"
На этом настройка закончена.
В консоли наберите:
# exit
и выберите «Reboot».
Цель достигнута. Мы получили полностью зашифрованный диск информацию с которого не получить без знания пароля.
Теперь при загрузке системы в консоли будет приглашение ввести пароль для шифрованных разделов. В нашем случае это корневой раздел.
При написании статьи использовались следующие ресурсы:
FreeBSD Handbook [2]
Installing FreeBSD 9.0 with encrypted root fs (all ufs) [3]
Disk Setup On FreeBSD [4]
Автор: fenix8422
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/freebsd/43012
Ссылки в тексте:
[1] Как я внедрял первое правило ведения бизнеса в России: http://habrahabr.ru/post/157899/
[2] FreeBSD Handbook: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/
[3] Installing FreeBSD 9.0 with encrypted root fs (all ufs): http://namor.userpage.fu-berlin.de/howto_fbsd9_encrypted_ufs.html
[4] Disk Setup On FreeBSD: http://www.wonkity.com/~wblock/docs/html/disksetup.html
[5] Источник: http://habrahabr.ru/post/193228/
Нажмите здесь для печати.