Secure Boot w Enterprise Linux z SoftHSM
Ten poradnik powstał z myślą, że w sieci jest za mało informacji na ten temat i jest mi z tego powodu bardzo przykro.
Pokażę w nim krok po kroku, jak skonfigurować sobie wirtualny sprzętowy moduł bezpieczeństwa (HSM - Hardware Security Module), wygenerować certyfikaty i klucze prywatne, zaimportować je i wykorzystać HSM do zaimplementowania Secure Boot w systemach z rodziny Enterprise Linux.

Jakie narzędzia będą potrzebne?
Poradnik zakłada, że masz zainstalowany system w maszynie wirtualnej w trybie EFI. Dopiero wtedy możemy przejść dalej.

Instalujemy SoftHSM i generujemy nasz token.
Uwaga: w kontekście HSM'a token oznacza coś potencjalnie kontrintuicyjnego. Niech no to wyjaśnię analogicznie:
Mając emulator PS2 mogę wygenerować sobie nieskończenie wiele wirtualnych kart pamięci 8MB. Analogicznie tutaj mogę wygenerować sobie nieskończenie wiele tokenów. Token oznacza tu wirtualne urządzenie symulujące prawdziwy HSM. Mogę w takim razie mieć odpowiednik zakupienia miliona sprzętowych modułów (HSMów).

Wykonujemy poniższe komendy:

sudo dnf install -y softhsm
sudo usermod -a -G ods $USER
(Wylogowujemy się i logujemy ponownie)
mkdir -p $HOME/.config/softhsm2/tokens
echo "directories.tokendir = $HOME/.config/softhsm2/tokens" > $HOME/.config/softhsm2/softhsm2.conf
softhsm2-util --init-token --label HSM --so-pin Secret.123 --pin Secret.123 --free

Źródło: https://www.dogtagpki.org/wiki/SoftHSM

Wdrażamy nasze własne certyfikaty "fake-MS" do UEFI
Uruchom ponownie maszynę wirtualną, wciskaj Escape aż pojawią się ustawienia EFI. Przejdź do sekcji dot. Secure Boota i pousuwaj wszystkie domyślnie dostarczane assety. Za chwilę zaimportujemy nasze własne, które będą symulowały oryginalne, ale posłużą też do podpisu naszego wkrótce wygenerowanego shima.

Wykonujemy poniższe komendy jako root:

dnf install -y "kernel-devel-$(uname -r)" "kernel-headers-$(uname -r)" https://github.com/freshautomations/efitools-centos/releases/download/2019-05-12/efitools-v1.9.2-1.x86_64.rpm https://github.com/freshautomations/efitools-centos/releases/download/2019-05-12/sbsigntools-v0.9.2-1.x86_64.rpm

rm -rf certs ; mkdir certs ; cd certs

openssl req -new -x509 -newkey rsa:4096 -subj "/CN=PKTEST/" -keyout PK.key -out PK.crt -days 38000 -nodes -sha256
openssl req -new -x509 -newkey rsa:4096 -subj "/CN=KEKTEST/" -keyout KEK.key -out KEK.crt -days 38000 -nodes -sha256
openssl req -new -x509 -newkey rsa:4096 -subj "/CN=dbTEST/" -keyout db.key -out db.crt -days 38000 -nodes -sha256

cert-to-efi-sig-list PK.crt PK.esl
sign-efi-sig-list -c PK.crt -k PK.key PK PK.esl PK.auth

cert-to-efi-sig-list KEK.crt KEK.esl
sign-efi-sig-list -c PK.crt -k PK.key KEK KEK.esl KEK.auth

cert-to-efi-sig-list db.crt db.esl
sign-efi-sig-list -c KEK.crt -k KEK.key db db.esl db.auth

efi-updatevar -f PK.auth PK
efi-updatevar -f KEK.auth KEK
efi-updatevar -f db.auth db

Trochę o pesign
Instalujemy narzędzie do podpisywania binarek - pesign - i dodajemy się do jego grupy.
sudo dnf install -y pesign
sudo usermod -a -G pesign $USER
(Wylogowujemy się i logujemy ponownie)

Generujemy certyfikaty i importujemy do tokena
Generujemy certyfikaty za pomocą skryptu https://github.com/rhboot/shim/blob/main/make-certs
TODO - opisać działanie skryptu
Wygenerowany plik .p12 importujemy do tokena komendą: pk12util -i *.p12 -d /etc/pki/pesign -h "HSM"

Budujemy shim-unsigned
Wrzucamy nasz certyfikat CA do katalogu źródeł shima-unsigned i budujemy za pomocą rpmbuild -ba *.spec

Podpisujemy shimx64.efi certyfikatami "fake-MS"
sbsign --key db.key --cert db.crt --output shimx64.efi.signed shimx64.efi

Budujemy shim-signed
Kopiujemy podpisany już plik shimx64.efi.signed do ~/rpmbuild/SOURCES z wypakowanymi źródłami shim-signed, nadając mu nazwę shimx64.efi.
Wrzucamy nasze certyfikaty (zwykły i CA) i budujemy za pomocą rpmbuild -ba *.spec

Budujemy GRUB2
GRUB2 należy zbrandować.
Edytujemy plik sbat.csv.in i dopisujemy swoje zmiany.
Podmieniamy certyfikaty Red Hata na nasze.
W pliku grub2.spec podmieniamy referencje Red Hata na nasze
W pliku grub.macros upewniamy się, że budujemy legacy modules i legacy common za ponocą makr:
%ifarch x86_64
%global with_efi_common 1
%global with_legacy_modules 1
%global with_legacy_common 1
%else
Następnie wykonujemy komendę:
rpmbuild --define 'pe_signing_token HSM' --define "pe_signing_cert LABEL_TWOJEGO_CERTYFIKATU" -ba *.spec

Budujemy kernel i jego moduły
Kernel należy najpierw zbrandować. Wykracza to poza obszar tego poradnika, natomiast warto zwrócić uwagę na plik x509.genkey, podmienić certyfikaty i referencje Red Hata na nasze.
Następnie wykonujemy komendę:
rpmbuild --define 'pe_signing_token HSM' --define "pe_signing_cert LABEL_TWOJEGO_CERTYFIKATU" -ba *.spec


Powrót na stronę główną