module verification failed: signature missing — Решение подписи модулей Linux
Архитектура ошибки и симптомы сбоя
Предупреждение ядра «Modules: module verification failed: signature and/or key missing - tainting kernel» генерируется подсистемой проверки криптографических подписей модулей ядра (CONFIG_MODULE_SIG). При загрузке стороннего драйвера (NVIDIA, ZFS, VirtualBox, WireGuard, кастомных сетевых драйверов DKMS) ядро проверяет цифровую подпись модуля X.509. Если модуль не подписан доверенным ключом из системного хранилища, ядро помечает себя флагом Tainted (E - Unsigned Module), а при включенном UEFI Secure Boot (Lockdown mode) полностью блокирует загрузку модуля с ошибкой Operation not permitted.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| Tainted: [E] | Unsigned Module Loaded | Загружен неподписанный или подписанный недоверенным ключом модуль. |
| Kernel Lockdown | Integrity / Confidentiality | Режим блокировки: ядро категорически запрещает загрузку неподписанного кода. |
| MOK (Machine Owner Key) | Shim / UEFI Keyring | Пользовательский сертификат, зарегистрированный в энергонезависимой памяти NVRAM. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка статуса Secure Boot и флагов Tainted ядра
# Проверка статуса блокировки Secure Boot:
sudo mokutil --sb-state
# Проверка флагов загрязнения ядра:
cat /proc/sys/kernel/taintedСценарий 2: Генерация MOK-ключа и регистрация в UEFI через Mokutil
Для легитимной работы сторонних DKMS модулей при включенном Secure Boot создайте собственный ключ:
# 1. Создание пары ключей X.509:
sudo openssl req -new -x509 -newkey rsa:2048 -keyout /root/MOK.priv -outform DER -out /root/MOK.der -nodes -days 36500 -subj "/CN=ITSTM Module Signing/"
# 2. Импорт открытого ключа в базу MOK (задайте временный пароль):
sudo mokutil --import /root/MOK.der
# 3. ПЕРЕЗАГРУЗИТЕ СЕРВЕР!
# При загрузке откроется синий экран 'Shim UEFI key management':
# Выберите 'Enroll MOK' -> 'Continue' -> 'Yes' -> введите заданный пароль -> 'Reboot'.Сценарий 3: Ручная подпись скомпилированного .ko модуля
# Запуск утилиты подписи ядра (путь к sign-file зависит от версии ядра):
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der /lib/modules/$(uname -r)/updates/dkms/nvidia.ko
# Повторная попытка загрузки модуля:
sudo modprobe nvidiaITSTM внедряет регламенты безопасной загрузки Secure Boot, автоматизирует подпись DKMS-модулей в CI/CD и обеспечивает соответствие стандартам ИБ.
Частые вопросы (FAQ)
Почему без Secure Boot эта ошибка не мешает работе сервера?
Если Secure Boot отключен, сообщение является простым информационным предупреждением (warning). Ядро выставляет флаг Tainted, но не блокирует загрузку модуля в память.
Что такое режим ядра Kernel Lockdown?
Kernel Lockdown — это механизм безопасности ядра Linux, активируемый при Secure Boot. Он запрещает модификацию памяти ядра из пространства пользователя (блокирует /dev/mem, kprobes, кастомные acpi таблицы и неподписанные модули).
Как автоматически подписывать DKMS модули при обновлении ядра?
В файле /etc/dkms/framework.conf настройте параметры mok_signing_key=/root/MOK.priv и mok_certificate=/root/MOK.der. Диспетчер DKMS будет автоматически подписывать все пересобираемые драйверы.
Как расшифровать битовую маску /proc/sys/kernel/tainted?
Каждый бит маски отвечает за определенное состояние (например, бит 0 = загружен проприетарный модуль, бит 12 = неподписанный модуль E, бит 9 = принудительно загружен несовместимый модуль). Расшифровка приведена в документации ядра admin-guide/tainted-kernels.rst.