Блог "Дети ОИТа"
/поиск

Secure Boot

Secure Boot (безопасная загрузка) – это механизм, встроенный в прошивку UEFI, который проверяет цифровые подписи всех компонентов, участвующих в процессе загрузки операционной системы. Если включён, U

Secure Boot (безопасная загрузка) – это механизм, встроенный в прошивку UEFI, который проверяет цифровые подписи всех компонентов, участвующих в процессе загрузки операционной системы. Если включён, UEFI загружает только те программы, которые подписаны доверенными ключами (хранятся в базе данных DB). Это предотвращает запуск вредоносных загрузчиков и руткитов. По умолчанию в прошивке большинства компьютеров установлены ключи Microsoft, что позволяет загружать Windows и многие дистрибутивы Linux (использующие shim). В этой статье рассматриваются способы управления ключами Secure Boot в Linux, инструменты sbctl, ручная генерация ключей, подписание загрузчиков (rEFInd, GRUB, systemd‑boot) и импорт ключей в UEFI.

1.1. Английские сокращения

Сокращение Английское обозначение Русское обозначение
UEFI Unified Extensible Firmware Interface Унифицированный расширяемый интерфейс прошивки
BIOS Basic Input/Output System Базовая система ввода-вывода
EFI Extensible Firmware Interface Расширяемый интерфейс прошивки
PK Platform Key Платформенный ключ
KEK Key Exchange Key Ключ обмена ключами
DB Signature Database База данных подписей
ESP EFI System Partition Системный раздел EFI
SB Secure Boot Безопасная загрузка
shim bootloader shim Прослойка для загрузки Linux с подписью Microsoft
SBAT Secure Boot Advanced Targeting Дополнительная метаинформация для отзыва

1.2. Русские сокращения

Сокращение Обозначение
БЗ Безопасная загрузка
УП Унифицированный интерфейс прошивки
КП Ключ платформы
КО Ключ обмена
БП База подписей
СР Системный раздел EFI

2.1. Цепочка доверия

  1. UEFI содержит встроенные базы данных: PK (Platform Key), KEK (Key Exchange Key), DB (Signature Database), DBX (Revocation List).
  2. При загрузке UEFI проверяет подпись загрузчика (например, bootx64.efi) с помощью ключей из DB.
  3. Если подпись действительна, управление передаётся загрузчику.
  4. Загрузчик, в свою очередь, может проверять подписи ядра и модулей (например, через shim или подписанные версии).

2.2. Ключи Microsoft

По умолчанию в DB любого сертифицированного компьютера с Windows установлен сертификат Microsoft Corporation UEFI CA 2011. Это позволяет загружать операционные системы, подписанные Microsoft (Windows, а также дистрибутивы Linux, использующие shim). Для двойной загрузки (Windows + Linux) эти ключи желательно сохранить.

2.3. Режимы работы

  • Setup Mode: система UEFI не имеет платформенного ключа (PK). В этом режиме можно загружать неподписанные компоненты и устанавливать собственные ключи.
  • User Mode: после установки PK UEFI переходит в режим проверки подписей.

Если на компьютере используется только Linux и нет потребности в двойной загрузке, можно удалить ключи Microsoft и установить собственные. Это повышает безопасность (отсутствие доверия к третьим сторонам) и позволяет полностью контролировать цепочку загрузки. Однако при удалении ключей Microsoft загрузка Windows станет невозможной. Перед удалением рекомендуется сохранить резервную копию оригинальных ключей (например, с помощью утилиты `efi‑update`.

4.1. Что такое sbctl

sbctl – утилита для управления ключами Secure Boot в Linux, написанная на Go. Она автоматизирует создание ключей (PK, KEK, DB), их регистрацию в UEFI, подписание файлов (ядер, загрузчиков) и установку хуков для автоматического подписания при обновлении (например, для Arch Linux с pacman). Лицензия MIT.

4.2. Установка sbctl

  • Arch Linux: `sudo pacman -S sbctl`
  • Gentoo: `emerge app-crypt/sbctl` (доступен в портежах)
  • ALT Linux: `apt-get install sbctl` (если в репозитории, иначе сборка из исходников)

4.3. Создание и регистрация собственных ключей

sudo sbctl create-keys
sudo sbctl enroll-keys --microsoft   # оставить ключи Microsoft для двойной загрузки

4.4. Подписание файлов

sudo sbctl sign -s /boot/efi/EFI/refind/refind_x64.efi
sudo sbctl sign -s /boot/vmlinuz-linux

4.5. Автоматическое подписание (Arch Linux)

Хуки sbctl подписывают новое ядро и загрузчик при каждом обновлении через pacman.

5.1. Создание собственных ключей с помощью openssl

sudo mkdir -p /etc/secureboot/keys
cd /etc/secureboot/keys

openssl req -new -x509 -newkey rsa:2048 -keyout PK.key -out PK.crt -days 3650 -subj "/CN=Platform Key/" -nodes
openssl req -new -x509 -newkey rsa:2048 -keyout KEK.key -out KEK.crt -days 3650 -subj "/CN=Key Exchange Key/" -nodes
openssl req -new -x509 -newkey rsa:2048 -keyout db.key -out db.crt -days 3650 -subj "/CN=Signature Database/" -nodes

5.2. Подписание загрузчика (например, rEFInd)

Установите `sbsigntool` (в Gentoo: `emerge app-crypt/sbsigntool`).

sudo sbsign --key /etc/secureboot/keys/db.key \
            --cert /etc/secureboot/keys/db.crt \
            --output /boot/efi/EFI/refind/refind_x64.efi.signed \
            /boot/efi/EFI/refind/refind_x64.efi
sudo mv /boot/efi/EFI/refind/refind_x64.efi.signed /boot/efi/EFI/refind/refind_x64.efi

5.3. Подписание ядра (если требуется)

Некоторые загрузчики (например, GRUB с модулем lockdown) не проверяют подпись ядра – достаточно подписать загрузчик. Для подписания ядра:

sudo sbsign --key /etc/secureboot/keys/db.key \
            --cert /etc/secureboot/keys/db.crt \
            --output /boot/vmlinuz-linux.signed /boot/vmlinuz-linux

Затем настроить загрузчик на использование подписанного ядра.

5.4. Импорт ключей в прошивку UEFI

Перезагрузитесь и войдите в настройки UEFI. Найдите раздел Security → Secure Boot. Если прошивка находится в режиме Setup Mode, выберите опцию «Enroll Keys» и укажите файлы PK, KEK, DB (обычно в формате .auth или .der). Вместо этого можно использовать утилиту `sbctl enroll-keys` (если прошивка поддерживает переменные EFI).

5.5. Проверка статуса

bootctl status        # для systemd-boot
sbctl status

6.1. GRUB

GRUB может быть подписан напрямую. В дистрибутивах (Ubuntu, Fedora) используется `shim` – небольшой загрузчик, подписанный Microsoft, который затем загружает GRUB, подписанный ключом дистрибутива. Для ручной настройки можно подписать `grubx64.efi`.

6.2. systemd‑boot

systemd‑boot (ранее gummiboot) обычно подписывается как `systemd-bootx64.efi`. Его можно подписать так же, как rEFInd.

6.3. rEFInd

См. раздел 5.2.

Если на компьютере также установлена Windows, не удаляйте ключи Microsoft. При генерации собственных ключей добавьте ключи Microsoft в базу DB:

sbctl enroll-keys --microsoft

Также убедитесь, что Windows не будет перезаписывать загрузчик (например, не используйте общий ESP с конфликтующими именами). Лучше иметь отдельные каталоги `Microsoft` и `refind` на ESP.

Проблема Решение
«No EFI variables» Проверьте, загружена ли система в UEFI mode (не CSM/BIOS). Используйте `ls /sys/firmware/efi`.
«sbctl: keys not enrolled» Выполните `sudo sbctl enroll-keys` после создания ключей.
Подписанный загрузчик не запускается Убедитесь, что база данных DB содержит сертификат, которым подписан файл. Проверьте через `sbctl verify`.
Windows не загружается после удаления ключей Microsoft Восстановите оригинальные ключи (если есть резервная копия) или переустановите Windows.

9.1. Проверка состояния Secure Boot

mokutil --sb-state

9.2. Создание резервной копии текущих ключей (используя efi-readvar)

sudo apt install efitools
sudo efi-readvar -v PK -o old_PK.esl
sudo efi-readvar -v KEK -o old_KEK.esl
sudo efi-readvar -v db -o old_db.esl

9.3. Установка sbctl на Gentoo (дополнительно)

sudo emerge app-crypt/sbctl

Secure Boot – мощное средство защиты от атак на процесс загрузки. Linux-пользователи могут гибко настраивать его: использовать ключи Microsoft (для совместимости) или создавать собственные. Утилита `sbctl` значительно упрощает генерацию, подписание и регистрацию ключей. Ручной метод с `openssl` и `sbsigntool` даёт полный контроль, но требует больше усилий. Правильная настройка Secure Boot повышает безопасность системы и не мешает работе, если следовать рекомендациям.

Для работы с переменными EFI необходима загрузка в режиме UEFI.