Установка NetBSD с неполным шифрованием диска CGD
Введение
Если вы, как и я, находитесь на грани паранойи, вам, скорее всего, знакомы технологии LUKS в GNU/Linux и GELI во FreeBSD, которые позволяют зашифровать диск. В данном посте речь пойдет о собственной системе NetBSD для защиты ваших данных при потере физического доступа к машине.
У меня есть ноутбук на базе Pentium M с COM- и LPT-портами для экспериментов и изучения программирования. Многие мейнстримные дистрибутивы GNU/Linux сегодня отказались от поддержки 32-битных версий. "Не беда" – подумал я и установил FreeBSD, тем более, что всегда хотел пощупать "True UNIX". Беззаботно бороздя просторы нашего объятного и наполовину нерабочего из-за DPI чебурнета, я наткнулся на информацию о том, что следующий релиз FreeBSD также будет лишен 32-битной версии. "Нехорошо" – подумал я… Ведь я только ощутил всю мощь init.d по сравнению с systemd!
Так я пришел к NetBSD – минимальной системе без ненужных нагромождений (что дает развернуться емаксу :) Так как систему я устанавливал на ноутбук, мне нужно было настроить шифрование диска, однако на данный момент шифрование всего диска не предусмотрено, зато есть криптографическая технология, написанная одним человеком, под названием "Сryptographic device driver".
Если вы последуете примеру настройки CGD из данного поста, у вас будут зашифрованы разделы, которые будут примонтированы как /var
, /usr
, /home
, а также раздел swap и /tmp
. Вся остальная система будет храниться в открытом виде. В принципе, и шифрования /home
должно быть вполне достаточно. Также следует отметить, что вся настройка из данного текста применима для MBR. Для установки на GPT обратитесь, например, к данному мануалу по ручной установке NetBSD (также содержит множество полезных ссылок).
Итак, начнем.
Установка NetBSD
Установка не заключает в себе ничего сложного. Так же, как и в GNU/Linux размечаем диск самостоятельно или используем весь диск с автоматическим созданием разделов. Стоит подчеркнуть, что в NetBSD метки разделов C
и D
зарезервированы. При использовании disklabel
раздел C
представляет собой весь раздел NetBSD (здесь имеется ввиду, скорее всего, логический). Раздел D
обозначает весь диск (физический).
Официальная документация на CGD предлагает сначала создать резервную копию незашифрованного раздела, затем удалить этот раздел и создать раздел CGD. Здесь мне непонятно, куда и зачем я должен бэкапить. Поэтому я не разделяю корневой /var
и /usr
. После того, как сконфигурируем раздел CGD, просто перенесем все файлы в соответствующие подразделы внутри него. Раздел /home
после установки у нас и так пуст, т.к. никаких пользователей еще не существует, а домашняя директория пользователя root
находится в /root
. Таким образом, во время установки нам нужно иметь разделы /
и /home
. Все остальные настройки на последующих шагах производите по вашему желанию. Можно сразу установить пакетный менеджер бинарников pkgin
и фирменный менеджер исходных текстов pkgsrc
, но тогда копирование директории /usr
будет мучительно долгим. Я использовал автоматическую конфигурацию сети и установил местное время.
Загрузка в однопользовательском режиме
В документации игриво написано: "Загрузитесь в однопользовательском режиме с примонтированным корневым разделом и размонтированными остальными". Для тугодумов типа меня описываю шаги:
- Когда загрузчик спрашивает, в каком режиме загрузиться, выбираем цифру "2. Boot single user".
- Далее нас спрашивают, откуда загрузить
shell
. НажимаемEnter
, выбирая тем самымsh
:bash
по умолчанию нет в *BSD системах из-за его лицензии. - Узнаем, какие диски у нас есть в наличии. Никакого
lsblk
у нас нет, зато естьsysctl hw.disknames
, который выводит список доступных дисков. HDD обозначается какwdX
, гдеX
– номер HDD. В моей системе были только wd0 и cd0. Монтируем корневой раздел:
# mount /dev/wd0a /
wd0a
представляет из себя корневой раздел, созданный во время установки. Теперь мы выполнили требования документации. Для проверки можно посмотреть вывод команды df
.
Удаление временно созданного раздела и конфигурация CGD
За манипуляции с дисками в NetBSD отвечает disklabel
. Команда disklabel -e
служит для редактирования таблицы разделов в текстовом редакторе. Однако в однопользовательском режиме по умолчанию не установлен терминал, в связи с чем при попытке открыть текстовый редактор vi
, последний ругается на отсутствие терминала и умирает.
Конечно, всегда можно использовать редактор ed
, который является стандартным текстовым редактором, а также настоящим EDitor, а не каким-нибудь viitor или emacsitor (это даже не английские слова). Но можно и инициализировать, наконец, терминал. Для того, чтобы узнать, как нам установить терминал, необходимо ввести команду:
# tset -s
Флаг -s
используется для вывода в стандартный поток последовательности команд для инициализации переменной окружения TERM.
Если на данном этапе tset
спрашивает, какой тип терминала вам нужен, введите wsvt25
. tset
отвечает следующим образом:
Erase set to backspace TERM=wsvt25; export TERM;
Вводим эти команды и проверяем, что у нас начал работать vi
. Теперь можем ввести команду:
# disklabel -e wd0
Открывается vi
. Удаляем раздел с домашней директорией, для чего удаляем строчку, содержащую информацию о разделе /home
. В данном случае wd0b
. Выходим из vi, таблица разделов автоматически обновилась.
Теперь нам необходимо создать раздел, который будет в дальнейшем использоваться как зашифрованный. Для этого вводим команду:
# disklabel -i wd0
и попадаем в интерактивную оболочку утилиты disklabel
.
Enter '?' for help ### Вводим буквенный идентификатор нового раздела partition>e ### Указываем тип раздела Filesystem type [unused]: cgd ### Смещение начала раздела (указать адрес или раздел, после которого будет размезщен создаваемый раздел) Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: a ### Размер раздела (можно указать в байтах с приставками M, G, k и т.д. ### или использовать все доступное место) Partition size ('$' for all remaining) [0c, 0s, 0M]: $ e: 100663232 33554496 cgd # (Cyl. 33288*- 133152*)
Теперь нужно применить изменения к таблице разделов, для чего в интерактивной оболочке вводим:
partition>W ### Настоящий UNIX не будет няньчиться и писать: ### "(Y)es/(N)o". Вместо этого видим "[n]". Можно нажать enter ### и не применить изменения. Необходимо явно дать согласие: Label disk [n]?y Label written
Выходим из интерактивного режима disklabel
:
partition>Q
Создаем конфигурацию CGD командой:
# cgdconfig -g -V disklabel -o /etc/cgd/wd0e aes-cbc 256 pkcs5_pbkdf2: calibrating iterations................. done
Теперь создадим наш раздел:
cgdconfig -V re-enter cgd0 /dev/wd0e
Нас два раза спросят пароль для расшифровки раздела, после чего раздел CGD создан.
Создание таблицы разделов внутри CGD
Теперь нам необходимо создать разделы swap, /var, /usr и /home.
disklabel -iI cgd0
Снова попадаем в интерактивную оболочку.
### swap partition>a Filesystem type [4.2BSD]: swap Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: Partition size ('$' for all remaining) [49151.96875c, 100663232s, 49151.96875M]: 2G a: 4194304 0 swap # (Cyl. 0 - 2047) ### /var partition>b Filesystem type [unused]: 4.2BSD Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: a Partition size ('$' for all remaining) [0c, 0s, 0M]: 6G b: 12582912 4194304 4.2BSD 0 0 0 # (Cyl. 2048 - 8191) ### /usr partition>e Filesystem type [unused]: 4.2BSD Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: b Partition size ('$' for all remaining) [0c, 0s, 0M]: 6G e: 12582912 16777216 4.2BSD 0 0 0 # (Cyl. 8192 - 14335) ### /home partition>f Filesystem type [unused]: 4.2BSD Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: e Partition size ('$' for all remaining) [0c, 0s, 0M]: $ f: 71303104 29360128 4.2BSD 0 0 0 # (Cyl. 14336 - 49151*) partition>W Label disk [n]?y Label written partition>Q
Создание файловых систем
Для создания файловых систем в NetBSD используется утилита newfs
. Для указания типа файловой системы предоставляется флаг -O
. Формат файловой системы под цифрой 2 называется FFSv1 (или UFS2). Подробнее – в man newfs
.
# newfs -O 2 /dev/rcgd0b # newfs -O 2 /dev/rcgd0e # newfs -O 2 /dev/rcgd0f
Меняем конфигурационные файлы
Редактируем /etc/fstab
:
# NetBSD /etc/fstab # See /usr/share/examples/fstab/ for more examples. /dev/wd0a / ffs rw 1 1 /dev/cgd0a none swap sw 0 0 /dev/cgd0a /tmp mfs rw,-s=132m 0 0 /dev/cgd0b /var ffs rw 1 2 /dev/cgd0e /usr ffs rw 1 2 /dev/cgd0f /home ffs rw 1 2 kernfs /kern kernfs rw ptyfs /dev/pts ptyfs rw procfs /proc procfs rw tmpfs /var/shm tmpfs rw,-m1777,-sram%25
Создаем файл /etc/cgd/cgd.conf
, вносим туда следующую строку:
cgd0 /dev/wd0e
Добавляем в файл /etc/rc.conf
следующую строку, включая модуль CGD при каждой загрузке:
cgd=YES
Перенос данных из раздела с корнем
Теперь самое главное. Монтируем шифрованные разделы.
# mkdir /mnt/var /mnt/usr # mount /dev/cgd0b /mnt/var # mount /dev/cgd0e /mnt/usr
Скопируем содержимое директорий /var
и /usr
в новые разделы.
# cd /var # pax -rw -pe . /mnt/var # cd /usr # pax -rw -pe . /mnt/usr # umount /mnt # mv /var /var.old # mv /usr /usr.old ### Не забываем создать точки монтирования для /var и /usr, ### иначе система не сможет их примонтировать при загрузке # mkdir /var /usr
Здесь оставлю ссылку на способ переноса директорий на новые разделы с помощью pax из документации NetBSD.
Готовимся к перезагрузке
Размонтируем все и отключим (unconfigure) CGD устройство:
# umount -a # cgdconfig -u cgd0 # reboot
Теперь при загрузке нас спросят ключ для расшифровки нашего CGD раздела. Если все прошло хорошо, вас встретит приглашение для входа в систему. Можем залогиниться и удалить резеврные копии /var.old
и /usr.old
.
Заключение
Чем больше погружаюсь в BSD системы, тем больше влюбляюсь в их простоту в поиске информации без интернета. Если что-то непонятно, открываешь manpages, читаешь, и сразу в голове все складывается. В Linux я никогда такого не ощущал ввиду наличия зоопарка утилит, которые имеют одну и ту же функциональность. Здесь же все просто: для каждой задачи есть свой инструмент. О существовании ed
и мема на сайте GNU я тоже не знал до встречи с NetBSD.
Пока писал этот текст, обновил ThinkPad с X230 на T470. Встал вопрос, какую систему буду на нем использовать. Поначалу думал, что буду ставить что-то из семейства BSD, но все мы знаем, как обстоят дела с драйверами вне Linux. Искал альтернативы Manjaro, так как начало надоедать разбираться с тем, почему в очередной раз обновление пакетов сломало всю систему. В поисках наткнулся на Void Linux. Оказалось, что основатель дистрибутива – выходец из NetBSD. И наличие этих корней чувствуется при просмотре документации к Void. На данный момент образ дистрибутива распространяется и для x86 архитектуры. Можно было бы перейти на него на ноутбуке с COM и LPT, но по какой-то причине в то, что NetBSD будет поддерживать 32-битную архитектуру дольше любого дистрибутива Linux, мне верится охотнее.
Итак, данный пост написан, во-первых, для меня самого, во-вторых, для общественного пользования. Если до ознакомления с NetBSD вы (как и я) пользовались только Linux и немного FreeBSD, вы, скорее всего, столкнетесь с некоторыми трудностями при попытке сконфигурировать CGD, следуя исключительно рекомендациям из документации. Надеюсь, данный пост поможет избежать этих трудностей. А если не поможет, то всегда есть manpages.