Как стать автором
Обновить

Опус о могучем UEFI, страшном SecureBoot и загадочном TPM

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров5.4K

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

Пруфы:

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

Теги:
Хабы:
Всего голосов 3: ↑3 и ↓0+3
Комментарии2

Публикации

Истории

Работа

Ближайшие события