Главная
» Как сделать
»
Установка и подписание пользовательских модулей ядра в режиме безопасной загрузки SLES 15.
Установка и подписание пользовательских модулей ядра в режиме безопасной загрузки SLES 15.
Сторонний драйвер на SUSE Linux Enterprise Server 15 может компилироваться корректно, но не загружаться с ошибкой «Необходимый ключ недоступен» или «Ключ был отклонен службой». Если UEFI Secure Boot требует подписи модулей, решение состоит в том, чтобы подписать пользовательский модуль ядра доверенным сертификатом, зарегистрировать этот сертификат через управление ключами владельца машины (MOK), а затем загрузить модуль обычным способом — без отключения Secure Boot.
Данная процедура предполагает стандартную систему SLES 15 UEFI с использованием SUSE shim, kernel-defaultядра, прав администратора и доверенного источника драйверов. Она рассматривает пользовательские .koмодули, не предусматривает подписание заменяющего ядра или изменение ключей платформы прошивки. Примеры соответствуют модели администрирования SLES 15 SP6/SP7; проверьте различия в пакетах и вариантах ядра в установленном вами пакете обновлений.
1. Сначала проверьте Secure Boot и работающее ядро.
Войдите в систему с правами администратора и укажите, какое ядро вы фактически загрузили. Одного лишь совпадения имени пакета недостаточно, чтобы доказать, что модуль может быть загружен в это ядро.
uname -r
mokutil --sb-state
ls -ld "/lib/modules/$(uname -r)/build"
Перед установкой или подписанием драйвера проверьте активный релиз ядра и состояние Secure Boot.
Если mokutilсистема сообщает о включенной функции Secure Boot, вероятной причиной сбоя загрузки, связанного с ключом, является ненадежная подпись. Если она отключена, перед генерацией ключей следует исследовать другие причины; также может иметь значение явное принудительное применение подписи ядра. После неудачной загрузки проверьте журнал ядра, чтобы узнать фактическое сообщение об отклонении.
sudo journalctl -k -b --no-pager | tail -n 50
Перед установкой проверьте модуль-кандидат. Замените имя файла в примере на реальное; оно vermagicдолжно соответствовать текущей версии ядра и совместимым параметрам сборки.
modinfo -F name /path/to/mydriver.ko
modinfo -F vermagic /path/to/mydriver.ko
Проверяйте метаданные модулей, особенно vermagic, вместо того, чтобы предполагать, что любой файл .ko будет соответствовать SLES 15.
2. Используйте поддерживаемый пакет драйверов или создайте соответствующий модуль.
Сначала обратитесь к поставщику оборудования или программного обеспечения с просьбой предоставить совместимый с SLES, уже подписанный пакет модулей ядра (KMP). Это предпочтительнее, чем ручная установка бинарного файла: поставщик может обеспечить обработку обновлений ядра и документированный процесс регистрации сертификата. Подпись поставщика не автоматически считается доверенной на каждой машине с функцией Secure Boot.
Если вам необходимо собрать драйвер, установите файлы разработки, соответствующие используемому вами ядру. Что касается конфигурации kernel-default, то обычные пакеты SLES включают в себя стандартный пакет разработки ядра, файлы разработки ядра и инструменты сборки. Доступность репозитория и его версии зависят от регистрации и включенных модулей SLES.
Перед началом работы с пользовательским модулем установите соответствующие пакеты разработки ядра и криптографические инструменты.
Если каталог сборки отсутствует или пакет разработки предназначен для другой версии ядра, сначала устраните несоответствие пакета и ядра. Для сборки недавно установленного ядра может потребоваться контролируемая перезагрузка.
Используйте инструкции по сборке от поставщика из каталога исходных кодов доверенных драйверов. Для обычных модулей на основе kbuild приведенная ниже команда выполняет сборку с использованием работающего ядра; она не загружает и не создает драйвер самостоятельно.
cd /path/to/driver-source
make -C "/lib/modules/$(uname -r)/build" M="$PWD" modules
Используйте дерево сборки ядра и каталог исходных кодов драйвера для создания соответствующего файла .ko.
Пропускайте компиляцию, если у вас уже есть совместимый модуль .koот надежного поставщика. Никогда не загружайте модуль принудительно с неправильным значением vermagic; сигнатура не может исправить несовместимый исполняемый файл.
3. Создайте ключ подписи и подпишите установленный модуль.
Создайте выделенный ключ RSA и сертификат X.509 в каталоге, доступном только для корневого пользователя. Открытый сертификат будет зарегистрирован; закрытый ключ должен оставаться защищенным, поскольку тот, кто его контролирует, может подписывать дополнительные модули, которым может доверять эта машина.
Сгенерируйте отдельную пару ключей для подписи модуля и храните закрытый ключ в тайне, доступ к нему должен быть ограничен администратором.
-nodesВ качестве простого примера создается незашифрованный закрытый ключ; для производственного процесса подписания используйте соответствующим образом защищенный зашифрованный ключ или внешнюю службу подписи в соответствии с вашей политикой безопасности. Показанный здесь десятилетний срок действия является иллюстративным и не является рекомендацией по сроку действия сертификата для организации.
Скопируйте готовый модуль в каталог модулей работающего ядра. Подпишите точно такой же установленный файл после любых изменений в упаковке, удалении данных или других модификациях файла. Замените mydriverи его путь на фактическое базовое имя и местоположение модуля.
install -D -m 0644 /path/to/mydriver.ko \
"/lib/modules/$(uname -r)/extra/mydriver.ko"
SIGN_FILE="$(readlink -f /lib/modules/$(uname -r)/build)/scripts/sign-file"
test -x "$SIGN_FILE" || echo "Locate the sign-file binary for this kernel"
"$SIGN_FILE" sha256 /root/module-signing/MOK.priv \
/root/module-signing/MOK.der \
"/lib/modules/$(uname -r)/extra/mydriver.ko"
modinfo -F signer "/lib/modules/$(uname -r)/extra/mydriver.ko"
Примените подпись к установленному файлу .ko и проверьте поле "Подписант" перед его загрузкой.
Если sign-fileпо указанному пути отсутствует инструмент, найдите тот, который поставляется вместе с соответствующими файлами сборки ядра, вместо того, чтобы копировать неподходящую версию. Отображаемый подписант означает, что файл содержит метаданные подписи; это не доказывает, что подписант был зарегистрирован. Никогда не удаляйте и не изменяйте модуль после подписания.
4. Зарегистрируйте публичный сертификат с помощью MOK.
Импортируйте открытый сертификат в формате DER — нет MOK.priv— и установите одноразовый пароль для регистрации, запрошенный mokutil. Организуйте доступ к консоли перед перезагрузкой; авторизация происходит в интерфейсе MokManager при загрузке, а не в оболочке SSH.
В меню загрузки UEFI выберите «Зарегистрировать MOK» и подтвердите запрошенную регистрацию сертификата.
При следующей загрузке выберите «Зарегистрировать MOK» , следуйте инструкциям по подтверждению, введите одноразовый пароль и продолжите загрузку. Внешний вид меню зависит от версии прошивки и модуля. Возврат в Linux без подтверждения регистрации приведет к тому, что новый сертификат будет считаться недоверенным.
После загрузки убедитесь, что указанный сертификат зарегистрирован:
5. Загрузите подписанный модуль и выявите оставшиеся ошибки.
Обновляет метаданные зависимостей модуля и загружает модуль по его имени, а не по полному пути к файлу. modprobeРазрешает зависимости и учитывает стандартную конфигурацию модуля.
Убедитесь, что подписанный модуль отображается в списке загруженных модулей, и проверьте журнал ядра на наличие ошибок.
Если загрузка по-прежнему не удается, выберите корректирующее действие, соответствующее имеющимся данным:
Ключ отклонен или необходимый ключ недоступен: повторный запуск mokutil --test-key; убедитесь, что установленный вами файл является подписанным, и проверьте, не был ли он заменен обновлением драйвера.
Недопустимый формат модуля: сравните modinfo -F vermagicс uname -r, пересоберите для активного ядра и проверьте архитектуру ЦП.
Неизвестный символ или отсутствующая зависимость: проверьте journalctl -k -bнеобходимые модули поставщика и ABI ядра; другая сигнатура не исправит отсутствующие символы.
Для критически важных при загрузке драйверов хранилища или сети сначала протестируйте их на непроизводственной системе и убедитесь в наличии консоли восстановления. Настраивайте автоматическую загрузку только после того, как драйвер будет работать надежно; /etc/modules-load.d/в документации SUSE описаны модули, которые не загружаются при обнаружении устройства.
Проверьте результат после перезагрузки.
Если постоянная загрузка имеет значение, перезагрузите систему еще раз в течение периода обслуживания. Убедитесь, что функция Secure Boot остается включенной, открытый ключ зарегистрирован, модуль присутствует, и ядро не сообщает о новых ошибках проверки или совместимости. .koПосле обновления ядра или драйверов поставщика пересоберите или переустановите и подпишите обновленную версию.