В предыдущей заметке, посвященной новому домашнему серверу на 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.