fix(fws-secureboot-setup): update grub bootloader id to FWS and sign all firmware boot paths

Change GRUB bootloader identity from GRUB to FWS to match kickstart configuration.

Add signing of both primary (\EFI\FWS\grubx64.efi) and fallback removable
(\EFI\BOOT\BOOTX64.EFI) boot paths, as these are the paths actually loaded
by the firmware.

Extract GRUB_MODULES to a variable for reuse in both standard and removable
installation commands. Add objdump availability check before attempting SBAT
verification. Add sbat.csv existence check before reinstalling GRUB.
This commit is contained in:
2026-07-08 23:56:10 +02:00
parent 3b47ef30e7
commit e69c071969
@@ -26,21 +26,32 @@ die() { printf '\e[31m[ERREUR] %s\e[0m\n' "$*"; exit 1; }
command -v sbctl >/dev/null 2>&1 || { log "Installation de sbctl…"; pacman -S --noconfirm --needed sbctl || die "sbctl introuvable (réseau ?)"; } command -v sbctl >/dev/null 2>&1 || { log "Installation de sbctl…"; pacman -S --noconfirm --needed sbctl || die "sbctl introuvable (réseau ?)"; }
command -v objdump >/dev/null 2>&1 || pacman -S --noconfirm --needed binutils || true command -v objdump >/dev/null 2>&1 || pacman -S --noconfirm --needed binutils || true
# Localiser l'ESP et grubx64.efi (layout Arch : /boot/efi ; layout /boot-ESP : /boot). # Localiser l'ESP et grubx64.efi. IDENTITÉ = FWS, cohérente avec le kickstart
# install_grub (--bootloader-id=FWS + --removable → \EFI\FWS\ ET \EFI\BOOT\).
# Signer un \EFI\GRUB\ séparé ne servirait à RIEN : le firmware charge \EFI\FWS\
# (ou le secours \EFI\BOOT\BOOTX64.EFI) → ce sont EUX qu'il faut signer.
ESP_DIR=/boot/efi; [ -d "$ESP_DIR/EFI" ] || ESP_DIR=/boot ESP_DIR=/boot/efi; [ -d "$ESP_DIR/EFI" ] || ESP_DIR=/boot
GRUB_EFI="$ESP_DIR/EFI/GRUB/grubx64.efi" GRUB_EFI="$ESP_DIR/EFI/FWS/grubx64.efi"
[ -f "$GRUB_EFI" ] || GRUB_EFI="$(find "$ESP_DIR/EFI" -iname 'grubx64.efi' 2>/dev/null | head -1)" [ -f "$GRUB_EFI" ] || GRUB_EFI="$(find "$ESP_DIR/EFI" -iname 'grubx64.efi' 2>/dev/null | head -1)"
[ -n "$GRUB_EFI" ] && [ -f "$GRUB_EFI" ] || die "grubx64.efi introuvable sous $ESP_DIR/EFI" [ -n "$GRUB_EFI" ] && [ -f "$GRUB_EFI" ] || die "grubx64.efi introuvable sous $ESP_DIR/EFI"
BOOTX64="$ESP_DIR/EFI/BOOT/BOOTX64.EFI" # chemin de secours removable (à signer aussi)
# 1) GRUB doit embarquer SBAT (+ shim_lock), sinon shim refusera de le charger. # 1) GRUB doit embarquer SBAT (+ shim_lock), sinon shim refusera de le charger.
# Un grub-install « nu » produit un binaire sans .sbat → on réinstalle. # Un grub-install « nu » produit un binaire sans .sbat → on réinstalle EN FWS
if ! objdump -h "$GRUB_EFI" 2>/dev/null | grep -q '\.sbat'; then # (et on régénère le secours removable \EFI\BOOT\BOOTX64.EFI avec le même SBAT).
warn "grubx64.efi sans section .sbat → réinstallation de GRUB (avec --sbat + modules)." if ! command -v objdump >/dev/null 2>&1; then
grub-install --target=x86_64-efi --efi-directory="$ESP_DIR" --bootloader-id=GRUB \ warn "objdump (binutils) absent → SBAT non vérifiable, réinstallation de GRUB SAUTÉE (on suppose GRUB déjà correct)."
--sbat /usr/share/grub/sbat.csv \ elif ! objdump -h "$GRUB_EFI" 2>/dev/null | grep -q '\.sbat'; then
--modules='normal search part_gpt part_msdos fat ext2 configfile linux echo test true loadenv all_video efi_gop tpm' \ [ -f /usr/share/grub/sbat.csv ] || die "sbat.csv introuvable — impossible d'ajouter SBAT"
|| die "grub-install a échoué" warn "grubx64.efi sans section .sbat → réinstallation de GRUB (--bootloader-id=FWS + --sbat)."
GRUB_EFI="$ESP_DIR/EFI/GRUB/grubx64.efi" GRUB_MODULES='normal search part_gpt part_msdos fat ext2 configfile linux echo test true loadenv all_video efi_gop tpm'
grub-install --target=x86_64-efi --efi-directory="$ESP_DIR" --bootloader-id=FWS \
--sbat /usr/share/grub/sbat.csv --modules="$GRUB_MODULES" \
|| die "grub-install (FWS) a échoué"
grub-install --target=x86_64-efi --efi-directory="$ESP_DIR" --bootloader-id=FWS --removable \
--sbat /usr/share/grub/sbat.csv --modules="$GRUB_MODULES" \
|| warn "grub-install --removable (secours) a échoué"
GRUB_EFI="$ESP_DIR/EFI/FWS/grubx64.efi"
objdump -h "$GRUB_EFI" 2>/dev/null | grep -q '\.sbat' || die "SBAT toujours absent après réinstallation" objdump -h "$GRUB_EFI" 2>/dev/null | grep -q '\.sbat' || die "SBAT toujours absent après réinstallation"
grub-mkconfig -o /boot/grub/grub.cfg 2>/dev/null || true grub-mkconfig -o /boot/grub/grub.cfg 2>/dev/null || true
fi fi
@@ -56,9 +67,11 @@ log "Enrôlement des clés (avec Microsoft)…"
sbctl enroll-keys --microsoft \ sbctl enroll-keys --microsoft \
|| warn "enroll-keys a échoué (firmware pas en Setup Mode ?) — à refaire une fois en Setup Mode." || warn "enroll-keys a échoué (firmware pas en Setup Mode ?) — à refaire une fois en Setup Mode."
# 4) Signer GRUB + noyau(x) présents. # 4) Signer les TROIS chemins réellement chargés par le firmware + les noyaux :
log "Signature de GRUB et des noyaux…" # \EFI\FWS\grubx64.efi, le secours \EFI\BOOT\BOOTX64.EFI, et chaque vmlinuz.
sbctl sign -s "$GRUB_EFI" || die "signature de GRUB échouée" log "Signature de GRUB (FWS + secours removable) et des noyaux…"
sbctl sign -s "$GRUB_EFI" || die "signature de $GRUB_EFI échouée"
[ -f "$BOOTX64" ] && { sbctl sign -s "$BOOTX64" || warn "signature de $BOOTX64 échouée"; }
for k in /boot/vmlinuz-linux /boot/vmlinuz-linux-lts /boot/vmlinuz-linux-zen /boot/vmlinuz-linux-hardened; do for k in /boot/vmlinuz-linux /boot/vmlinuz-linux-lts /boot/vmlinuz-linux-zen /boot/vmlinuz-linux-hardened; do
[ -f "$k" ] && { sbctl sign -s "$k" || warn "signature de $k échouée"; } [ -f "$k" ] && { sbctl sign -s "$k" || warn "signature de $k échouée"; }
done done