Intro

Жил-был я. И как-то я задумался, почему у Windows есть BitLocker с шифрованием раздела, а в Linux эта тема не сильно освещена? Очевидно, что это достаточно нишевая задача. Нишевая - потому что не только лишь каждому нужно шифровать разделы. А те, кому надо тискают LUKS. Монтирование этого самого пресловутого LUKS через crypttab не составляет трудностей. А вот системный раздел обычно не шифруют. Потому что при включении будет требоваться ввод пароля от системного раздела...

Я, конечно, понимаю, что среднестатистический Я мало кому нужен вот в качестве индивидуума. Но потерять свой ноутбук и непроизвольно пошарить кому-либо мои грязные секретики не очень-то хочется. Да, можно окунуться в тот же самый Windows, но былые чувства к нему угасло, а дух авантюризма остался.

Итак. Какого же результата я ожидаю? Я хочу, чтобы мой ноутбук загружался и требовал только аутентификации. И чтобы разделы были зашифрованными. И весить менее 80 кг. Я понимаю, что от чего-то одного придётся отказаться...

Disclaimer

Статься несёт исключительно теоретический характер. Все команды и приложения вымышлены и по глупой случайности совпадают с реальными командами и приложениями! Все линуксовые трюки выполнены профессионалами (я лишь повторил). НЕ ПОВТОРЯЙТЕ ЭТОГО ДОМА! Если кому-либо в голову придёт повторить это, то автор статьи не несёт за это ответственность.

В статье по большей части не будут описаны многие процессы, как то: включение SetupMode UEFI или непосредственно установка ArchLinux. Считается, что читатель вполне умеет делать это самостоятельно. В ином случае ПРЕКРАТИТЕ ЛЮБЫЕ ПОПЫТКИ ЧТО-ЛИБО ПРЕДПРИНЯТЬ! Оставьте это профессионалам красноглазикам!

Что будет использовано

  • Устройство с поддержкой UEFI и TPM2;

  • ОС - Arch Linux. В принципе, подойдёт любая ОС, но рассматривать я буду именно арч. Вот просто так я хочу. И я использую ArchLinux;

  • В качестве системного загрузчика я буду использовать systemd-boot. Не сомневаюсь, что в GRUB2 можно получить тот же эффект, а то и более солидные результаты, но лично мне по душе именно systemd-boot;

  • Для подписания ядра ОС и прочего полезного я буду использовать sbctl;

  • Для шифрования буду использовать cryptsetup;

  • Также я буду использовать механизм работы systemd-homed в качестве пользовательских директорий.

Итоговый принцип работы

Есть два стула варианта запуска.

Штатный режим работы (включенный Secure Boot в режиме User):

  1. Устройство включается;

  2. Запускается загрузчик;

  3. Автоматом расшифровывается и монтируется системный раздел;

  4. Автоматом расшифровываются и монтируются другие разделы, если есть;

  5. Отображение диалога авторизации ОС.

Нештатный режим работы (Secure Boot выключен):

  1. Устройство включается;

  2. Запускается загрузчик;

  3. В консоли выводится диалог ввода пароля от системного раздела;

  4. Попытка загрузчика расшифровать и примонтировать системный раздел;

  5. В консоли может выводиться диалоги ввода паролей от дополнительных разделов;

  6. Попытка загрузчика расшифровать и примонтировать дополнительные разделы;

  7. При успехе отображение диалога авторизации ОС;

  8. При неуспешной расшифровке любого раздела на любом шаге остановка загрузки ОС.

Как добиться таких выдающихся результатов?

Установка

Начнём с самого начала: с 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. Если кто-то соорудит руководство - буду очень спасибо. А мне самому немного лень проверять.

Пруфы:

Бубен взял тут