Linux Secure Boot Hardening – jak własnoręcznie tworzyć podpisane obrazy kernelu i modułów
Linux

Linux Secure Boot Hardening – jak własnoręcznie tworzyć podpisane obrazy kernelu i modułów

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:

  1. UEFI ładuje podpisany bootloader.
  2. Bootloader uruchamia podpisany obraz jądra.
  3. Kernel ładuje tylko podpisane moduły.
Czytaj  Zaawansowane opcje BitLockera w Windows 12: tryby uwierzytelniania i opcje odzyskiwania

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ę.

 

Linux Secure Boot Hardening – jak własnoręcznie tworzyć podpisane obrazy kernelu i modułów
Linux Secure Boot Hardening – jak własnoręcznie tworzyć podpisane obrazy kernelu i modułów

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.

Czytaj  Jak połączyć antywirus z VPN i zwiększyć ochronę prywatności na Androidzie?

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.

 

Polecane wpisy
Konfiguracja sieci w Debianie: Konfiguracja interfejsów sieciowych (statyczne i dynamiczne adresy IP)
Konfiguracja sieci w Debianie: Konfiguracja interfejsów sieciowych (statyczne i dynamiczne adresy IP)

Konfiguracja sieci w Debianie: Konfiguracja interfejsów sieciowych (statyczne i dynamiczne adresy IP) Debian to jeden z najpopularniejszych systemów operacyjnych opartych Czytaj dalej

Marek "Netbe" Lampart Inżynier informatyki Marek Lampart to doświadczony inżynier informatyki z ponad 25-letnim stażem w zawodzie. Specjalizuje się w systemach Windows i Linux, bezpieczeństwie IT, cyberbezpieczeństwie, administracji serwerami oraz diagnostyce i optymalizacji systemów. Na netbe.pl publikuje praktyczne poradniki, analizy i instrukcje krok po kroku, pomagając administratorom, specjalistom IT oraz zaawansowanym użytkownikom rozwiązywać realne problemy techniczne.