Title: Создание шифрованного RAID1 в OpenBSD
Author: Viva Calman
Date: 2024-10-26 16:01:24
Correction code: 172994932878935

В предыдущей заметке, посвященной новому домашнему серверу на OpenBSD, я описал установку системы на шифрованный диск. Однако, мои планы не ограничивались шифрованием только диска с системой. Так что сегодня опишу, как можно сделать шифрованный RAID1, который можно примонтировать, куда душе угодно.

Для начала, разумеется, надо иметь сами диски. У меня это два обычных терабайтных механических диска. Терабайтных, потому что эти диски даже сейчас стоят относительно недорого, ну и я не планирую хранить на этом сервере каких-то колоссальных объемов данных.

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

Первым делом создаем на дисках таблицу разделов. Я сделал GPT-разметку, но консерваторы могут использовать MBR:

bash-5.2# fdisk -gy sd1
Writing GPT.

bash-5.2# fdisk -gy sd2
Writing GPT.

Теперь создаем на дисках по разделу. Размер раздела — на весь диск.

bash-5.2# disklabel -E sd1
Label editor (enter '?' for help at any prompt)
sd1> a a
offset: [64]
size: [1953525071]
FS type: [4.2BSD] ?
Filesystem type (usually 4.2BSD or swap)
FS type: [4.2BSD] RAID
sd1*> w
sd1> q

И на втором диске:

bash-5.2# disklabel -E sd2
Label editor (enter '?' for help at any prompt)
sd2> a a
offset: [64]
size: [1953525071]
FS type: [4.2BSD] RAID
sd2*> w
sd2> q
No label changes.

Имея готовые разделы, можно начинать создание шифрованного RAID1:

bash-5.2# bioctl -c 1C -l sd1a,sd2a softraid0
New passphrase:
Re-type passphrase:
softraid0: RAID 1C volume attached as sd4

Стоит обратить внимание, что имя устройства софтрейда — softraid0 вне зависимости от того, какое по счету устройство создается. Ну и на то, что мы указываем типом устройства C1 — RAID1+CRYPTO.

У меня новый шифрованный раздел получил название sd4. Он уже подключен в систему, так что осталось создать на нем свою таблицу разделов. В этот раз я не стал возиться с занулением начала дисков, так как не считаю это очень уж необходимым.

bash-5.2# fdisk -gy sd4
Writing GPT.

bash-5.2# disklabel -E sd4
Label editor (enter '?' for help at any prompt)
sd4> p
OpenBSD area: 64-1953524510; size: 1953524446; free: 1953524446
#                size           offset  fstype [fsize bsize   cpg]
c:       1953524543                0  unused
sd4> a a
offset: [64]
size: [1953524446]
FS type: [4.2BSD]
sd4*> w
sd4> q
No label changes.

И создаем на получившемся разделе файловую систему:

bash-5.2# newfs sd4a
/dev/rsd4a: 953869.4MB in 1953524416 sectors of 512 bytes
292 cylinder groups of 3266.88MB, 52270 blocks, 104704 inodes each
super-block backups (for fsck -b #) at:
 XXX, XXXXXXXXX, XXXXXXXXX...

И с одной стороны вроде бы все, можно радоваться, но нет. Рановато. Мы, конечно создали шифрованный раздел, но при загрузке системы кто-то должен ввести пассфразу для того, чтобы этот раздел появился в системе. Если мы просто пропишем наш раздел в fstab, то ничего не получится.

Здесь начинается то самое благородное написание костылей и подпорок, искусство создание которых постепенно становится утраченным.

Признаюсь, что решение ниже не мое. Оно стащено из интернета, и скорректировано исходя из моих реалий. Например, мне не требовался цикл по монтированию разных подразделов в разные точки монтирования (а если у меня будет несколько рейдов, я просто сделаю по скрипту на каждый), плюс у меня другой тип раздела (по ссылке просто шифрованный раздел, без RAID). Как бы то ни было, ниже мой вариант скриптов, которые производят монтирование:

cat /etc/rc.d/mount_raid
#!/bin/sh

# Path to the key file.  One line with a long random password
KFILE=/root/%KEYFILE%
# Modify to your needs
DUID_DISK="%DUID_DISK1%.a,%DUID_DISK2%.a"
# Modify to your needs
DUID_CRYPT=%DUID_CRYPT%

MOUNT_POINT=/mnt/%MOUNTPOINT%

SLICE_NAME=a


if [ ! -f $KFILE ]; then
    echo "$KFILE not found. Cannot mount $MOUNT_POINT"
    exit 1
fi

sync

bioctl -c 1C -l ${DUID_DISK} -p $KFILE softraid0 || exit 1

fsck -p ${DUID_CRYPT}.${SLICE_NAME}
if [ $? -gt 0 ]; then
        echo "fsck failed for ${MOUNT_POINT}.  Check manually"
        break
fi
mount -o noatime,softdep ${DUID_CRYPT}.${SLICE_NAME} ${MOUNT_POINT}
logger "Mounted ${MOUNT_POINT}"

И размонтирование:

cat /etc/rc.d/umount_raid
#!/bin/sh

DUID_CRYPT=%DUID_CRYPT%

MOUNT_POINT=/mnt/%MOUNTPOINT%

sync

echo -n "Unmount $MOUNT_POINT "
logger "Unmount $MOUNT_POINT"
umount -f $MOUNT_POINT
echo "done."
sync

bioctl -d ${DUID_CRYPT}

Поясню по переменным в скрипте:

%DUID_DISK1%.a,%DUID_DISK2%.a

Это DUID-ы разделов, входящих в основу софтрейда. Тех, которые находятся на физическом диске. ".a" после DUID-а означает, что мы монтируем первый имеющийся там раздел. Меня такое отсутствие гибкости вполне устраивает, но если вам нужно, в оригинальной заметке был более гибкий вариант. В моем скрипте переменная — это строка, которая в себе содержит два разделенных запятой значения. Не очень изящно, но работает.

%DUID_CRYPT%

Это уже DUID самого шифрованного раздела.

%KEYFILE%

Это название файла, который содержит в себе пассфразу для расшифровки. Да, она там лежит в открытом виде. Но надо понимать, что сам файл лежит в домашней директории пользователя root, а если злоумышленник в вашей системе получил рутовые права, то скорее всего ваши проблемы уже не смогут стать сильно хуже.

%MOUNTPOINT% же говорит само за себя.

Чтобы вся эта прелесть работала, ссылку на первый скрипт нужно поместить в /etc/rc.local:

cat /etc/rc.local
/etc/rc.d/mount_raid

Просто создать файл, если его нет, и прописать туда путь к скрипту. Аналогично, второй скрипт прописывается в /etc/rc.shutdown

cat /etc/rc.shutdown
/etc/rc.d/umount_raid

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

Надо понимать, что монитрование раздела происходит довольно поздно, поэтому вопрос с запуском демонов, которым нужны данные на этом разделе, нужно решать отдельно.

И последнее замечание — я смонтировал получившийся раздел в директорию, находящуюся в /mnt. Если вы захотите сделать себе отдельный шифрованный раздел под /home, то прочитайте по ссылке, как сделать, чтобы у вас не сломалось обновление через sysupgrade.

^HOME