Как создать в Debian случайно зашифрованный раздел подкачки, ссылаясь на него "by-uuid"?
Разумно, что если в вашей системе GNU/Linux реализовано какое-либо шифрование блочных устройств, нужно также зашифровать свой раздел подкачки, поскольку любые расшифрованные данные могут быть в любой момент записаны в виде открытого текста.
Просматривая справочную страницу debian для "crypttab", я вижу пример создания раздела подкачки со случайным ключом при загрузке, поэтому ключ устанавливается случайным образом в процессе загрузки и известен только самой системе:
# Encrypted swap device
cswap /dev/sda6 /dev/urandom cipher=aes-cbc-essiv:sha256,hash=ripemd160,size=256,swap
В этом примере на сменное устройство ссылается обычный путь разработки, т.е. /dev/sda6
Абсолютные пути к устройствам могут быть изменены и переназначаться при загрузке, например, если подключен USB-накопитель. Пользователь будет очень недоволен, если /dev/sda6
оказалось, что раздел отличается от ожидаемого, и впоследствии он был перезаписан случайными данными свопинга!!
Таким образом, решение может выглядеть так: использовать UUID вместо пути к устройству (так как UUID не должен меняться), заменяя /dev/sda6
с /dev/disk/by-uuid/<whatever the uuid of dev/sda6 is>
НО... вот в чем проблема: каждый раз, когда cryptsetup воссоздает зашифрованный раздел подкачки во время загрузки, он генерирует для него новый UUID! Doh!
Поэтому нам нужно как-то сохранить UUID этой зашифрованной файловой системы. Я думаю, что cryptsetup может сделать это с его --offset
переключатель, позволяющий сохранить заголовок LUKS и, следовательно, UUID.
Я нашел этот URL: https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS
Кто-нибудь знает, как реализовать решение, описанное для Arch Linux на ОС Debian? Сценарии инициализации, упомянутые в документе, похоже, не существуют в ОС Debian.
Спасибо!
EDIT Можно использовать ecryptfs для достижения тех же целей (зашифрованное пространство подкачки) с помощью команды:ecryptfs-setup-swap
Без проблем, которые блокируют устройство шифрования. Посмотрите на этот вопрос AskUbuntu
7 ответов
Каждый раз, когда cryptsetup воссоздает зашифрованный раздел подкачки во время загрузки, он генерирует для него новый UUID! Doh!
В / etc / crypttab используйте /dev/disk/by-id вместо /dev/disk/by-UUID для ссылки на раздел подкачки. Например, ваша запись / etc / fstab для swap может быть
#<file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/cswap none swap sw 0 0
Тогда правильная соответствующая запись в / etc / crypttab будет выглядеть примерно так:
# <name> <device> <password> <options>
cswap /dev/disk/by-id/ata-SAMSUNG_SSD_830_Series_S0XYNEAC762041-part5 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
Обратите внимание, что указанное выше устройство называется /dev/disk/by-id, который вы можете узнать для своего диска, набрав в CLI следующее:
ls -lF /dev/disk/by-id
В моем /etc/crypttab у меня есть
# <target name> <source device> <key file> <options>
swap /dev/mapper/cswap /dev/random swap
Здесь / dev / mapper / cswap - это логический том, созданный LVM, который заботится о правильном назначении имен логических томов независимо от имен букв дисков. Это также позволяет мне легко изменить размер раздела подкачки.
Чтобы выполнить подкачку зашифрованного файла через раздел LVM при использовании
by-uuid
вариант невозможен... во время
initramfs
этап загрузки или в течение большей части
systemd
этапы загрузки.
Вот почему...
Или перейдите к разделу "Шаги", чтобы начать работу с таким же безопасным зашифрованным пространством подкачки LVM, которое создается во время обычного этапа загрузки (для systemd, Debian 10).
Предположения
Вы создали раздел LVM с именем
lv_swap_encrypted
используя 100%
vg_swap
Следующее пространство VG:
lvcreate -l 1000%VG -n lv_swap_encrypted vg_swap
так что наша цель - получить следующую логическую схему:
/dev/sda3
LVM Physical Volume (PV)
/dev/mapper/dm-7
LVM Volume Group (VG)
/dev/vg_swap
LVM Logical Volume (LV)
/dev/vg_swap/lv_swap_encrypted
cryptsetup plain
/dev/mapper/swap_unencrypted
swap space
Проблема
Взгляните на недавно созданный раздел LVM с именем
vg_swap-lv_swap_encrypted
просто для использования со свопом (или зашифрованным свопом):
# ./lsblk-uuid
NAME UUID MOUNTPOINT
sda
├─sda1
├─sda2 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /boot
├─sda3 XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX
│ └─vg_swap-lv_swap_encrypted
└─sda4 XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX
├─arca_v1-root XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /
└─arca_v1-spare
...
Обратите внимание, что для этого нет UUID
vg_swap-lv_swap_encrypted
раздел?
ВЫ МОЖЕТЕ выполнить
mkswap vg_swap-lv_swap_encrypted
на этом LVM и получить этот UUID, но тогда мы пропустим столь необходимую часть шифрования, которую мы хотели.
ВНИМАНИЕ: О, вы казнили
mkswap
? Затем вытрите его, выполнив:
dd if=/dev/urandom of=/dev/mapper/vg_swap-lv_swap_encrypted
Выполнение
dmsetup info /dev/dm-7
показывает другой формат UUID:
LVM-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Я уже пробовал
UUID=
вариант с этим фанковым значением LVM выше не будет работать во втором поле
/etc/crypttab
или. Здесь мне стоила перезагрузка.
Примечание: X представляет VG UUID, а Y - LV UUID на языке LVM.
Доступность ссылок на устройства
На этапе загрузки initramfs не так много символических ссылок доступно для использования на этапе загрузки. Мы исследуем, какие пути к устройствам доступны для зашифрованного свопа.
Не нужно делать
update-initramfs
или любое восстановление initfs здесь.
Имена связанных устройств LVM
в
/dev
каталог LVM создает несколько символических ссылок для каждого раздела LV (логического тома), который
lvcreate
(или же
systemd-lvm2
во время загрузки) активируется.
На этапе загрузки initramfs активация LVM создает следующие блочные и символические ссылки на файлы:
/dev/dm-X
/dev/mapper/vg_swap-lv_swap_encrypted
/dev/vg_swap/lv_swap_encrypted
На этапе нормальной загрузки ядра операционная система заботится об остальных следующих ссылках. Нет необходимости выяснять, кем и где, поскольку наше внимание уделяется доступности канала для зашифрованного раздела подкачки ВО ВРЕМЯ
initramfs
этап загрузки.
/dev/block/254:X
/dev/254:X
/dev/vg_swap-lv_swap_encrypted
/dev/lv_swap_encrypted
/dev/dm-name-vg_swap-lv_swap_encrypted
/dev/disk/by-id/dm-uuid-LVM-XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYY YYYYYYYYYYYYYYY
/dev/dm-uuid-LVM-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY YYYY
Спустя двадцать перезагрузок на уровень запуска 2 я узнал, что это никогда не будет возможным (во время
initramfs
этап загрузки) использовать mount
by-uuid
поскольку каждый раз, когда своппер записывает незашифрованные данные в первые пару блоков зашифрованного раздела, какой бы UUID он ни имел до того, как его зашифрованные данные были записаны поверх него, теперь давно, давно нет.
Для нормального этапа после загрузки UUID можно использовать в
cryptsetup
/cryptdisks_*
.
Давайте отступим от UUID физического и расширенного раздела, чтобы взглянуть на UUID LVM здесь: управление LVM в значительной степени гарантирует, что каждый раздел LVM уникален.
ОПАСНОСТЬ: Короче говоря, единственная опасность для вас заключается в повторном использовании этого же раздела LVM для чего-то еще, кроме свопа. Если это так, то при следующей перезагрузке этот раздел снова преобразуется в пространство подкачки, и все вновь установленные данные исчезают (только радуйтесь, что это не старые и ценные данные).
НАСТРОИТЬ
Такое расположение LVM VG/LV name было бы невосприимчивым к потере данных, вызванной добавлением, удалением или перераспределением жесткого диска, будь то своп или файловая система.
В этом
/etc/crypttab
пример:
swap_unencrypted /dev/mapper/vg_swap-lv_swap_encrypted /dev/random none
пространство подкачки с использованием случайного ключа на основе памяти И с использованием пути VG / LV, этот подход возьмет существующий раздел подкачки и преобразует его в зашифрованное пространство подкачки.
В основном следующие шаги будут
- отключить спящий режим,
- создать раздел LVM для зашифрованной части пространства подкачки,
- сделать новую запись в
/etc/crypttab
- получите dm-crypt/LUKS, чтобы создать еще один раздел swap_unencrypted.
- изменить запись подкачки в
/etc/fstab
- Создать пространство подкачки (
mkswap
) - Включить пространство подкачки ('swapon`)
все, чтобы заново зашифровать пространство подкачки сейчас и после каждой перезагрузки.
Отключить гибернацию
Чтобы использовать случайный ключ, вы должны понимать, что функция гибернации больше не поддерживается.
Вам также следует отключить спящий режим, прежде чем продолжить. Hibernate использует пространство подкачки, а рандомизированные ключи фактически делают предыдущую гибернацию совершенно непригодной для использования.
Примечание: мы ХОТИМ установить физический или расширенный раздел для SWAP, чтобы обмануть systemd
initramfs
генератор, чтобы НЕ отключать часть SUSPEND/SLEEP.
В Debian вы можете выполнить:
systemctl mask hibernate.target hybrid-sleep.target
systemctl restart systemd-logind.service # or reboot if using Gnome/gdm3 display manager
Хорошая новость заключается в том, что аппаратная приостановка или спящий режим по-прежнему будут работать.
Создать LVM
Эти шаги предполагают, что у вас уже есть физический или расширенный (а не LVM) раздел для раздела подкачки.
Повторно введите раздел подкачки
Предположим, что
/dev/sda
это имя диска. Предположим, что
3
это номер раздела
/dev/sda
диск, на котором расположен своп.
Выполнить
fdisk
и использовать
t
возможность переименовать
Linux swap
в
Linux LVM
введя в
31
(или вы можете использовать
L
чтобы перечислить все варианты после этого
t
запятая nd.
# fdisk /dev/sda
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): t
Partition number (1-4, default 4): 3
Partition type (type L to list all types): 31
Changed type of partition 'Linux swap' to 'Linux LVM'.
Command (m for help): w
The partition table has been altered.
Syncing disks.
Создать физический том LVM
Создайте физический том для LVM, выполнив:
pvcreate /dev/sda3
Создать группу томов LVM
Создайте группу томов для LVM, выполнив:
vgcreate vg_swap /dev/sda3
Хорошая особенность группы томов заключается в том, что вы можете позже расширить пространство подкачки с помощью другого физического жесткого диска.
Создать логический том LVM
Создайте логический том для LVM, выполнив:
lvcreate -l 100%vg -n lv_swap_encrypted vg_swap
# Make the LVM create a special file under /dev/vg_swap/lv_swap_encrypted
lvchange -a y vg_swap
Теперь у нас есть
/dev/dm-7
блокировать файл.
Вы обнаружите, что:
/etc/mapper/vg_swap-lv_swap_encrypted
/etc/vg_swap/lv_swap_encrypted
все указывает на одно и то же
/dev/dm-7
.
Я буду защищать использование
/etc/mapper/vg_swap-lv_swap_encrypted
потому что это постоянное место, которого может ожидать большинство из нас.
Не многие знают, как искать здесь это настраиваемое имя группы томов LVM, например
/dev/vg_swap
. Некоторые другие (как и большинство BOFH), которые создают труднодоступные/etc/mapper_other
(VG имя
mapper
), чтобы его было труднее искать.
Мы не будем использовать
/dev/dm-7
потому что это могло бытьdm-19
или другое, в зависимости от схемы вашего раздела.
Теперь у нас есть путь к диску, логическому диску, но еще нет зашифрованного диска со случайным ключом, указывающим на
/dev/mapper/vg_swap-lv_swap_encrypted
.
Зашифрованный раздел подкачки
Добавьте или измените следующую запись в
/etc/crypttab
:
swap_unencrypted /dev/mapper/vg_swap-lv_swap_encrypted /dev/urandom swap,cipher=
aes-cbc-essiv:sha256,size=256
Затем активируйте шифрование и создайте еще одно устройство dm под
/dev/mapper
блокировать устройство: выберите одну из двух команд ниже:
# cryptsetup open /dev/mapper/vg_swap-lv_swap_encrypted \
swap_unencrypted
или же
# cryptdisks_start swap_unencrypted
[ ok ] Starting crypto disk...swap_unencrypted (running)...done.
Создана новая символическая ссылка, выполнить
lsblk
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3.7T 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 381M 0 part /boot
├─sda3 8:3 0 15.3G 0 part
│ └─vg_swap-lv_swap_encrypted 254:7 0 15.3G 0 lvm
│ └─swap_unencrypted 254:8 0 15.3G 0 crypt [SWAP]
└─sda4 8:4 0 3.6T 0 part
├─arca_v1-root 254:0 0 186.3G 0 lvm /
... 11:0 1 1024M 0 rom
Вы можете посмотреть UUID для этого раздела LVM, но сейчас это бесполезно.
Выполнить
lsblk -o name,uuid,mountpoint
# ~/bin/lsblk -o name,uuid,mountpoint
NAME UUID MOUNTPOINT
sda
├─sda1
├─sda2 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /boot
├─sda3 XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX
│ └─vg_swap-lv_swap_encrypted
│ └─swap_unencrypted
└─sda4 XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX
├─arca_v1-root XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /
...
Недавно созданное блочное устройство для
/dev/mapper/swap_unencrypted
теперь существует.
Подробная информация о /dev/mapper/swap_unencrypted:
# cryptsetup status swap_unencrypted
/dev/mapper/swap_unencrypted is active.
type: PLAIN
cipher: aes-cbc-essiv:sha256
keysize: 256 bits
key location: dm-crypt
device: /dev/mapper/vg_swap-lv_swap_encrypted
sector size: 512
offset: 0 sectors
size: 31997952 sectors
mode: read/write
Создать пространство подкачки
Создайте пространство подкачки:
# mkswap /dev/mapper/swap_unencrypted
Setting up swapspace version 1, size = 15.3 GiB (16382947328 bytes)
no label, UUID=8cd89984-9892-4d62-a9ba-ecfb6476379c
Теперь обратите внимание на UUID, созданный для
swap_unencrypted
? Это всегда будет отличаться при каждой перезагрузке.
# ~/bin/lsblk-uuid
NAME UUID MOUNTPOINT
sda
├─sda1
├─sda2 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /boot
├─sda3 XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX
│ └─vg_swap-lv_swap_encrypted
│ └─swap_unencrypted 8cd89984-9892-4d62-a9ba-ecfb6476379c [SWAP]
└─sda4 XXXXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XXXXXX
├─arca_v1-root XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /
...
Активировать пространство подкачки
В
/etc/fstab
, измените или добавьте строку записи подкачки:
/etc/mapper/swap_unencrypted none swap sw 0 0
Затем выполните:
# swapon /dev/mapper/swap_unencrypted
Пространство подкачки теперь шифруется с использованием случайного ключа.
Поскольку dm-crypt использует UUID, предоставленный блочным устройством LVM LV, это должно быть достаточным ответом на функционально защищенное зашифрованное пространство подкачки.
Заключение
UUID нельзя использовать для зашифрованного раздела подкачки из-за шотастического характера зашифрованных данных, который не позволяет идентифицировать такой раздел (swap, ext4, btfs).
UUID нельзя использовать для незашифрованного раздела подкачки, предоставленного
cryptsetup
потому что наша цель - обновлять пространство подкачки при каждой перезагрузке.
Вы могли бы использовать
/dev/disk/by-id
.
Но LVM предлагает более чем достаточную защиту благодаря ВАШЕМУ уникальному соглашению об именах для каждого раздела VG и LV.
Вышеуказанная установка предоставляет уникально зашифрованный локатор пространства подкачки, который будет зашифрован, но не подлежит восстановлению после каждой перезагрузки (или, в редких случаях, перемонтирования LVM).
Попробуйте реализовать оставшуюся часть решения, игнорируя файл инициализации. Похоже, что этот скрипт инициализации только для того, чтобы защитить вас. Либо Debian не защищает вас таким образом, либо при попытке загрузки с ним вы получите сообщение об ошибке, которое, мы надеемся, приведет вас в нужное место.
Я также был бы осторожен с тем, что IIRC Debian и ArchLinux имеют разные форматы для /etc/crypttab (я знаю, что это безумие, но я перешел из Ubuntu в Arch пару лет назад и в конечном итоге решил использовать прямой bash, а не вмешиваться в crypttabs).
Запустите ecryptfs-setup-swap или вручную:
Эта конфигурация использует случайно сгенерированные ключи при загрузке и не поддерживает гибернацию на жесткий диск! Вы должны отключить режим гибернации с помощью соответствующей утилиты DE Power Management Utility и установить для нее значение "Выключить при критическом уровне", чтобы избежать потери данных!
Переключиться на учетную запись администратора / root
su root или sudo для каждой команды
Отключить своп
своп -а
Найдите существующий раздел подкачки
lsblk
пример: sda3 8:3 0 8G 0 часть [SWAP]
Перезаписать старый своп
дд если =/dev/ ноль бс =1024000 из =/dev/sda<#>
пример: dd if=/dev/zero bs=1024000 of=/dev/sda3
Настройка FSTAB
vim / etc / fstab
Замените старое устройство SWAP на имя устройства отображения crypttab: / dev / mapper / cswap
OLD UUID = d03f3d8e-7888-48a5-b3cc-41de8dbbcfdc swap swap default по умолчанию 0 0
NEW
/ dev / mapper / cswap none swap pri = 1, по умолчанию 0 0
Настройка Crypto
ls -lF /dev/disk/by-id
Пример: ata-HGST_HTS545050A7E680_TEK55D4F0BU3GV-part3 ->../../sda3
vim / etc / crypttab
cswap / dev / disk / by-id / ata-HGST_HTS545050A7E680_TEK55D4F0BU3GV-part3 / dev / urandom swap, шифр =aes-cbc-essiv:sha256, размер =256
Активный зашифрованный своп
Перезагрузите компьютер
Проверьте зашифрованные операции обмена
dmsetup -C информация
Пример: cswap 253 0 L - w 2 1 0 CRYPT-PLAIN-cswap
lsblk
Пример ├─sda3 8:3 0 8G 0 часть
C └─cswap 253:0 0 8G 0 склеп [SWAP]
cat / proc / swaps
пример: имя файла тип размер используемый приоритет / dev / dm-0 раздел 8385532 0 -1
Если вы используете таблицы разделов GPT , то, например/dev/disk/by-partuuid/d1a59352-aa44-4748-85fc-4cf785702f99
— это стабильное имя устройства, которое не изменится даже при изменении содержимого.
Не Дебиан, а Федора 36.
Подтверждаем , что идея @Brian Minton об использовании UUID раздела, содержащегося в таблице разделов GUID, может быть эффективно использована для решения этой конкретной проблемы. Конечно, вам нужна структура диска, использующая таблицу разделов GUID, а не старую таблицу разделов MS-DOS.
Например, я хочу иметь энергозависимый, но зашифрованный раздел подкачки на/dev/sda3
и мы можем найти UUID раздела GUID, посмотрев/dev/disk/by-partuuid/
(или позвонивblkid /dev/sda3
)
# ls -l /dev/disk/by-partuuid/
total 0
lrwxrwxrwx. 1 root root 10 Jun 22 09:54 1bcc8619-ab8d-4709-b1a6-dcb6ac8bdd1b -> ../../sda3
И тогда нам просто нужно добавить соответствующие строки в/etc/cryptsetup
и/etc/fstab
как показано (оранжевым цветом) на схеме ниже.
После загрузки мы находим следующее вsystemd
войти сjournalctl
:
systemd-makefs[693]: Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
systemd-makefs[693]: LABEL=cryptoswap, UUID=5d930dd4-4799-4f7a-928e-b2da1c5b9508
systemd-makefs[691]: /dev/mapper/cryptoswap successfully formatted as swap (label "cryptoswap", uuid 5d930dd4-4799-4f7a-928e-b2da1c5b9508)
systemd[1]: Finished systemd-cryptsetup@cryptoswap.service - Cryptography Setup for cryptoswap.
systemd[1]: Reached target blockdev@dev-mapper-cryptoswap.target - Block Device Preparation for /dev/mapper/cryptoswap.