В этом руководстве описывается процесс настройки 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 следующим образом (сильно упрощённо, главное — уловить суть):
На этапе начальной загрузки UEFI ищет на накопителях раздел с меткой ESP.
Если такой раздел найден, UEFI проверяет его содержимое на наличие каталогов
/efiи кое-каких других, а в них — наличие файловboot64.efi,loader.efiи аналогичных. Перечисление полного списка не цель этой статьи, обращайтесь к стандарту.Когда наступает время выполнить код загрузчика, Secure Boot загружает из NVRAM (энергонезависимая память) список открытых ключей для проверки цифровой подписи.
-
С помощью найденных ключей Secure Boot проверяет цифровую подпись найденных загрузчиков.
Проверка успешна? Выполняем загрузчик. Дальше он сам. Но на всякий случай Secure Boot будет дополнительно проверять цифровую подпись некоторых драйверов, например, VirtualBox и NVIDIA.
Ключ не найден, подпись не совпадает или её вовсе нет? Это проблема. Нарисуем пугающе-красное окно 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-дистрибутивах.
-
Установите утилиту
mokutil:apt-get update && apt-get install mokutil --yes -
Для генерации 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 хорошо узнаваемым. Придумайте хорошее название, потому что в будущем оно поможет вам вспомнить что это за ключ, откуда он взялся и всё такое. Введите пароль приватного ключа. На всякий случай запишите его на бумажку. Если забудете пароль, воспользоваться приватным ключом уже не сможете. Генерировать MOK каждый раз заново плохая идея: известны случаи, когда переполнение хранилища приводило к непонятным ошибкам. По-хорошему, в вашей системе должен быть установлен всего один MOK. Ну, ок, максимум два, ваш собственный и для драйвера видеокарты.
-
Создайте сертификат:
openssl x509 -inform der -in MOK.der -out MOK.pemТеперь у вас в каталоге размещаются 3 файла:
MOK.key— приватный ключ.MOK.der— публичный ключ, его мы будем импортировать в NVRAM.MOK.pem— сертификат, которым мы будем подписывать загрузчик.
Скопируйте эти файлы, например, на флешку. Чуть позже мы используем их во FreeBSD. Можно и не на флешку. Короче, вам нужно каким-то образом сделать так, чтобы файлы ключей стали доступны во FreeBSD.
-
Для импорта MOK в UEFI выполните команду:
mokutil --import MOK.derВас попросят дважды ввести пароль. Не усложняйте, используйте что-нибудь незатейливое, ведь он понадобится всего один раз.
Перезагрузите компьютер. Вместо Linux будет запущена оболочка для работы с MOK. Всё, что вам нужно сделать — выбирать варианты, которые позволят вам раскатить (Enroll) ваш MOK в UEFI. Один раз придётся ввести пароль (тот самый, с которым я просил не усложнять). В конце напишут, что ключ успешно установлен и предложат перезагрузить компьютер.
-
Загрузите Linux и убедитесь, что ваш MOK добавлен в UEFI:
mokutil --list-enrolledУтилита должна вывести на экран список MOK, ваш в том числе. Вы узнаете его по полю "CN".
FreeBSD
Ключи и сертификат есть, MOK установлен в UEFI. Осталось дело за малым — установить FreeBSD и подписать загрузчик.
Выключите Secure Boot, иначе не сможете запустить установщик FreeBSD, он же не подписан!
Установите FreeBSD. При разметке дисков установщик должен создать раздел ESP на диске с корневым разделом.
Загрузите установленную FreeBSD.
-
Смонтируйте флешку с файлами MOK:
-
Создайте в
/mntкаталог:mkdir /mnt/flash -
Выполните команду монтирования:
mount -t msdosfs -o -m=644 /dev/da0s1 /mnt/flashЕсли будут сложности, обратитесь к FreeBSD Handbook.
-
-
Перейдите в каталог
/boot/:cd /boot/ Убедитесь, что каталог
efi/существует и не пуст. Во FreeBSD 15 там будет подкаталогefi/.-
Удалите из каталога
/boot/efi/efi/boot/неподписанный загрузчик:rm /boot/efi/efi/boot/loader.efi -
Подпишите загрузчик и разместите его в
/boot/efi/efi/. Это можно сделать одной командой:uefisign \ -c /mnt/flash/PEM.crt \ -k /mnt/flash/PEM.key \ -o /boot/efi/efi/boot/bootx64.efi \ /boot/loader.efi Перезагрузите компьютер, но по пути зайдите в UEFI и включите Secure Boot.
Если всё сделали правильно, то ваша FreeBSD без проблем загрузится.
Комментарии (22)

domix32
19.12.2025 09:13apt-get update && apt-get install mokutil --yesА из сорцов оно на фре не соберётся?

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

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

oscar120584
19.12.2025 09:13Спасибо за статью.
Но хотелось бы прояснить момент. Если я правильно понял, результат поиска доступных загрузчиков из п.2 определяет содержимое boot menu. Собственно вопрос: можно ли настроить так чтобы при обнаружении загрузчика для винды, он не пытался его проверит MOK ключами, и наоборот использовать только MOK для остальных. Почему спрашиваю - все мы люди и после работы иногда играем. А так как работаем ("мы, николай вторый...)))))") в линухе, а играем в батлу на винде возникает проблема дуалбута и переключения профиля ключей в материнке при перезагрузках. Если этого не делать, то или винда не запустит античит или линух продинамит само-сборный (но подписанный MOK) нужный для работы модуль.
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 в настройках материнской платы. Один раз включили и забыли.

oscar120584
19.12.2025 09:13Хм, а вот теперь стало интересно. Все тоже самое, только проприетарный модуль для радеон и вмварь. MOK собирал не сам, доверившись установочному скрипту. Подписанные модули так и не завелись с профилем Windows UEFI mode, а при переключение на Other OS уже винда считает загрузку не безопасной.
Весь этот движ для меня начался после того как игры стали требовать безопасную загрузку.
Постараюсь в ближайшее время еще раз проверить.
согласно доке винда все одобрит только если не будет посторонних ключей. Что вполне логично: что мне мешает подписать MOK чит/вирус и загрузить его в винде?
dunmaksim Автор
19.12.2025 09:13Установочный скрипт обычно работает так:
Создаём приватный ключ, MOK и сертификат.
Подписываем что нужно приватным ключом.
Удаляем приватный ключ.
Заметили чего не хватает? Правильно! Не хватает шага импорта MOK в UEFI. Например, установщик NVIDIA сохраняет MOK по пути
/usr/share/nvidia/в файл с расширением.der. Это наш MOK и есть. Но в какой момент установщик его раскатывает в UEFI? А ни в какой, это надо делать самому.что мне мешает подписать MOK чит/вирус и загрузить его в винде
Система безопасности Windows, для которой что-то, работающее на уровне ядра, но не имеющее подписи Microsoft, считается угрозой?

oscar120584
19.12.2025 09:13Глупый вопрос: вы ведь проверяете в винде состояние безопасной загрузки по выводу
msinfo32,а не просто по факту загрузки?
dunmaksim Автор
19.12.2025 09:13В моём случае я проверяю состояние Secure Boot по состоянию настроек в UEFI.

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

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

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

oscar120584
19.12.2025 09:13Почему у вас Windows считает Other OS чем-то недостаточно надёжным, я не знаю.
Об чем и спич!!! Я так понял это не только у меня, а вообще поведение винды. Я понимаю это, и не против. У меня больше вопрос к производителям материнок: прикрутите возможность привязки профиля ключей к бут меню.

dartraiden
19.12.2025 09:13Судя по документации, у асуса Other OS это отключение SB вообще.
https://www.asus.com/ru/support/faq/1049829/
А вам для дуалбута нужно скрафтить свои ключи и добавить к ним ключи Microsoft, как описано в этой статье. Затем в настройках биоса стереть предустановленные и загнать то, что у вас получилось. Таким образом, вы сможете грузить загрузчики Windows, сторонние загрузчики, подписанные Microsoft, а также загрузчики и модули ядра Linux, подписанные лично вами.

dartraiden
19.12.2025 09:13В общем, я посмотрел, биос асуса, там Other OS, похоже, означает "выключить Secure Boot", так что выше мои рассуждения про это можно смело пропускать.
Асусу минус в репутацию за то, что не назвал опцию просто и понятно - "Enable Secure Boot"

AnyKey80lvl
19.12.2025 09:13mokutil --import MOK.derА что мешает вирусу сделать то же самое?

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

dunmaksim Автор
19.12.2025 09:13После выполнения этой команды нужно ввести пароль. Ну, допустим, инвертированный кейлоггер это сделал. На следующем этапе нужно:
Перезагрузить компьютер. Окей, не сложно.
Загрузить отдельную операционную систему, подписанную уже установленным в UEFI ключом (в Debian Linux это
/boot/efi/EFI/debian/mmx64.efi).В загруженной ОС как-то пронажимать клавиши, чтобы раскатать свой ключ.
Ну, ок, удачи.

AnyKey80lvl
19.12.2025 09:13не выглядит невозможным для спецслужб, например.
для вирусописателей - да, геморройно
checkpoint
Спасибо за инструкцию.
dunmaksim Автор
Если Вам не трудно, попробуйте пройти её на реальном железе. Если будут какие-то проблемы, или я что-то забыл добавить в руководство, то я это исправлю.
checkpoint
Ок, я попробую подписать загрузчик на своем ноуте.