Linux Secure Boot Hardening – jak własnoręcznie tworzyć podpisane obrazy kernelu i modułów
Secure Boot odgrywa dziś kluczową rolę w zabezpieczaniu systemów Linux przed uruchamianiem nieautoryzowanego kodu — zarówno podczas startu, jak i w trakcie ładowania modułów jądra. W środowiskach produkcyjnych, serwerowych i korporacyjnych coraz częściej wymaga się nie tylko korzystania z Secure Boot, ale również samodzielnego podpisywania jądra, initramfs i modułów, aby:
- zachować pełną kontrolę nad łańcuchem zaufania,
- uruchamiać własne, customowe kernele,
- instalować sterowniki i moduły spoza oficjalnych repozytoriów,
- zintegrować własne polityki bezpieczeństwa.
Poniżej znajdziesz praktyczny przewodnik pokazujący, jak utworzyć własne klucze, podpisać kernel i moduły, a następnie bezpiecznie je wdrożyć w środowisku z włączonym Secure Boot.
1. Secure Boot – szybkie przypomnienie
Secure Boot działa w oparciu o łańcuch zaufania:
- UEFI ładuje podpisany bootloader.
- Bootloader uruchamia podpisany obraz jądra.
- Kernel ładuje tylko podpisane moduły.
Jeśli którykolwiek element nie jest podpisany kluczem zaufanym przez UEFI, uruchomienie zostanie zablokowane.
Własne podpisy są niezbędne, jeśli:
- budujesz jądro samodzielnie,
- korzystasz z DKMS (np. NVIDIA, VirtualBox),
- instalujesz sterowniki out-of-tree,
- tworzysz własną dystrybucję.

2. Tworzenie własnych kluczy: KEK, DB, MOK
Możesz przygotować trzy typy kluczy:
1. Klucze UEFI (KEK + DB)
Wymagają dostępu do firmware i są zaawansowane. Wykorzystuje się je głównie w środowiskach enterprise.
2. MOK – Machine Owner Key (najpraktyczniejsze podejście)
To najczęściej stosowany model: klucz jest rejestrowany w systemowym MOK Managerze podczas rebootu.
Generowanie klucza MOK:
openssl req -new -x509 -newkey rsa:4096 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=MyKernel/"
Zestaw plików:
- MOK.key – klucz prywatny (trzymany w tajemnicy),
- MOK.crt – klucz publiczny (dodawany do systemu).
3. Dodawanie klucza do MOK Managera
Zarejestruj klucz w systemie:
sudo mokutil --import MOK.crt
Po restarcie:
- pojawi się MOK Manager,
- wybierz Enroll MOK,
- potwierdź hasłem,
- zaakceptuj klucz.
Od tego momentu kernel i moduły podpisane tym kluczem będą uznawane za zaufane.
4. Podpisywanie własnego jądra Linux
1. Zlokalizuj plik kernela
Najczęściej:
/boot/vmlinuz-<wersja>/boot/EFI/.../bzImage
2. Użyj narzędzia sbsign
sbsign --key MOK.key --cert MOK.crt --output vmlinuz-signed vmlinuz
Wygenerowany plik vmlinuz-signed zastępuje dotychczasowy kernel w katalogu EFI lub /boot.
Możesz go umieścić np.:
sudo cp vmlinuz-signed /boot/efi/EFI/Linux/vmlinuz.efi
5. Podpisywanie modułów jądra (out-of-tree + DKMS)
Linux wymaga, aby wszystkie moduły ładowane pod Secure Boot były podpisane kluczem uznanym przez kernel.
Podpisywanie modułu ręcznie
Załóżmy, że chcesz podpisać moduł:
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file \
sha256 MOK.key MOK.crt /lib/modules/$(uname -r)/kernel/drivers/misc/example.ko
Automatyzacja dla DKMS
W katalogu /etc/dkms/sign_helper.sh możesz utworzyć skrypt:
#!/bin/bash
KEY="/root/MOK.key"
CRT="/root/MOK.crt"
/usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 $KEY $CRT "$1"
Następnie w /etc/dkms/template-dkms-mok.conf:
POST_BUILD="/etc/dkms/sign_helper.sh ${dkms_module_path}/${module}.ko"
Od teraz każdy moduł przebudowany przez DKMS będzie podpisany automatycznie.
6. Podpisywanie initramfs
Initramfs również musi być podpisany, aby zachować łańcuch zaufania.
Przykład dla systemd-boot:
sbsign --key MOK.key --cert MOK.crt \
--output initramfs.img.signed initramfs.img
Następnie umieszczasz go w /boot lub /boot/efi zależnie od konfiguracji.
7. Sprawdzanie podpisów
Sprawdzenie podpisu kernela:
sbverify --list vmlinuz-signed
Sprawdzenie podpisu modułu:
modinfo -F signer /path/to/module.ko
Powinieneś zobaczyć:
signer: MyKernel
sig_key: MOK.key
8. Zaawansowane techniki hardeningu Secure Boot
1. Całkowite usunięcie kluczy Microsoftu z firmware
Zachowujesz pełną kontrolę nad tym, co system uznaje za zaufane.
2. Własny łańcuch kluczy KEK + DB + dbx
Możesz odrzucać konkretne komponenty (np. stare shim-y) przez własny dbx.
3. Własne shim + grub + kernel
Pełna kontrola nad pipeline’em bootowania.
4. TPM 2.0 + measured boot
Rejestrowanie integralności bootloadera w PCR, dodatkowa walidacja.
5. Łączenie z modułem ima i ima-evm
Podpisy plików wykonywalnych i bibliotek — kontrola integralności całego systemu.
9. Najczęstsze problemy i ich rozwiązania
1. Kernel nie uruchamia się mimo podpisu
- klucz nie został zaimportowany do MOK,
- plik jest w złej lokalizacji EFI,
- Secure Boot wymaga formatu EFI, nie raw vmlinuz.
2. Moduły nie ładują się po aktualizacji systemu
Należy ponownie podpisać:
- moduły DKMS,
- nowe moduły dostarczone przez kernel.
3. NVIDIA / VirtualBox odmawiają pracy
Wymagają podpisania modułów:
modprobe -v nvidia
Jeśli pokazuje tainted, moduły nie są podpisane.
Podsumowanie
Tworzenie podpisanych obrazów jądra i modułów Linux to kluczowy element twardego hardeningu Secure Boot. Własne klucze MOK i podpisywanie kluczowych komponentów pozwalają:
- zwiększyć bezpieczeństwo,
- utrzymać pełną kontrolę nad systemem,
- uruchamiać customowe kernele i moduły bez łamania Secure Boot,
- wdrażać rozwiązania stosowane w enterprise i środowiskach produkcyjnych.






