Михайлов Леонид Вадимович. Персональный веб-сайт
12.08.2025

Установка 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 будет мучительно долгим. Я использовал автоматическую конфигурацию сети и установил местное время.

Загрузка в однопользовательском режиме

В документации игриво написано: "Загрузитесь в однопользовательском режиме с примонтированным корневым разделом и размонтированными остальными". Для тугодумов типа меня описываю шаги:

  1. Когда загрузчик спрашивает, в каком режиме загрузиться, выбираем цифру "2. Boot single user".
  2. Далее нас спрашивают, откуда загрузить shell. Нажимаем Enter, выбирая тем самым sh: bash по умолчанию нет в *BSD системах из-за его лицензии.
  3. Узнаем, какие диски у нас есть в наличии. Никакого lsblk у нас нет, зато есть sysctl hw.disknames, который выводит список доступных дисков. HDD обозначается как wdX, где X – номер HDD. В моей системе были только wd0 и cd0.
  4. Монтируем корневой раздел:

    # 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.

Теги: bsd шифрование диска cgd