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?
- virt-manager + libvirt + KVM + QEMU
- obraz instalacyjny systemu Enterprise Linux 8
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ą