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  Czym są zmienne środowiskowe Linux? Kompleksowy przewodnik dla każdego użytkownika

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 zabezpieczyć smartfon przed kradzieżą w podróży – praktyczny poradnik dla użytkowników Androida

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 serwera bazy danych (MySQL/MariaDB/PostgreSQL) w Debianie: Instalacja i konfiguracja serwera bazy danych
Konfiguracja serwera bazy danych (MySQL/MariaDB/PostgreSQL) w Debianie: Instalacja i konfiguracja serwera bazy danych

Konfiguracja serwera bazy danych (MySQL/MariaDB/PostgreSQL) w Debianie: Instalacja i konfiguracja serwera bazy danych Wstęp Serwer bazy danych jest kluczowym elementem Czytaj dalej