Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Secure Boot + GRUB: подпись загрузчика

Сразу к делу: Secure Boot блокирует GRUB, потому что загрузчик не подписан ключами, которым доверяет прошивка. Решение — цепочка shim → GRUB: shim подписан Microsoft, а GRUB проверяется через MOK (Machine Owner Key). На Arch самый простой путь — sbctl: создаёшь свои ключи, вносишь их в прошивку и подписываешь GRUB и ядро. Ниже оба способа, с командами и разбором подводных камней.

Почему Secure Boot блокирует GRUB?

Secure Boot — механизм защиты UEFI. При каждой загрузке прошивка проверяет цифровую подпись загружаемого файла и запускает его, только если подпись совпадает с доверенными ключами. Эти ключи лежат в переменных прошивки: db (подписанные файлы), KEK (ключи, обновляющие db) и PK (главный ключ платформы). Если подпись не совпадает — загрузка останавливается с ошибкой «Security Violation» или «Verification failed: 0x1A Security Violation».

GRUB из репозиториев Arch не подписан ключами Microsoft, поэтому при включённом Secure Boot прошивка отказывается его запускать. Это не баг, а защита: без проверки подписи любой файл на ESP можно подменить и получить контроль над загрузкой системы.

Обойти проверку можно двумя путями. Первый — подписать GRUB своими ключами через sbctl. Второй — использовать shim: маленький загрузчик, подписанный Microsoft, который сам проверяет GRUB по твоим ключам MOK. Оба пути рабочие, разница в удобстве.

Secure Boot защищает от bootkit’ов — вредоносных программ, которые прописываются в загрузчик и перехватывают управление раньше антивируса. Подпись гарантирует, что загружается именно тот код, который ты установил.

Проверить, включён ли Secure Boot, можно прямо из Arch: mokutil --sb-state покажет SecureBoot enabled или disabled. Утилита входит в пакет mokutil, при необходимости ставь её: sudo pacman -S mokutil.

Как устроена цепочка shim → GRUB?

shim — первый этап загрузки. Прошивка проверяет подпись shim (она от Microsoft) и запускает его. Дальше shim проверяет подпись GRUB, но уже не по ключам прошивки, а по MokList — собственному хранилищу ключей в NVRAM. Ключи туда добавляешь ты сам, и Microsoft на них не влияет.

MOK расшифровывается как Machine Owner Key — «ключ владельца машины». Это твои личные ключи. Управлять MokList можно двумя инструментами: mokutil (команда из Linux) и MokManager (графическая утилита, которая запускается при загрузке, когда shim находит неподписанный файл).

Как выглядит включение: shim видит, что GRUB не подписан ключами из MokList, и запускает MokManager. На экране появляется меню с пунктом «Enroll key from disk» — добавить ключ с диска. Ты указываешь файл ключа, подтверждаешь, и после перезагрузки GRUB загружается. Один раз, дальше ключ уже в MokList.

Технически MokList делится на две части: MokList (ключи, ожидающие подтверждения) и MokListRT (активные ключи). Пока ключ не подтверждён в MokManager, он лежит в MokList и не работает. После подтверждения он переезжает в MokListRT и начинает действовать.

Почему вообще нужен shim, а не подпись GRUB напрямую? Потому что ключей Microsoft в прошивке нет ни у кого, кроме самой Microsoft. Подписать GRUB ключом Microsoft невозможно — их не выдают. Поэтому Microsoft подписывает shim, а shim уже доверяет твоим ключам. Получается мост между прошивкой и твоей системой.

При первом включении shim может показать синий экран с надписью «Verification failed: (0x1A) Security Violation» — это нормально, так shim сообщает, что GRUB не подписан. Дальше MokManager предложит варианты: Continue boot, Enroll key from disk, Enroll hash from disk. Выбирай Enroll key from disk.

Как включить Secure Boot с GRUB через sbctl?

sbctl — самый простой способ на Arch. Он сам создаёт ключи, вносит их в прошивку и подписывает файлы. Ставим:

sudo pacman -S sbctl

Проверяем состояние:

sbctl status

Утилита покажет, включён ли Secure Boot и есть ли ключи. В выводе три строки: State (включён ли Secure Boot), Setup Mode (режим настройки) и список ключей. Различай два режима прошивки: Setup Mode и User Mode. В Setup Mode ключи можно менять свободно — именно в этом режиме работает enroll-keys. После внесения ключей прошивка переходит в User Mode, и менять ключи без подтверждения уже нельзя. Если Setup Mode — On, ключи ещё не внесены. Если ключей нет — создаём свои:

sbctl create-keys

Вносим ключи в прошивку. Флаг -m добавляет ключи Microsoft, чтобы продолжали работать Windows и другие подписанные загрузчики:

sbctl enroll-keys -m

Если внести только свои ключи без флага -m, прошивка перестанет доверять ключам Microsoft. Windows и другие загрузчики, подписанные Microsoft, загружаться не будут. Флаг -m оставляет их в силе — используй его, если на машине есть Windows или ты планируешь dualboot.

Теперь подписываем GRUB и ядро. Флаг –save запоминает файлы: при обновлении пакетов sbctl переподписывает их автоматически через свой pacman-хук:

sbctl sign --save /boot/EFI/GRUB/grubx64.efi
sbctl sign --save /boot/vmlinuz-linux

Проверяем результат:

sbctl verify

Команда покажет список подписанных файлов и пометит неподписанные. Если увидишь unsigned — подпиши файл и прогони verify снова. Перезагружайся, включи Secure Boot в настройках прошивки (обычно раздел Boot или Security) и загружайся. После перезагрузки проверь sbctl status — строка Secure Boot должна показывать Enabled. Если всё сделано верно — система стартует без ошибок.

Пути в командах подразумевают, что ESP смонтирована в /boot. Если у тебя ESP в /efi или /boot/efi — подставляй свои пути. Точку монтирования ESP покажет findmnt /boot или lsblk -o NAME,MOUNTPOINTS.

Если подписать только GRUB, а ядро нет — система всё равно загрузится, потому что ядро запускает GRUB, а не прошивка. Но подпись ядра нужна для прямой загрузки (EFISTUB, UKI) и для systemd-boot. Подписывай ядро сразу, чтобы потом не переделывать.

Подробный разбор sbctl с примерами — в статье «Secure Boot в Arch Linux через sbctl».

Как подписать GRUB через shim-signed и MokManager?

Второй путь — пакет shim-signed. Он ставит shim, подписанный Microsoft, и MokManager. GRUB подписывается твоим ключом, а ключ добавляется в MokList.

Когда выбирать shim вместо sbctl? Если нужен ручной контроль над ключами и ты готов разбираться с MokManager. sbctl прячет все детали, shim оставляет их на виду. Для большинства систем хватает sbctl.

Ставим shim и инструменты подписи:

sudo pacman -S shim-signed sbsigntools mokutil

Пакет кладёт файлы shimx64.efi и mmx64.efi (MokManager) в /usr/share/shim-signed. Скопируй их на ESP:

sudo cp /usr/share/shim-signed/shimx64.efi /usr/share/shim-signed/mmx64.efi /boot/EFI/

Если GRUB ещё не установлен — поставь его и установи на ESP:

sudo pacman -S grub
sudo grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
sudo grub-mkconfig -o /boot/grub/grub.cfg

Загрузочная запись должна указывать на shimx64.efi, а не на grubx64.efi. Создать запись и проверить порядок загрузки можно через efibootmgr — разбор в статье «Порядок загрузки в NVRAM через efibootmgr».

Пример создания записи: sudo efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Arch Linux (shim)" --loader '\EFI\shimx64.efi'. Номер диска и раздела подставляй свои.

Теперь ключ для подписи GRUB. Создаём его через openssl:

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=My MOK"

Подписываем GRUB:

sudo sbsign --key MOK.key --cert MOK.crt --output /boot/EFI/GRUB/grubx64.efi /boot/EFI/GRUB/grubx64.efi

Если переустанавливаешь GRUB — сначала выполни grub-install как обычно, а потом заново подпиши grubx64.efi, иначе shim снова не пропустит загрузчик.

Импортируем ключ в MokList:

sudo mokutil --import MOK.crt

mokutil попросит задать пароль — он понадобится один раз при загрузке. Перезагружайся: shim запустит MokManager, выбери «Enroll key from disk», укажи файл MOK.crt и введи пароль. Управление в MokManager простое: стрелки и Enter. После выбора ключа MokManager спросит подтверждение и перезагрузит систему.

Проверить список внесённых ключей:

mokutil --list-enrolled

Что делать, если прошивка сбросила ключи?

Сброс настроек UEFI (Reset to defaults, обновление прошивки, замена батарейки CMOS) стирает и ключи Secure Boot. Система перестаёт загружаться с ошибкой проверки подписи.

Лечится повторным внесением ключей. Для sbctl:

sbctl enroll-keys -m

Для shim — повторно импортировать ключ:

sudo mokutil --import MOK.crt

И перезагрузиться, подтвердив добавление в MokManager. Сами ключи при сбросе не теряются — они лежат на диске, теряется только доверие прошивки к ним.

Важно: MokList тоже хранится в NVRAM, поэтому сброс прошивки стирает и его. После сброса mokutil --list-enrolled покажет пустой список — первый признак, что ключи пропали.

Если система не загружается вовсе — загрузись с live-USB, сделай arch-chroot и выполни те же команды оттуда.

Чтобы не попадать в такую ситуацию, держи копию ключей в надёжном месте: MOK.key и MOK.crt (или ключи sbctl из /var/lib/sbctl) можно скопировать на флешку. Тогда восстановление займёт пару минут.

Какие подводные камни есть у Secure Boot с GRUB?

Обновление ядра

После pacman -Syu новый vmlinuz-linux приходит без подписи. Если не переподписать — загрузка упадёт с «Security Violation». sbctl решает это сам: файлы, подписанные с –save, переподписываются автоматически. Для shim-пути добавь pacman-хук, который после обновления ядра запускает sbsign заново. Ключи положи в /etc/efi-keys (MOK.key и MOK.crt), чтобы хук их находил. Пример хука в /etc/pacman.d/hooks/sign-kernel.hook:

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux
Target = linux-lts

[Action]
Description = Signing kernel with MOK key
When = PostTransaction
Exec = /usr/bin/sbsign --key /etc/efi-keys/MOK.key --cert /etc/efi-keys/MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux

Если у тебя несколько ядер (linux и linux-lts) — подписывай каждое. Для sbctl: sbctl sign --save /boot/vmlinuz-linux-lts.

Если после обновления GRUB не видит новое ядро — смотри «GRUB не видит ядра после обновления».

Модули Nvidia

Модули ядра Nvidia подписаны ключом из пакета nvidia. При включённом Secure Boot ядро откажется их загружать, пока ключ не попадёт в MokList:

sudo mokutil --import /usr/share/nvidia/nvidia-modsign-crt.der

Дальше — стандартная процедура с MokManager при перезагрузке. Ключ Nvidia вносится один раз — при обновлениях драйвера он не меняется, так что повторный импорт не нужен.

Initramfs

С GRUB initramfs загружает сам GRUB, и прошивка её не проверяет. initramfs-linux.img — обычный файл, который GRUB читает с диска. Но если перейдёшь на прямую загрузку ядра (EFISTUB или UKI) — подписывать придётся весь образ целиком. Про разницу способов загрузки — в статье «Смена загрузчика с GRUB на systemd-boot».

Частые вопросы

Нужно ли подписывать initramfs при загрузке через GRUB?

Нет. GRUB загружает initramfs сам, Secure Boot её не проверяет. Подпись нужна только для файлов, которые запускает прошивка: shim, GRUB и ядро при прямой загрузке. Если перейдёшь на UKI — initramfs вшивается в образ, и подписывается весь образ целиком.

Что делать, если после обновления ядра появилась ошибка подписи?

Переподписать ядро. Для sbctl — sbctl sign --save /boot/vmlinuz-linux, для shim — sbsign с твоим ключом. Чтобы не повторять вручную, настрой pacman-хук. После этого перезагрузись — ошибка уйдёт.

Чем MOK отличается от ключей Secure Boot?

Ключи Secure Boot (db, KEK, PK) хранятся в прошивке и управляются ею. MOK — твои ключи в NVRAM, которые проверяет shim. Прошивка их не знает, зато их можно добавлять и удалять без перепрошивки. Для sbctl MOK не нужен — sbctl работает напрямую с ключами прошивки.

Можно ли просто отключить Secure Boot?

Можно, и многие так делают. Но тогда теряется защита от подмены загрузчика, ради которой Secure Boot и включают. Подпись через sbctl занимает десять минут — проще один раз настроить, чем потом ловить ошибки при загрузке с чужих носителей.

Работает ли Secure Boot с видеодрайвером Nvidia?

Да, если внести ключ подписи модулей Nvidia в MokList. Без этого ядро не загрузит модули nvidia при включённом Secure Boot. Процедура та же: mokutil –import и подтверждение в MokManager при перезагрузке.

Полезные ресурсы

  • Secure Boot — ArchWiki — полная документация по Secure Boot, shim и MOK.
  • GRUB — ArchWiki — установка и настройка GRUB, включая раздел про Secure Boot.

Заключение

Secure Boot с GRUB настраивается за один вечер. Самый надёжный путь — sbctl: создал ключи, внёс в прошивку, подписал GRUB и ядро. Альтернатива — shim-signed с MokManager, если нужен ручной контроль над ключами. Главное после настройки — не забывать про переподпись после обновлений и про ключ Nvidia. Тогда Secure Boot работает тихо и не мешает.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max