В этом руководстве описывается процесс настройки 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 без проблем загрузится.