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, и выбираем пункт “Сохранить все ключи”

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

    Выбор флешки для бэкапа
    Выбор флешки для бэкапа

Ключи сохранены на флешку. Перезагружаемся и записываем ключи с флешки в надежное место. В случае чего, можно загрузить их обратно.

Шаг 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

Добавление ключа в Secure Boot
Добавление ключа в Secure Boot

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

Выбор ключа для добавления в DB
Выбор ключа для добавления в DB

Ясное дело, сохраняем настройки 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, так что каждое новое ядро будет подписываться автоматически. Дело сделано!

Arch Linux загружается из подписанного UKI-файла
Arch Linux загружается из подписанного UKI-файла

Эта статья - часть моего эксперимента по переезду из экосистемы Apple на селф-хост и Open Source ПО на компьютере, ноутбуке и телефоне. Дневник своего эксперимента я веду в своем телеграм-канале.

Источник: https://habr.com/ru/articles/1093566/


Интересные статьи

Интересные статьи

Минцифры установила новые требования к сайтам аккредитованных IT-компаний, которые вступают в силу 21 ноября. Если вы руководите IT-компанией, это касается вас напрямую — рассказываем, что изменилось ...
Привет, хабровчане! На связи Алиса — тимлид в e-commerce агентстве KISLOROD.Кто о чем, а я продолжаю рассказывать, как сшипперить Bitrix и Laravel. В первой части я рассказывала, как по...
Управление большим числом изменяемых шаблонов бизнес-процессов — непростая задача. А необходимость поддержки актуальных версий шаблонов на нескольких копиях проекта добавляет еще больше сложностей. Де...
В новом выпуске systemd v221 мы представляем API sd-bus, поставляемый со стабильной версией systemd. sd-bus - это наша минимальная библиотека D-Bus IPC на языке программирования Си, подде...
Эта статья посвящена одному из способов сделать в 1с-Битрикс форму в всплывающем окне. Достоинства метода: - можно использовать любые формы 1с-Битрикс, которые выводятся компонентом. Например, добавле...