Настраиваем поддержку UEFI Secure Boot для драйверов NVIDIA

В комментариях нас часто спрашивали о том, как правильно настроить работу проприетарных драйверов NVIDIA с UEFI Secure Boot. С выходом Fedora 36 это стало возможным.

Введение

Технология UEFI Secure Boot призвана защитить базовую цепь загрузки, а также ядро операционной системы от вредоносного кода, поэтому любые модули ядра, не имеющие квалифицированной цифровой подписи, не могут быть загружены.

До выхода Fedora 36 требовались сложные скрипты, которые бы запускались в виде пост-установочных хуков ядра и автоматизировали бы процесс подписи модулей, однако их работа в большинстве случаев была очень ненадёжной и приводила к различным ошибкам.

Начиная с версии 0.5.7, утилиты из состава akmods получили поддержку автоматической подписи всех собираемых ими пакетов, что значительно упростило процесс внедрения поддержки Secure Boot в актуальных версиях дистрибутива.

Создание CA и ключей

Сначала нам необходимо любым удобным способом создать свой собственный центр сертификации с возможностью подписи кода.

Воспользуемся утилитой kmodgenca для генерирования простого одноуровневого CA:

sudo kmodgenca

Ответим на стандартные вопросы о создаваемом удостоверяющем центре и сертификате, либо добавим параметр -a, чтобы пропустить этот шаг и использовать настройки по умолчанию.

В результате будет создана новая ключевая пара. Открытый ключ будет сохранён в каталоге /etc/pki/akmods/certs, а закрытый — в /etc/pki/akmods/private соответственно.

Развёртывание CA

Добавим публичный ключ созданного удостоверяющего центра в список разрешённых для использования в UEFI Secure Boot материнской платы устройства.

Это один из самых сложных шагов, т.к. далеко не все производители позволяют загружать новые сертификаты из работающей операционной системы.

Автоматический способ

Произведём автоматическое развёртывание при помощи mokutil:

sudo mokutil --import /etc/pki/akmods/certs/public_key.der

Утилита предложит ввести пароль, которым будет защищён контейнер с ключом перед его загрузкой в MOK. Внимание! Допускается ввод только латинских букв и цифр.

Перезагрузим устройство:

systemctl reboot

Сразу после перезапуска увидим диалог менеджера MOK, который сообщит об обнаружении нового сертификата и предложит произвести настройку.

Выполним следующие действия:

  1. выберем пункт Enroll MOK;
  2. нажмём Continue для продолжения;
  3. подтвердим импорт при помощи Yes;
  4. введём пароль, заданный ранее;
  5. перезагрузим устройство для вступления изменений в силу.

Внимание! Ряд производителей допускают программную загрузку сертификатов лишь после активации соответствующей опции в настройках UEFI Secure Boot, поэтому выберем её, произведём указанные выше действия, а затем снова отключим для максимальной безопасности.

Ручной способ

Если добиться успеха при помощи mokutil не получилось, применим альтернативный способ:

  1. подключим внешний USB-накопитель с файловой системой FAT32 (это важно, т.к. прошивка UEFI без особых драйверов не поддерживает иные ФС);
  2. скопируем файл открытого ключа /etc/pki/akmods/certs/public_key.der в корневой каталог флешки;
  3. войдём в настройки UEFI Secure Boot;
  4. найдём пункт импорта сертификатов;
  5. выберем файл public_key.der на внешнем устройстве;
  6. подтвердим действие при помощи Continue и Yes;
  7. перезагрузим устройство для вступления изменений в силу.

Завершение

Убедимся, что наш CA был успешно импортирован и авторизован:

sudo mokutil --list-enrolled

С этого момента все собираемые kmod-пакеты будут автоматически подписаны.

Литература

При написании данной статьи использовалась литература из следующих источников:

2 commentary to post

    1. Да, если он был установлен из репозитория RPM Fusion. Официальный пакет от Oracle применяет dkms вместо akmods и поэтому работать с UEFI Secure Boot не будет.

Обсуждение закрыто.