Secure Boot в Arch Linux: включаем для UKI без замены заводских ключей

Arch Linux, в отличие от многих дистрибутивов, не настраивает Secure Boot по умолчанию. Для установки он требует его отключить (хотя можно и подписать образ). Затем, если же мы все же хотим включить у себя эту меру защиты, на вики есть разные способы это сделать. Secure Boot можно настроить:
Используя sbctl, заменив все заводские ключи UEFI на свои
Через shim
Добавив ключ через интерфейс UEFI
На вики много материала по Secure Boot на все случаи жизни, и новичку в нем легко заблудиться. В этой статье я, новичок-арчевод, рассказываю, как настроил у себя Secure Boot через добавление ключа через интерфейс UEFI, в виде пошагового руководства.
Эта статья не ставит целью сделать абсолютно железный непробиваемый Secure Boot, а скорее рассказывает, как простым способом на Arch Linux включить базовую защиту загрузочного образа, соизмеримую с тем, что есть по умолчанию на Windows.
Почему не sbctl enroll-keys и не shim
Я бы сказал, в моем случае причины и там и там идеологические:
shim завязан на сертификаты Microsoft. А мне не хочется привязывать Linux к сертификату Microsoft, если можно этого не делать
sbctl enroll-keys -m, как другая крайность, предлагает поменять всю цепочку ключей PK -> KEK -> DB на свою, заменив заводской ключ и переставив сертификаты microsoft с нуля. С одной стороны, своя цепочка увеличивает безопасность. Но, с другой - это способ более рискованный: на вики статья пестрит предупреждениями в красных рамках о том, что может сломаться. Помимо всего, на мой взгляд, он нарушает принцип разделения ответственности: не должна утилита Linux отвечать за добавление сертификатов винды. Даже флаг-firmware-builtinне говорит "не трогать": он говорит "переписать, включив дефолтные ключи". Я бы предпочел, чтобы каждая система сама отвечала за себя.
Так, я решил полагаться на принцип минимального вмешательства: добавить только то, что нужно, и не трогать то, что уже работает. То есть, просто добавить новый ключ Arch Linux в существующий набор ключей.
Шаги описаны для моей материнской платы ASUS Prime 790-P. Большинство современных материнских плат имеют похожий функционал UEFI и настроек ключей. Если на вашей материнской плате такого функционала нет - увы, этот способ настройки вам не подойдет.
Шаг 0. Делаем бэкап ключей
Перед любым ответственным действием мы делаем бэкап. Для этого нам потребуется флешка с файловой системой FAT. Мы:
Подключаем флешку
Заходим в настройки UEFI BIOS, находим раздел про Secure Boot, и выбираем пункт “Сохранить все ключи”

Из списка дисков выбираем флешку. Выглядит страшно, но это просто список дисков.

Выбор флешки для бэкапа
Ключи сохранены на флешку. Перезагружаемся и записываем ключи с флешки в надежное место. В случае чего, можно загрузить их обратно.
Шаг 1. Генерируем ключ
Сделав бэкап, мы загружаемся в Arch Linux и там генерируем новые ключи для подписи. Для подписи нам потребуется пакет sbsigntools, он же автоматически ставит openssl:
sudo pacman -S sbsigntoolsСоздаем папку и генерируем ключ:
sudo install -d -m 700 /etc/secureboot
sudo openssl req \
-new -x509 \
-newkey rsa:4096 \
-sha256 \
-nodes \
-days 3650 \
-subj "/CN=My Arch Linux Secure Boot/" \
-keyout /etc/secureboot/db.key \
-out /etc/secureboot/db.pem
sudo chmod 600 /etc/secureboot/db.keyДля UEFI мне еще потребовалось создать копию публичного ключа в формате DER:
sudo openssl x509 \
-in /etc/secureboot/db.pem \
-outform DER \
-out /etc/secureboot/db.cerШаг 2. Добавляем ключ в UEFI в раздел DB
Мы записываем новый ключ на флешку и снова загружаемся в UEFI.
Там мы заходим в раздел Secure Boot и добавляем наш ключ в раздел DB

Выбираем флешку и наш файл db.cer

Ясное дело, сохраняем настройки BIOS.
Перезагрузившись в Linux, мы можем убедиться, что ключ успешно добавлен, через ту же утилиту sbctl:
[me@my_computer]$ sbctl list-enrolled-keys
PK:
ASUSTeK MotherBoard PK Certificate
KEK:
ASUSTeK MotherBoard KEK Certificate
Microsoft Corporation Third Party Marketplace Root
Microsoft RSA Devices Root CA 2021
DB:
Microsoft Corporation Third Party Marketplace Root
Microsoft Root Certificate Authority 2010
Microsoft RSA Devices Root CA 2021
Microsoft RSA Devices Root CA 2021
Microsoft Root Certificate Authority 2010
My Arch Linux Secure BootШаг 3. Подписываем ядро
Естественно, подписать ядро один раз - не вариант. Нам нужен автоматический хук, который будет подписывать ядро при каждом обновлении.
Как описано в названии, способ описан для UKI - Unified Kernel Image, который у меня загружается сразу из BIOS-опции, минуя загрузчики. Настройка для GRUB или systemd-boot выходит за рамки этой статьи.
Удобное место в случае UKI - это хук mkinitcpio, который собирает initramfs при каждом обновлении ядра. Для этого мы создаем файл в папке /etc/initcpio/post
Назвать файл можно как угодно. В моем случае он называется uki-sbsign. В $3 ему на вход приходит путь к текущему образу ядра. Его и нужно подписать.
#!/usr/bin/env bash
uki="$3"
[[ -n "$uki" ]] || exit 0
key="/etc/secureboot/db.key"
cert="/etc/secureboot/db.pem"
if ! /usr/bin/sbverify --cert "$cert" "$uki" &>/dev/null; then
echo "UKI to sign: $uki"
/usr/bin/sbsign \
--key "$key" \
--cert "$cert" \
--output "$uki" \
"$uki"
else
echo "UKI already signed, skipping"
fi
Добавляем ему возможность исполняться:
sudo chmod +x /etc/initcpio/post/uki-sbsignВажно, что мы подписываем UKI целиком. Таким образом, мы подписываем сразу и ядро, и initramfs, и другие данные, необходимые для загрузки.
Перед запуском следующей команды, на всякий случай, стоит сделать бэкап образа ядра arch-linux.efi.
Проверяем скрипт командой mkinitcpio -P. Среди вывода мы должны увидеть что-то подобное:
==> Initcpio image generation successful
==> Creating unified kernel image: '/boot/efi/EFI/Linux/arch-linux.efi'
==> Unified kernel image generation successful
==> Running post hooks -> Running post hook: [uki-sbsign]
UKI to sign: /boot/efi/EFI/Linux/arch-linux.efi
Signing Unsigned original imageЯдро успешно подписано! После этого можно включать Secure Boot и проверять.
Тот же самый хук теперь будет срабатывать после каждого pacman -Syu, так что каждое новое ядро будет подписываться автоматически. Дело сделано!

Эта статья - часть моего эксперимента по переезду из экосистемы Apple на селф-хост и Open Source ПО на компьютере, ноутбуке и телефоне. Дневник своего эксперимента я веду в своем телеграм-канале.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.