Intro
Жил-был я. И как-то я задумался, почему у Windows есть BitLocker с шифрованием раздела, а в Linux эта тема не сильно освещена? Очевидно, что это достаточно нишевая задача. Нишевая - потому что не только лишь каждому нужно шифровать разделы. А те, кому надо тискают LUKS. Монтирование этого самого пресловутого LUKS через crypttab не составляет трудностей. А вот системный раздел обычно не шифруют. Потому что при включении будет требоваться ввод пароля от системного раздела...
Я, конечно, понимаю, что среднестатистический Я мало кому нужен вот в качестве индивидуума. Но потерять свой ноутбук и непроизвольно пошарить кому-либо мои грязные секретики не очень-то хочется. Да, можно окунуться в тот же самый Windows, но былые чувства к нему угасло, а дух авантюризма остался.
Итак. Какого же результата я ожидаю? Я хочу, чтобы мой ноутбук загружался и требовал только аутентификации. И чтобы разделы были зашифрованными. И весить менее 80 кг. Я понимаю, что от чего-то одного придётся отказаться...
Disclaimer
Статься несёт исключительно теоретический характер. Все команды и приложения вымышлены и по глупой случайности совпадают с реальными командами и приложениями! Все линуксовые трюки выполнены профессионалами (я лишь повторил). НЕ ПОВТОРЯЙТЕ ЭТОГО ДОМА! Если кому-либо в голову придёт повторить это, то автор статьи не несёт за это ответственность.
В статье по большей части не будут описаны многие процессы, как то: включение SetupMode UEFI или непосредственно установка ArchLinux. Считается, что читатель вполне умеет делать это самостоятельно. В ином случае ПРЕКРАТИТЕ ЛЮБЫЕ ПОПЫТКИ ЧТО-ЛИБО ПРЕДПРИНЯТЬ! Оставьте это профессионалам красноглазикам!
Что будет использовано
ОС - Arch Linux. В принципе, подойдёт любая ОС, но рассматривать я буду именно арч. Вот просто так я хочу. И я использую ArchLinux;
В качестве системного загрузчика я буду использовать systemd-boot. Не сомневаюсь, что в GRUB2 можно получить тот же эффект, а то и более солидные результаты, но лично мне по душе именно systemd-boot;
Для подписания ядра ОС и прочего полезного я буду использовать sbctl;
Для шифрования буду использовать cryptsetup;
Также я буду использовать механизм работы systemd-homed в качестве пользовательских директорий.
Итоговый принцип работы
Есть два стула варианта запуска.
Штатный режим работы (включенный Secure Boot в режиме User):
Устройство включается;
Запускается загрузчик;
Автоматом расшифровывается и монтируется системный раздел;
Автоматом расшифровываются и монтируются другие разделы, если есть;
Отображение диалога авторизации ОС.
Нештатный режим работы (Secure Boot выключен):
Устройство включается;
Запускается загрузчик;
В консоли выводится диалог ввода пароля от системного раздела;
Попытка загрузчика расшифровать и примонтировать системный раздел;
В консоли может выводиться диалоги ввода паролей от дополнительных разделов;
Попытка загрузчика расшифровать и примонтировать дополнительные разделы;
При успехе отображение диалога авторизации ОС;
При неуспешной расшифровке любого раздела на любом шаге остановка загрузки ОС.
Как добиться таких выдающихся результатов?
Установка
Начнём с самого начала: с BIOS. Для корректной загр��зки установщика Secure Boot придётся выключить.
Далее следует загрузка и начало установки. Какой бы способ установки ни был выбран, я не советую (в рамках этого руководства) создавать пользователя, пока в статье на это явно не укажут.
После успешной загрузки обязательно следует попытаться найти модуль TPM2, выполнив:
systemd-cryptenroll --tpm2-device=list
Если устройства TPM2 не обнаружится, то придётся либо смириться с необходимостью ввода пароля руками, либо отказаться от установки.
При установки с помощью archinstall процесс становится слегка нудным. Напоминаю: пользователя не создавать! Если используется несколько дисков и на каждый из них хочется иметь отдельный пароль, то следует отказаться от скрипта установки в пользу ручной установки.
При ручной установке могу сказать только пару слов:
cryptsetup luksFormat
cryptsetup open
ВНИМАНИЕ! Утрата пароля равносильна потере всей информации! Отнеситесь ответственно к этому шагу!
После успешной установки, можно приступать мастерить криптоподелку.
Сначала следует убедиться, что loader имеет следующий вид:
title... linux ... initrd ... ... options rd.luks.name="UUID_VALUE:rootfs" root=/dev/mapper/rootfs ...
Объяснение чёрной магии
rd.luks.name - грубо говоря, это то же самое, что и cryptsetup open. В качестве аргументов принимается UUID партиции и точка монтирования. Я выбрал в качестве примера rootfs. Далее, имея однозначное понимание нахождения расшифрованной партиции можно грузиться с неё.
ВНИМАНИЕ! В поле luks.name следует указывать UUID, а не PARTUUID! Достать эту информацию можно так:
sudo blkid -o export /dev/MYDEVICE | awk -F '=' '{ if ($1 == "UUID") print $2 }'
ВНИМАНИЕ! Замечено, что если в конфигурации загрузки шифрованная партиция записана как cryptdevice, то systemd не может корректно организовать ввод пароля.
Следует убедиться, что строчка в файле /etc/mkinitcpio.conf заменить:
udev на systemd
keymap consolefont вместе на sd-vconsole
encrypt на sd-encrypt
Объяснение чёрной магии
Если не сменить udev на systemd, то не получится ��спользовать выбранный мной модуль работы с TPM2 силами systemd.
Если не сменить keymap и consolefont то не будет возможности ввести пароль и, соответственно, попытаться расшифровать диски
Что касается encrypt, то он отвечает за работу с шифрованными разделами. Поэтому тоже отдаём его на откуп systemd
После чего обязательно необходимо выполнить
sudo mkinitcpio -P
Чтобы изменения применились.
Настало время для шифрования остальных разделов. Всё по накатанной: cryptsetup, mkfs, mount...
Далее следует убедиться, что пакет tpm2-tss установлен в системе.
Для того, чтобы диски автоматом монтировались после перезагрузки, их следует добавить в файл /etc/crypttab. В качестве пароля указывать none, а в опции обязательно добавить tpm2-device и устройство tpm2 (его обнаружили ранее). Например,
home UUID=ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ none tpm2-device=/dev/tpm2device
А после приписываем и в fstab, указав как устройство расшифрованную партицию. Например,
/dev/mapper/home /home ....
Следует убедиться, что всему написанному верить: выполнить mount -a и посмотреть, что /home смонтирован в нужное место (sudo lsblk).
Так как мы всё ещё в chroot, добавить пользователя пока что не выйдет (если планируете использовать systemd-homed). Значит, заранее подготовимся к следующей загрузке. Самое время выполнить включение нужных сервисов:
sudo systemctl enable systemd-boot-update.service sudo systemctl enable systemd-homed.service
А вот теперь можно перезагрузиться. Сразу в режим настройки биоса. Выходим в окружение установщика и перезагружаемся:
systemctl reboot --firmware-setup
Внимание! Некоторые системы переключают SecureBoot в режим Setup Mode только после удаления всех ключей из хранилища. Такие системы проще всего превратить в кирпич, так что следует быть особо осторожным с такими устройствами. "Откатить" окирпичивание можно сбросом BIOS, но не всегда это спасает: иногда ключи могут завялиться в энергонезависимую память или батарея может надёжно защищать вычислюк от действий пользователя.
Работа с UEFI и ключами
После перезагрузки, вводим пароли от партиций и авторизуемся как root (пароль же был установлен, да?), и, не отходя от кассы, проверяем, что Secure Boot в нужном режиме:
sbctl status
Значение должно быть Enabled.
ВНИМАНИЕ! При успешной установки ключей и перезагрузки UEFI автоматически перейдёт в режим
User Modeи положить дополнительные ключи станет возможно только если снова переключить работу в режимSetup Mode!
Если по каким-то причинам ключ microsoft не попадут во внутреннее хранилище EFI, то могут появиться неприятные последствия: невозможность загрузиться в BIOS, ошибка при попытки загрузки некоторых драйверов, корова перестанет доиться и т.п.
Затем последовательно выпускаем и подписываем всё необходимое:
sbctl create-keys for IMG in $(sbctl verify | awk '{ if (NR > 1) print $2 }'); do sudo sbctl sign -s ${IMG}; done; sbctl enroll-keys
Если на последнем шаге выскочит страшная ошибка, то стоит проверить, имеются ли ключи вендора в хранилище:

В таком случае нужно изменить команду:
sbctl enroll-keys --microsoft
Что за ужас тут творится?
Сначала создаются приватные и публичные ключи, (create-keys).
Затем этими ключами подписываются все образа, с помощью которых система загружается (verify выводит список всех образов, а sign подписывает; ключ -s сохраняет список этих образов)
Последним шагом ключи сохраняются в EFI и выходит, что все ПО, подписанное этими ключами считается доверенным и позволенным к выполнению
Чтобы в будущем не получить веселья при обновлении системы, следует добавить хук. Он отвечает за автоматическое подписание загрузочных образов при их обновлении. Как он узнает какой образ нужно подписать? Ответ: ключ -s, который я использовал при подписании образов. Если ключ не был указан, стоит задуматься о том, чтобы повторно переподписать всё. Ничего страшного произойти не должно.
mkdir -p /etc/pacman.d/hooks/ cp /usr/share/libalpm/hooks/zz-sbctl.hook /etc/pacman.d/hooks/
Теперь, в принципе, можно создать пользователя:
homectl create ${USERNAME}
А это ещё зачем?
Вообще, systemd-homed достаточно сырая идея. Её ещё не до конца полностью освоили и внедрили. Но не смотря на всё это мне импонирует возможность после переустановки ОС получить все те же самые настройки, к которым привык. Более того. У меня был опыт работы в течении 3 месяцев, когда моя рабочая папка находилась на внешнем шифрованном диске и, уходя с работы, мне было достаточно выключить систему и унести диск домой, чтобы продолжить работать. Этот эксперимент был как proof of concept, и причём, успешным.
Также достаточно примечательно, что пользователю можно добавить членство в группах, которых нет в системе. Так же замечательно, что если при создании догадаться добавить себя в группу root,wheel,sudo etc, то можно получить права суперадмина в новой системе. Вот так-то =)
TPM2 и ой-всё-всё
Очередная перезагрузка, ввод паролей шифрования и всё такое... Но теперь уже вход от имени пользователя.
Можно проверить, что Secure Boot в нужном режиме:

Остаётся дело за малым. Отучать электронного болвана клянчить пароли при каждой перезагрузки. Вспоминаем, по какому пути лежит устройство tpm2 (TPMDEVICE) и для каждого диска (CRYPTED_DISK) нужно выполнить следующий каст:
sudo systemd-cryptenroll --tpm2-pcrs=0,7 --tpm2-device=/dev/TPMDEVICE /dev/CRYPTED_DISK
Во избежание ошибок при определении имени и индекса диска, можно использовать данные из каталога /dev/disk/by-partuuid или /dev/disk/by-id.
Ну... Вот и всё...
Теперь можно смело перезагрузиться и зарыдать счастливыми (я надеюсь) слезами, обняться с друзьями-арчеводами и выпить по ритуальной пинте лимонада. Но всё опционально. Linux и свобода жи!
Что в итоге имеем? Пока включен Secure Boot система штатно расшифровывает все нужные разделы. При выключенном - доступна только boot партиция. При повторном включении Secure Boot магия TPM2 снова работает! Очень приятно, например, сдавать рабочее оборудование при его замене. Достаточно ��далить все ключи из хранилища.
Всем рискнувшим желаю успешных опытов, а кто слушал - молодец!
А тем, кто как и я окирпичил любимый ноут я оставлю это тут
А что по Ubuntu?
Что касается Debian дистрибутивов, то, скорее всего, танцы с подписанием образов выполнять не нужно, потому что всё и так уже подписано сертификатом Microsoft. Выходит, что нужно просто добавить пароли от партиций в TPM2. Если кто-то соорудит руководство - буду очень спасибо. А мне самому немного лень проверять.
Пруфы:
Бубен взял тут
