LINUX.ORG.RU

Полнодисковое шифрование (cryptsetup) c UEFI и NVME

 , ,


1

2

Добрый день. До недавнего времени всегда без проблем делал полнодисковое шифрование на компах с Debian. По стандартной схеме:

  • ставим систему на флешку с разделами / и swap, /boot в раздел другой флешки, которая затем будет загрузочной;
  • после установки грузимся с этих двух флешек;
  • шифруем диск, раскатываем на нем lvm (lv-root, lv-swap), header диска сбрасываем в папку на загрузочную флешку, туда же ключи, место под header’ом затираем;
  • rsynk’ом синхронизируем систему с первой флешки на зашифрованный диск;
  • в crypttab на диске прописываем подключать lv-root и где брать header и ключи; во fstab - вместо UUID корня и swap - lv-root, lv-swap;
  • update-initramfs, в grub - новый путь к корню (lv-root вместо UUID).

Перезагружаемся и все работает.

Уже неделю бьюсь над реализацией подобной схемы на компах с UEFI и NVME. Другие купить уже просто не продают, буржуи.

Ставлю debian buster, пробовал также последнюю ubuntu.

На загрузочной флешке создал дополнительно этот долбаный EFI-раздел. Вроде система встала.

При update-initframs варнинги, что он шифрованных разделов в системе нет, удалите мол cryptsetup-initramfs за ненадобностью.

После перезагрузки - Busybox и (initramfs).

Уже и chroot’ился в диск после синхронизации, делая update-initramfs из-под chroot.

Накопал, что в /etc/cryptsetup-initramfs/conf-hook теперь не надо делать CRYPTSETUP=y, а в /etc/initramfs-tools/conf.d/cryptsetup надо добавить:

CRYPTSETUP=yes export CRYPTSETUP

а в /etc/default/grub: GRUB_ENABLE_CRYPTODISK=y

Все - как мертвому припарка.

Получал странные результаты.

То при загрузке груб говорит, что не видит хидера для открытия блочного устройства (когда изначальная флешка вытащена и грузиться надо с диска).

То вроде все прописано как надо, но при загрузке (когда вторая флешка вставлена), он потупит и грузится, монтируя корнем ее. Где он ее берет, если в crypttab и во fstab прописан диск?

Какой-то полтергейст. Но четкое ощучение, что во всем виноват EFI и NVME.

Я что-то пропустил в шифровании? Информации по особенностям реализации вышеизложенной схемы на новых компах не нашел. Очень прошу ткнуть пальцем или примерно объяснить в чем заковыка.



Последнее исправление: Neuro75 (всего исправлений: 1)

Подробнее, что делал.

Debian buster. Сначала на родном ядре - 4.19, потом из бэкпортов накатил 5.6.

Загрузочная флешка:

  • /dev/sda
    ** /dev/sda1 ext2 /boot
    ** /dev/sda2 fat32 efi

Промежуточная флешка:

  • /dev/sdb
    ** /dev/sdb1 ext4 /
    ** /dev/sdb2 none swap

Винт ноута:

  • /dev/nvme0n1
dd if=/dev/urandom of=/dev/nvme0n1 bs=512KB
cryptsetup benchmark

выбираем aes-xts

mkdir /boot/.crypt
dd if=/dev/random of=/boot/.crypt/key bs=1 count=512
cryptsetup -h=sha512 -c=aes-xts-plain64 -s=512 luksFormat /dev/nvme0n1 /boot/.crypt/key
cryptsetup luksHeaderBackup /dev/nvme0n1 --header-backup-file=/boot/.crypt/header
dd if=/dev/urandom of=/dev/nvme0n1 bs=1 count=2068480
cryptsetup -d=/boot/.crypt/key --header=/boot/.crypt/header open /dev/nvme0n1 dmap_root
pvcreate /dev/mapper/dmap_root  
vgcreate vg_root /dev/mapper/dmap_root  
lvcreate -L10G -nlv_swap vg_root  
lvcreate -l 100%FREE -nlv_root vg_root  
mkswap /dev/mapper/vg_root-lv_swap  
mkfs.ext4 /dev/mapper/vg_root-lv_root

Тут все понятно. До этого момента все работало и раньше и сейчас работает. Далее обычно делал так:

cp /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/cryptroot

В /etc/cryptsetup-initramfs/conf-hook раскомментировать и вписать:

CRYPTSETUP=y

В /etc/initramfs-tools/modules добавить:

dm_mod
dm_crypt
sha512
sha256
serpent_generic
aes_generic
xts

ls -l /dev/disk/by-id/ | grep nvme0n1 откуда заполняю crypttab

dmap_root	/dev/disk/by-id/тут_id_nvme0n1	/boot/.crypt/key	luks,header=/boot/.crypt/header,keyscript=/lib/cryptsetup/scripts/passdev

Создаю /etc/initramfs-tools/hooks/cryptokeys

PREREQ=""  
prereqs()  
{  
  echo "$PREREQ"  
}  
case $1 in  
prereqs)  
  prereqs  
  exit 0  
  ;;  
esac  
if [ ! -x /sbin/cryptsetup ]; then  
  exit 0  
fi

. /usr/share/initramfs-tools/hook-functions  
mkdir ${DESTDIR}/etc/console  
cp /boot/.crypt/key* ${DESTDIR}/etc/console  
cp /boot/.crypt/header* ${DESTDIR}/etc/console  
copy_exec /sbin/cryptsetup /sbin  

Создаю /etc/initramfs-tools/scripts/local-top/cryptokeys

PREREQ="udev"  
prereqs()  
{  
  echo "$PREREQ"  
}  
case $1 in  
# get pre-requisites  
prereqs)  
  prereqs  
  exit 0  
  ;;  
esac  
modprobe -b dm_crypt  
modprobe -b serpent_generic  
modprobe -b aes_generic  
modprobe -b sha512  
modprobe -b sha256  
modprobe -b xts  

/sbin/cryptsetup -d=/etc/console/key --header=/etc/console/header open /dev/disk/by-id/тут_id_nvme0n1 dmap_root
chmod +x /etc/initramfs-tools/hooks/cryptokeys && chmod +x /etc/initramfs-tools/scripts/local-top/cryptokeys
update-initramfs -k all -u

На данном этапе ранее update-initramfs отрабатывал без каких-либо доп.сообщений. Я перезагружался для проверки, что винт корректно расшифровывается и создаются /dev/mapper/dmap_root, lv_swap, lv_root и шел дальше:

mkdir /mnt/root  
mount /dev/mapper/vg_root-lv_root /mnt/root  
rsync -PavHx / /mnt/root  

В /mnt/root/etc/fstab менял UUID / и swap на /dev/mapper/vg_root-lv_root и /dev/mapper/vg_root-lv_swap соответственно.
А в /boot/grub/grub.cfg вручную правил строку

linux   /vmlinuz-4.9.0-12-amd64 root=UUID=aaaa-aaaaaaa-aaaa-aaaaa-aaaaaaaaa ro  quiet

на

linux   /vmlinuz-4.9.0-12-amd64 root=/dev/mapper/vg_root-lv_root ro  quiet

после чего выключался, извлекал промежуточную флешку и дальше все прекрасно работало.
Сейчас, после update-initramfs выдало варнинг, что крипторазделы не найдены. Насторожился, но продолжил делать как ранее. После перезагрузки - черный экран, Busybox бла-бла-бла и приглашение (initramfs).
Гуглил, нашел много отрывочных сведений, более менее полные - тут: https://habr.com/ru/post/482696/
Скомпилировав свой старый алгоритм действий и приведенный в этой статье, понял, что алгоритм нынче поменялся и после форматирования vg_root-lv_root хуки не копировал, скрипты не создавал, в /etc/cryptsetup-initramfs/conf-hook CRYPTSETUP=y оставил закомментированным.
В /etc/initramfs-tools/conf.d/resume закомментировал упоминание swap.
Создал /etc/initramfs-tools/conf.d/cryptsetup с

# /etc/initramfs-tools/conf.d/cryptsetup
CRYPTSETUP=yes
export CRYPTSETUP

В /etc/default/grub добавил

GRUB_ENABLE_CRYPTODISK=y

Сделал

grub-mkconfig -o /boot/grub/grub.cfg

он нашел и систему на промежуточной флешке и на vg_root-lv_root, добавив соответсвующие строки в загрузчик.
После этих действий update-initramfs -u -k all отрабатывал без варнингов. Но, при перезагрузке через новый появившийся пункт в grub - таже картина с выбрасыванием в черный экран с (initramfs).
Обратил внимание, что если оставить промежуточную флешку, то система грузится, но корень монтируется на флешку, а не на диск, несмотря на прописанный во fstab /dev/mapper/vg_root-lv_root. Откуда он ее берет? Из данных раздела efi?
Прописывал в grub.cfg root=/dev/mapper/vg_root-lv_root вручную.
Chroot’ился в vg_root-lv_root и в нем update-initramfs'ился. Потом всячески экспериментировал с обновлениями груба и инитрамфса во всевозможных комбинациях.
Картина одна и таже - со вставленной промежуточной флешкой грузится, корень на ней. Без флешки - черный экран с (initramfs).
Делал на разных машинах (все с только UEFI-загрузкой и с nvme-накопителем), разных ядрах (новых) - без изменений. На машине с legasy-boot и обычной ssd’шкой - запустилось, но только на stretch (со старым ядром, соответственно). Пробовал на последней ubuinte (20.4). Что происходит? Что поменяли? Почему шифрование поломалось? Или руки у меня поломались?

Neuro75
() автор топика
Ответ на: комментарий от anonymous

Если надо очистить твердотельный накопитель от старых данных, то ИМХО лучше использовать встроенную функцию Secure Erase, чтобы контроллер самостоятельно стёр все блоки памяти.

Radjah ★★★★★
()
Ответ на: комментарий от Radjah

Да это то все ладно, не принципиально.
Шифровать то как теперь, вот что самое главное.
Вот уже до такой статьи дошел: https://tech-geek.ru/luks2-full-disk-encryption/ и чем больше в вопрос вникаю, тем больше понимаю что ничего не понимаю.

Neuro75
() автор топика

Зачем такое извращение? Какой смысл в двух флешках?

Я что-то подобное делаю так.

На одну флешку пишу debian.iso.

На второй флешки при установке создаю разделы под /boot/efi и /boot. Оба без шифрования.

На обычном ssd создаю раздел luks без выноса заголовка (нет смысла). Там по желанию lvm или одиночный раздел под / со swapfile.

После установки в памяти создаю через dd ключ нужной длины, добавляю его в нужный luks. Прогоняю его через GPG и кладу на флешку в /boot. Правлю crypttab для использования root.key.gpg и update-initramfs. Готово.

При парольной фразе 20-30++ символов нет смысла ещё как-то заморачиваться.

anonymous
()
Ответ на: комментарий от anonymous

На обычном ssd создаю раздел luks без выноса заголовка (нет смысла).

Заголовок выношу, чтобы скрыть сам факт, что диск зашифрован.
А раздел создаете, так понял, сразу при установке?
Хм, действительно, как было отмечено выше я видно знаю толк в извращениях. Никто ведь не мешает, при необходимости, заголовок вынести потом, указав путь к нему в параметрах crypttab.

После установки в памяти создаю через dd ключ нужной длины, добавляю его в нужный luks. Прогоняю его через GPG и кладу на флешку в /boot. Правлю crypttab для использования root.key.gpg

А можно этот момент подробнее осветить командами и примером crypttab? Не очень понял «Прогоняю его через GPG».

Neuro75
() автор топика
Последнее исправление: Neuro75 (всего исправлений: 1)
Ответ на: комментарий от Neuro75

Писать с телефона не очень, поэтому просмотр это видео:

https://youtu.be/upOqR4HPi60

В нем человек даёт основу по luks+GPG, плюс засвечивает pdf tutorial, в котором есть информация по твоему вопросу.

anonymous
()
Ответ на: комментарий от anonymous

Человека, который придумал т9, нужно четвертовать. Ъуъ

anonymous
()

По стандартной схеме:

ставим систему на флешку с разделами / и swap, /boot в раздел другой флешки, которая затем будет загрузочной

Это не стандартная схема, это бред какой-то. Стандартная это шифрованный корень, шифрованный swap, отдельного /boot нет, никаких флешек нет.

Изволь рассказать, че ты там выдумал и зачем.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

Да так, копипащу команды, которые нашел в этих ваших интернетах помаленьку. Ваша схема стандартнее, поэтому не обращайте внимание.

Neuro75
() автор топика

Намудрил ты. Выкинь grub. Грузись с efi-stub ядра. initrd с заголовками можешь в него же встроить. Тут бы еще secureboot, но если ты не хочешь оставлять следов, то нет. Ядро на флешку. Система - gentoo(calculate) с подпиленным init(rd) genkernel.

boowai ★★★★
()
Ответ на: комментарий от Neuro75

rsync -PavHx / /mnt/root

Никто не понял зачем вторая флешка? Это типа загрузочная Дебиан? В место нее люди используют загрузку LiveDVD с CD/DVD привода?

Тебе надо скопировать кучу атрибутов файлов которые есть в ACL, XATTR. Проверь опции rsync.

dd if=/dev/urandom of=/dev/nvme0n1 bs=512KB

dd if=/dev/urandom of=/dev/nvme0n1 bs=2M status=progress

или быстрее:

cryptsetup open –type=plain –key-file=/dev/urandom /dev/nvme0n1 delete_nvme0n1

dd if=/dev/zero of=/dev/mapper/delete_nvme0n1 bs=2M status=progress

cryptsetup close delete_nvme0n1

Учитывая что у тебя ssd так делать нельзя, или надо сделать оговорку:

«Overwriting a whole SSD with random data will mark every block as used and can, depending on manufacturer and model, severely degrade wear levelling. This might have potentially disastrous effects on disk lifetime. As mitigation, it is sometimes recommended to leave a substantial portion of the disk, around 10 - 20%, unused to have enough empty blocks for wear levelling. This can be done by creating a suitably sized, unformatted partition, and properly discarding it with blkdiscard. Please note that mounting a LUKS container with the –allow-discards option will transparently forward discards to the SSD and would contradict above setup.»

выбираем aes-xts

Плохо, надо было:

cryptsetup luksFormat -c aes-cbc-essiv:sha256 -s 256 …

dd if=/dev/random of=/boot/.crypt/key bs=1 count=512

Ключик надо бы запаролить:

dd if=/dev/urandom count=64 | gpg –symmetric –cipher-algo aes –armor > /boot/.crypt/key

gpg –decrypt /boot/.crypt/key | cryptsetup luksFormat …

gpg –decrypt /boot/.crypt/key | cryptsetup open …

GRUB_ENABLE_CRYPTODISK=y

Конкретно в твоей схеме все должно работать без этой опции.

cryptsetup luksHeaderBackup /dev/nvme0n1 –header-backup-file=/boot/.crypt/header

dd if=/dev/urandom of=/dev/nvme0n1 bs=1 count=2068480

Странное решение создания заглавия! Попробуй стандартное, может проблема в этом!

А в /boot/grub/grub.cfg вручную правил строку

Там больше строк лично я правлю…

update-initramfs

У меня другой дистр и с этим помочь не могу.

С консоли initramfs запустить cryptsetup открой и примонтируй корень. С твоего рассказа видна проблема в инитрамфс, толи что не хватает, толи опции ядра плохие переданы с grub.

anonymous
()
Ответ на: комментарий от Neuro75

Ваша схема стандартнее, поэтому не обращайте внимание.

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

anonymous
()

Хорошая свежая инструкция по полнодисковому шифрованию, от А до Я - https://wiki.artixlinux.org/Main/InstallationWithFullDiskEncryption . Правда там Artix Linux (добрый арч без SystemD) - ну и не пердолятся с UEFI, поэтому включи режим UEFI-CSM и радуйся жизни.

SakuraKun ★★★★★
()

Когда система сваливается в initramfs shell, то что показывают cat /proc/partitions и cat /proc/modules? Может банально накого-нибудь драйвера в initramfs не хватает?

kmeaw ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.