Fedora Workstation et Serveur

Fedora : Signer les modules noyau tiers kmod pour le Secure Boot

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction



Fedora Linux utilise des signatures numériques approuvées par l'UEFI Secure Boot. Les binaires du chargeur de démarrage (comme GRUB) et le noyau de Fedora sont signés avec des certificats reconnus par les clés de la plateforme UEFI préinstallées sur la plupart des ordinateurs. Par conséquent, il n'est pas nécessaire de désactiver le Secure Boot pour installer et utiliser Fedora Linux.

Cependant, les modules fournis sous forme d'akmods, livrés dans RPM Fusion par exemple tels que NVidia, Broadcom, VirtualBox, ... sont compilés sur la machine et ne sont pas signés. Ils ne sont pas chargés si le Secure Boot est actif (oui, Secure Boot empêche de charger des modules non signés, c'est son rôle).

Plutôt que de désactiver ce mécanisme de sécurité, nous allons voir comment générer notre certificat et nos clés de signature et les importer dans l'UEFI de la machine.

Tous les modules (de type akmod) seront ensuite automatiquement signés lors de la compilation sans intervention manuelle.

Pour info, akmod signifie Auto-Kernel Module. Akmod compile les modules du noyau au démarrage si un nouveau noyau est détecté et aucun module précompilé n'est disponible. Cela assure que les modules sont toujours disponibles, même après une mise à jour du noyau.

Prérequis



Toutes les manipulations seront réalisées avec les droits root.

Dans un premier temps, on installe les outils nécessaires pour la gestion des clés machines, et des modules akmods :
Code BASH :
dnf install kmodtool akmods mokutil openssl


Une fois fait, vous pouvez vérifier le statut du SecureBoot avec la commande :
Code BASH :
mokutil --sb-state


Sur ma machine, il est actif :
Code :
SecureBoot enabled


Exemple avec un module non signé



Cet exemple est pour la démonstration dans ce tutorien, ne l'installez pas si vous n'en avez pas le besoin !

Dans cet exemple, j'installe juste le module VirtualBox (qui n'est donc pas signé) :
Code BASH :
dnf install akmod-VirtualBox


Je compile dans la foulée le kmod :
Code BASH :
akmods


Lorsque j'essaie de charger le module :
Code BASH :
modprobe vboxdrv


J'ai une erreur car le module n'est pas signé et reconnu par ma machine :
Code :
modprobe: ERROR: could not insert 'vboxdrv': Key was rejected by service


Génération des certificats et clés



Dans un premier temps, on va générer un certificat et une paire de clés pour signer les modules :
Code BASH :
kmodgenca -a


L'option -a permet de générer avec des valeurs par défaut sans poser de questions.

Enregistrer les certificats et clés dans l'UEFI



Lançons l'import dans l'UEFI



On va ensuite enregistrer les éléments précédemment générés dans l'UEFI et le module Secure Boot.
Cela permettra au noyau Linux de faire confiance aux pilotes signés avec notre clé :
Code BASH :
mokutil --import /etc/pki/akmods/certs/public_key.der


On va devoir entrer un mot de passe.
Il n'a pas besoin d'être très long ou complexe. On en aura juste besoin pour importer la clé dans le secure boot.
Attention, on sera en qwerty pour la saisie, donc on fera simple !

Une fois fait, on va redémarrer le système :
Code BASH :
reboot


Validons l'import côté UEFI



Lorsque l'UEFI s'initialise, on est intercepté pour ajouter la clé en attente.

secureboot-mok1


On valide par Entrée

Ensuite :

secureboot-mok2


Sélectionner Enroll MOK

secureboot-mok3


Puis Continue

secureboot-mok4


Puis Yes

secureboot-mok5


On saisit le mot de passe renseigné précédemment (rappel on est en qwerty)

secureboot-mok6


Puis Reboot

Installer ou réinstaller des modules



Installer de nouveaux modules



Maintenant, tous les modules "akmods" seront compilés et signés automatiquement avec notre clé, que SecureBoot connait.

Réinstaller des modules existants



Si on avait déjà des modules installés, il suffit de forcer leur recompilation :
Code BASH :
akmods --rebuild  --force


Dans l'exemple de ce tuto avec le module VirtualBox :
Code :
Checking kmods exist for 6.9.8-200.fc40.x86_64             [  OK  ]
Building and installing VirtualBox-kmod                    [  OK  ]


On regénère aussi l'image initrd avec :
Code BASH :
dracut --force


Et enfin on reboot :
Code BASH :
reboot


Vérifier que les modules sont chargés



Si notre module est signé correctement, alors il est chargé par le système.

On pourra le constater avec la fameuse commande lsmod :
Code BASH :
lsmod | grep vbox


Ici, le module est bien chargé :
Code :
vboxdrv               704512  1