Fedora : Signer les modules noyau tiers kmod pour le Secure Boot
Table des matières
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.
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 :
Une fois fait, vous pouvez vérifier le statut du SecureBoot avec la commande :
Sur ma machine, il est actif :
Dans cet exemple, j'installe juste le module VirtualBox (qui n'est donc pas signé) :
Je compile dans la foulée le kmod :
Lorsque j'essaie de charger le module :
J'ai une erreur car le module n'est pas signé et reconnu par ma machine :
Dans un premier temps, on va générer un certificat et une paire de clés pour signer les modules :
L'option -a permet de générer avec des valeurs par défaut sans poser de questions.
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é :
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 :
Lorsque l'UEFI s'initialise, on est intercepté pour ajouter la clé en attente.
On valide par Entrée
Ensuite :
Sélectionner Enroll MOK
Puis Continue
Puis Yes
On saisit le mot de passe renseigné précédemment (rappel on est en qwerty)
Puis Reboot
Maintenant, tous les modules "akmods" seront compilés et signés automatiquement avec notre clé, que SecureBoot connait.
Si on avait déjà des modules installés, il suffit de forcer leur recompilation :
Dans l'exemple de ce tuto avec le module VirtualBox :
On regénère aussi l'image initrd avec :
Et enfin on reboot :
Si notre module est signé correctement, alors il est chargé par le système.
On pourra le constater avec la fameuse commande lsmod :
Ici, le module est bien chargé :
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é
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
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
Lorsque l'UEFI s'initialise, on est intercepté pour ajouter la clé en attente.
On valide par Entrée
Ensuite :
Sélectionner Enroll MOK
Puis Continue
Puis Yes
On saisit le mot de passe renseigné précédemment (rappel on est en qwerty)
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