Как создать в 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.

Другие вопросы по тегам