В этом руководстве описывается процесс настройки FreeBSD 15 для работы в режиме Secure Boot. Интернет полон разных руководств типа такого, но их качество меня не устраивает: слишком сложно, слишком длинно, слишком оторвано от реальности.

Пара слов о Secure Boot

В BIOS существовала проблема буткитов — особого рода вирусов, которые записывали свой код в главную загрузочную запись диска, Master Boot Record, MBR. Такого рода вирусы работают на уровне, близком к железу, а что хуже всего, они запускаются ещё до запуска ОС. Обнаружение и лечение таких вирусов стало целой проблемой.

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

Многие ругают корпорацию Microsoft за то, что она, якобы, сделала дизайн Secure Boot таким, чтобы на компьютерах, где он включен, нельзя было запускать ОС, отличные от Windows. Это не так, поскольку корпорация настояла на том, что для получения сертификата Windows Compatible оборудование должно позволять отключить Secure Boot.

Работает Secure Boot следующим образом (сильно упрощённо, главное — уловить суть):

  1. На этапе начальной загрузки UEFI ищет на накопителях раздел с меткой ESP.

  2. Если такой раздел найден, UEFI проверяет его содержимое на наличие каталогов /efi и кое-каких других, а в них — наличие файлов boot64.efi, loader.efi и аналогичных. Перечисление полного списка не цель этой статьи, обращайтесь к стандарту.

  3. Когда наступает время выполнить код загрузчика, Secure Boot загружает из NVRAM (энергонезависимая память) список открытых ключей для проверки цифровой подписи.

  4. С помощью найденных ключей Secure Boot проверяет цифровую подпись найденных загрузчиков.

    1. Проверка успешна? Выполняем загрузчик. Дальше он сам. Но на всякий случай Secure Boot будет дополнительно проверять цифровую подпись некоторых драйверов, например, VirtualBox и NVIDIA.

    2. Ключ не найден, подпись не совпадает или её вовсе нет? Это проблема. Нарисуем пугающе-красное окно Secure Boot Violation, а при нажатии кнопки OK попробуем загрузить следующий загрузчик.

Ключи

Усилиями Microsoft открытый ключ для проверки цифровой подписи загрузчика Windows сейчас хранится в NVRAM практически всех материнских плат. А что насчёт всех остальных ОС?

Ключом Microsoft подписан загрузчик shim-loader, который используют популярные дистрибутивы Linux, например, Debian и Ubuntu. Это позволяет им загружаться на системах с включенным Secure Boot без лишних действий со стороны пользователя.

Разработчики FreeBSD не используют shim-loader, у них собственный загрузчик, поэтому нужны дополнительные действия.

Первое, что вам нужно сделать — создать и записать в NVRAM свой собственный ключ, Machine Owner Key, сокращённо MOK.

Проблема в том, что во FreeBSD нет утилит для работы с MOK-ключами. А в Linux — есть, и называется она mokutil. Поскольку вам в любом случае понадобится Linux, этап подготовки я опишу для Debian Linux, но должно работать во всех DEB-дистрибутивах.

  1. Установите утилиту mokutil:

    apt-get update && apt-get install mokutil --yes
  2. Для генерации MOK выполните команду:

    openssl req \
             -new \
             -x509 \
             -newkey rsa:2048 \
             -keyout MOK.key \
             -outform DER \
             -out MOK.der \
             -days 36500 \
             -subj "/CN=My Machine Owner Key/"

    Почему 2048 бит? На моём не очень свежем железе с такими ключами не возникает проблем. 4096, безусловно, было бы получше, но могут быть проблемы.

    Всего 36500 дней? 10 лет хватит всем! Если переживаете, делайте как установщик драйверов NVIDIA, генерируйте ключ со сроком действия 73000 дней.

    В значении параметра -subj вместо My Machine Owner Key вы можете написать что хотите, главное сделать ваш MOK хорошо узнаваемым. Придумайте хорошее название, потому что в будущем оно поможет вам вспомнить что это за ключ, откуда он взялся и всё такое.

  3. Введите пароль приватного ключа. На всякий случай запишите его на бумажку. Если забудете пароль, воспользоваться приватным ключом уже не сможете. Генерировать MOK каждый раз заново плохая идея: известны случаи, когда переполнение хранилища приводило к непонятным ошибкам. По-хорошему, в вашей системе должен быть установлен всего один MOK. Ну, ок, максимум два, ваш собственный и для драйвера видеокарты.

  4. Создайте сертификат:

     openssl x509 -inform der -in MOK.der -out MOK.pem

    Теперь у вас в каталоге размещаются 3 файла:

    1. MOK.key — приватный ключ.

    2. MOK.der — публичный ключ, его мы будем импортировать в NVRAM.

    3. MOK.pem — сертификат, которым мы будем подписывать загрузчик.

  5. Скопируйте эти файлы, например, на флешку. Чуть позже мы используем их во FreeBSD. Можно и не на флешку. Короче, вам нужно каким-то образом сделать так, чтобы файлы ключей стали доступны во FreeBSD.

  6. Для импорта MOK в UEFI выполните команду:

    mokutil --import MOK.der

    Вас попросят дважды ввести пароль. Не усложняйте, используйте что-нибудь незатейливое, ведь он понадобится всего один раз.

  7. Перезагрузите компьютер. Вместо Linux будет запущена оболочка для работы с MOK. Всё, что вам нужно сделать — выбирать варианты, которые позволят вам раскатить (Enroll) ваш MOK в UEFI. Один раз придётся ввести пароль (тот самый, с которым я просил не усложнять). В конце напишут, что ключ успешно установлен и предложат перезагрузить компьютер.

  8. Загрузите Linux и убедитесь, что ваш MOK добавлен в UEFI:

    mokutil --list-enrolled

    Утилита должна вывести на экран список MOK, ваш в том числе. Вы узнаете его по полю "CN".

FreeBSD

Ключи и сертификат есть, MOK установлен в UEFI. Осталось дело за малым — установить FreeBSD и подписать загрузчик.

  1. Выключите Secure Boot, иначе не сможете запустить установщик FreeBSD, он же не подписан!

  2. Установите FreeBSD. При разметке дисков установщик должен создать раздел ESP на диске с корневым разделом.

  3. Загрузите установленную FreeBSD.

  4. Смонтируйте флешку с файлами MOK:

    1. Создайте в /mnt каталог:

      mkdir /mnt/flash
    2. Выполните команду монтирования:

      mount -t msdosfs -o -m=644 /dev/da0s1 /mnt/flash

      Если будут сложности, обратитесь к FreeBSD Handbook.

  5. Перейдите в каталог /boot/:

    cd /boot/
  6. Убедитесь, что каталог efi/ существует и не пуст. Во FreeBSD 15 там будет подкаталог efi/.

  7. Удалите из каталога /boot/efi/efi/boot/ неподписанный загрузчик:

    rm /boot/efi/efi/boot/loader.efi
  8. Подпишите загрузчик и разместите его в /boot/efi/efi/. Это можно сделать одной командой:

    uefisign \
       -c /mnt/flash/PEM.crt \
       -k /mnt/flash/PEM.key \
       -o /boot/efi/efi/boot/bootx64.efi \
       /boot/loader.efi
  9. Перезагрузите компьютер, но по пути зайдите в UEFI и включите Secure Boot.

Если всё сделали правильно, то ваша FreeBSD без проблем загрузится.

Комментарии (22)


  1. checkpoint
    19.12.2025 09:13

    Спасибо за инструкцию.


    1. dunmaksim Автор
      19.12.2025 09:13

      Если Вам не трудно, попробуйте пройти её на реальном железе. Если будут какие-то проблемы, или я что-то забыл добавить в руководство, то я это исправлю.


      1. checkpoint
        19.12.2025 09:13

        Ок, я попробую подписать загрузчик на своем ноуте.


  1. domix32
    19.12.2025 09:13

    apt-get update && apt-get install mokutil --yes

    А из сорцов оно на фре не соберётся?


    1. dunmaksim Автор
      19.12.2025 09:13

      Не смог найти в портах и через `pkg search` :-(

      Что-то мне подсказывает, что эта штука пока существует только под Linux. Дело в том, что эта утилита для управления MOK устанавливает переменной EFI какое-то значение, которое при следующей загрузке приводит к загрузке не shimx64.efi, а mmx64.efi. (посмотрите у себя в /boot/efi/EFI/debian/). В конце своей работы этот загрузчик (если его можно так назвать) сбрасывает значение переменной, и загрузка снова проходит нормально.


    1. checkpoint
      19.12.2025 09:13

      Я пробовал собрать mokutil под FreeBSD,там есть ависимость от libkeyutils который под FreeBSD не собирается из-за каких-то специфических зависимостей (заголовочных файлов) от Linux ядра.


  1. oscar120584
    19.12.2025 09:13

    Спасибо за статью.
    Но хотелось бы прояснить момент. Если я правильно понял, результат поиска доступных загрузчиков из п.2 определяет содержимое boot menu. Собственно вопрос: можно ли настроить так чтобы при обнаружении загрузчика для винды, он не пытался его проверит MOK ключами, и наоборот использовать только MOK для остальных. Почему спрашиваю - все мы люди и после работы иногда играем. А так как работаем ("мы, николай вторый...)))))") в линухе, а играем в батлу на винде возникает проблема дуалбута и переключения профиля ключей в материнке при перезагрузках. Если этого не делать, то или винда не запустит античит или линух продинамит само-сборный (но подписанный MOK) нужный для работы модуль.


    1. dunmaksim Автор
      19.12.2025 09:13

      Не очень понятен контекст. Расскажу свою ситуацию. У меня три ОС:

      • Windows 11

      • Debian Trixie

      • FreeBSD 15

      Загрузчик Windows 11 подписан ключом, который и так есть в UEFI материнской платы (ASUS ROG Strix Z370G), его проверка по умолчанию проходит успешно.

      Debian Trixie использует shim-loader, который тоже подписан ключом Microsoft. Не знаю, тем же самым что и загрузчик Windows, или другим, но суть одна: с ним тоже проблем нет.

      Драйверы NVIDIA и VirtualBox для Linux подписаны MOK'ом. Им же подписан загрузчик FreeBSD. Благодаря этому я просто включил Secure Boot в режим "Windows OS" и никаких проблем не знаю. Во время загрузки нажал F8, выбрал нужную ОС, нажал Enter, всё (GRUB не видит FreeBSD, но видит Windows). Т. е. если подписать что нужно и поместить ключ в UEFI, то не надо больше теребонькать Secure Boot в настройках материнской платы. Один раз включили и забыли.


      1. oscar120584
        19.12.2025 09:13

        Хм, а вот теперь стало интересно. Все тоже самое, только проприетарный модуль для радеон и вмварь. MOK собирал не сам, доверившись установочному скрипту. Подписанные модули так и не завелись с профилем Windows UEFI mode, а при переключение на Other OS уже винда считает загрузку не безопасной.
        Весь этот движ для меня начался после того как игры стали требовать безопасную загрузку.
        Постараюсь в ближайшее время еще раз проверить.
        согласно доке винда все одобрит только если не будет посторонних ключей. Что вполне логично: что мне мешает подписать MOK чит/вирус и загрузить его в винде?


        1. dunmaksim Автор
          19.12.2025 09:13

          Установочный скрипт обычно работает так:

          1. Создаём приватный ключ, MOK и сертификат.

          2. Подписываем что нужно приватным ключом.

          3. Удаляем приватный ключ.

          Заметили чего не хватает? Правильно! Не хватает шага импорта MOK в UEFI. Например, установщик NVIDIA сохраняет MOK по пути /usr/share/nvidia/ в файл с расширением .der. Это наш MOK и есть. Но в какой момент установщик его раскатывает в UEFI? А ни в какой, это надо делать самому.

          что мне мешает подписать MOK чит/вирус и загрузить его в винде

          Система безопасности Windows, для которой что-то, работающее на уровне ядра, но не имеющее подписи Microsoft, считается угрозой?


          1. oscar120584
            19.12.2025 09:13

            Глупый вопрос: вы ведь проверяете в винде состояние безопасной загрузки по выводу msinfo32, а не просто по факту загрузки?


            1. dunmaksim Автор
              19.12.2025 09:13

              В моём случае я проверяю состояние Secure Boot по состоянию настроек в UEFI.


              1. oscar120584
                19.12.2025 09:13

                А можете проверить вывод msinfo32 ? Жаль, но в противном случае это умножает ценность статьи на 0.


        1. dartraiden
          19.12.2025 09:13

          что мне мешает подписать MOK чит/вирус и загрузить его в винде?

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

          Если вы хотите загрузить ядерный драйвер Windows, не имеющий подписи MS WHQL, вам придётся, во-первых, отключить Secure Boot (иначе Windows не позволит включить тестовый режим), во-вторых, включить тестовый режим и подписать этот драйвер своим ключом, в-третьих, добавить ключ в доверенные корневые в самой Windows.

          (чтобы не усложнять, я специально не упоминаю про такую экзотику как полное отключение проверки подписей (потому что этот режим нужно включать перед каждой загрузкой и для повседневного использования он не предназначен) и известную дыру с кросс-подписями, позволяющую подписывать драйверы утекшими сертификатами в обход WHQL (их осталось мало живых, да и они давно в чёрных списках у популярных античитов)

          Подписанные модули так и не завелись с профилем Windows UEFI mode, а при переключение на Other OS уже винда считает загрузку не безопасной.

          У майков есть два ключа. Одним они подписывают собственные загрузчики (Windows), вторым - всякое линуксовое добро типа shim, GRUB и т.д.

          "Windows UEFI mode" означает "доверять только ключу, которым подписывают винду", что позволяет грузить только Windows.

          "Other OS" позволяет грузить то, что подписано не предыдущим ключом

          Почему у вас Windows считает Other OS чем-то недостаточно надёжным, я не знаю.

          (опять же, я специально упрощаю, говоря про "два ключа", на самом деле, сейчас их уже пять: поскольку те самые "два ключа" в следующем году протухнут, майки выпустили ещё три: пара на замену описанным выше, а третий отдельный для подписи прошивок внешних устройств типа видеокарт).


          1. oscar120584
            19.12.2025 09:13

            В винде, в принципе, мне ничего не нужно. Это просто прошивка компа для игр. Собственно моя задача это обеспечить вывод msinfo32 о безопасной загрузке (для работы античита) и нормальную работу самообороных модулей ядра в линуксе без манипуляций с биосом при перезагрузке. Попытка решить это в режиме домохозяйки и стандартными установочными скриптами не увенчались успехом. Работало что-то одно. Судя по тому, что при включённом секъюр буте нормально загружались модули в линуксе при выборе профиля otherOS, МОК таки прописался в материнку. В выходные ещё раз накачу трикси руками и проверю.


          1. oscar120584
            19.12.2025 09:13

            Почему у вас Windows считает Other OS чем-то недостаточно надёжным, я не знаю.

            Об чем и спич!!! Я так понял это не только у меня, а вообще поведение винды. Я понимаю это, и не против. У меня больше вопрос к производителям материнок: прикрутите возможность привязки профиля ключей к бут меню.


            1. dartraiden
              19.12.2025 09:13

              Судя по документации, у асуса Other OS это отключение SB вообще.

              https://www.asus.com/ru/support/faq/1049829/

              А вам для дуалбута нужно скрафтить свои ключи и добавить к ним ключи Microsoft, как описано в этой статье. Затем в настройках биоса стереть предустановленные и загнать то, что у вас получилось. Таким образом, вы сможете грузить загрузчики Windows, сторонние загрузчики, подписанные Microsoft, а также загрузчики и модули ядра Linux, подписанные лично вами.


          1. dartraiden
            19.12.2025 09:13

            В общем, я посмотрел, биос асуса, там Other OS, похоже, означает "выключить Secure Boot", так что выше мои рассуждения про это можно смело пропускать.

            Асусу минус в репутацию за то, что не назвал опцию просто и понятно - "Enable Secure Boot"


  1. AnyKey80lvl
    19.12.2025 09:13

    mokutil --import MOK.der

    А что мешает вирусу сделать то же самое?


    1. Spearton
      19.12.2025 09:13

      Может быть это слишком, или детектится антивирем легко.. а вообще если захотят реально взломать - не помешает ни МОК, ни антивирус)


    1. dunmaksim Автор
      19.12.2025 09:13

      После выполнения этой команды нужно ввести пароль. Ну, допустим, инвертированный кейлоггер это сделал. На следующем этапе нужно:

      1. Перезагрузить компьютер. Окей, не сложно.

      2. Загрузить отдельную операционную систему, подписанную уже установленным в UEFI ключом (в Debian Linux это /boot/efi/EFI/debian/mmx64.efi).

      3. В загруженной ОС как-то пронажимать клавиши, чтобы раскатать свой ключ.

      Ну, ок, удачи.


      1. AnyKey80lvl
        19.12.2025 09:13

        не выглядит невозможным для спецслужб, например.

        для вирусописателей - да, геморройно