В статье описывается процедура настройки сервера с зашифрованной
корневой файловой системой. Процедура довольно тривиальная, но требует
поверхностного знакомства с Debian.
Цель
Сервер на базе Debian GNU/Linux 4.0 Etch с зашифрованной корневой
файловой системой и разделами подкачки.
Средства
* сервер IBM eBusiness xSeries 206
* 4 HDD по 160 Gb
* компакт-диск debian-netinst
* Internet соединение
У xSeries 206 есть 2 порта SATA и 1 двухканальный IDE, но мне
необходимо было использовать 4 IDE диска (таково ТЗ, и это обусловлено
реальной необходимостью). Поэтому был приобретён PCI IDE контроллер. В
итоге я получил 4 диска через PCI IDE и CDROM, подключённый через
набортный IDE. Отсюда такие имена устройств.
Замечания
* с таким же успехом можно делать установку с полного дистрибутива,
не имея Internet соединения
* с незначительными модификациями процедура может быть использована
для установки Ubuntu 6.10 Edgy Eft или 7.04 Feisty Fawn
* жесткие диски перед использованием желательно забить случайными
данными
Шаги
1. создаём разделы, необходимые для базовой установки
2. устанавливаем базовую систему в тот раздел, который позднее станет
одним из swap-разделов, загружаемся с него
3. устанавливаем необходимые пакеты
4. создаём raid массивы
5. шифруем созданные массивы
Разметка дисков
Disk /dev/hde: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hde1 * 1 31 248976 fd Linux raid autodetect
/dev/hde2 32 93 498015 83 Linux
/dev/hde3 94 336 1951897+ fd Linux raid autodetect
/dev/hde4 337 19457 153589432+ fd Linux raid autodetect
Disk /dev/hdf: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdf1 1 36483 293049666 fd Linux raid autodetect
Disk /dev/hdg: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdg1 * 1 31 248976 fd Linux raid autodetect
/dev/hdg2 32 93 498015 82 Linux swap / Solaris
/dev/hdg3 94 336 1951897+ fd Linux raid autodetect
/dev/hdg4 337 19457 153589432+ fd Linux raid autodetect
Disk /dev/hdh: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdh1 1 36481 293033601 fd Linux raid autodetect
/dev/hde1 и /dev/hdg1 объединяем в RAID-1, используем как /boot, метим
как загрузочный. /dev/hde2 используем как корневой раздел, позже от
него избавимся. Остальные разделы пока не используем. Файловая система
здесь не существенна, я использую ext3.
Устанваливаем необходимые пакеты
# aptitude install cryptsetup lvm2
Создаем RAID массивы
Их нужно создать 3 штуки:
* /dev/hde3 + /dev/hdg3 (это потом станет зашифрованной корневой
системой)
* /dev/hde4 + /dev/hdg4 (будет шифрованным физическим томом для lvm)
* /dev/hdf1 + /dev/hdh1 (будет ещё одним шифрованным физическим
томом для lvm)
Теперь лучше дождаться завершения синхронизации RAID. Отсследить можно
командой:
# mdadm --misc --detail /dev/md1
Там смотрим на "State : active, resyncing" и "Rebuild Status : 27%
complete". Процесс может занять весьма ощутимое время, так что лучше
оставить это счастье синхронизироваться на ночь.
Там задаёт интерактивные вопросы, нужно для начала набрать именно
большими буквами YES, потом дважды пароль. В итоге получатся три
зашифрованных раздела.
Полученные разделы нужно добавить в `/etc/crypttab`:
Хорошая идея всегда иметь немного оперативного пространства (например,
на тот случай, если у нас заведутся необъятные логи), поэтому часть
пространства при создании logical volumes оставляем нераспределённым:
Для подстраховки, на тот случай, если что-то пойдёт не так, обеспечим
возможность загрузиться с нешифрованного раздела и попробовать всё
исправить. Для этого нужно создать копию текущего initrd:
# mkswap /dev/hde2
# /etc/init.d/cryptdisks restart
# swapon -a
Здесь действительно нужно в начале сделать mkswap, иначе `cryptdisks
restart` откажется создавать шифрованный swap, мотивируя тем, что в
разделе присутствует файловая система (это наш старый корень).
* удалить из /boot/grub/menu.lst всё после строчки `### END DEBIAN
AUTOMAGIC KERNELS LIST`
Недостатки решения
Так как у нас целых 3 шифрованных раздела, то при загрузке пароль
приходится вводить три раза. Меня это на данный момент вполне
устраивает, так как конечная конфигурация этой системы будет такова,
что ключи для шифрования будут прередаваться на этапе загрузки по SSH
(это будет описано отдельной статьёй). Как более простое решение, могу
посоветовать использовать для всех разделов, за исключением корневого,
ключевые файлы, которые можно положить на корневой зашифрованный
раздел. Ключевые файлы нужно будет прописать в `/etc/crypttab` и
перегенерировать initrd.
По техническим причинам зашифровать абсолютно всё не представляется
возможным. Нешифрованным останется раздел `/boot`, в котором лежат
образы ядра и initramfs-дисков. В такой ситуации возможна атака через
троян, внедрённый в initramfs (как этому противостоять - тема для
отдельной статьи). Однако, для организации такой атаки, в общем
случае, необходим физический доступ к серверу.
1308 Прочтений • [Зашифрованная корневая файловая система в Linux (crypt rootfs linux fs)] [08.05.2012] [Комментариев: 0]