26.8. Signer des modules de noyau pour le démarrage sécurisé « Secure Boot »
26.8.1. Conditions préalables
Tableau 26.1. Outils requis
Outil | Fourni par le paquet | Utilisé sur | But |
---|---|---|---|
openssl | openssl | Système de génération | Génère une paire de clés X.509 publique et privée |
sign-file | kernel-devel | Système de génération | Script Perl utilisé pour signer les modules de noyau |
perl | perl | Système de génération | Interprète Perl utilisé pour exécuter le script de signature |
mokutil | mokutil | Système cible | Outil optionnel utilisé pour inscrire la clé publique manuellement |
keyctl | keyutils | Système cible | Outil optionnel utilisé pour afficher des clés publiques dans l'anneau de clés du système |
Note
26.8.2. Authentification du module de noyau
26.8.2.1. Sources de clés publiques utilisées pour authentifier des modules de noyau
Tableau 26.2. Sources pour les anneaux de clés système
Source des clés X.509 | Capacité de l'utilisateur à ajouter des clés | État UEFI Secure Boot | Clés chargées pendant le démarrage |
---|---|---|---|
Intégré au noyau | Non | - | .system_keyring |
UEFI Secure Boot "db" | Limité | Non activé | Non |
Activé | .system_keyring | ||
UEFI Secure Boot "dbx" | Limité | Non activé | Non |
Activé | .system_keyring | ||
Intégré au chargeur de démarrage shim.efi | Non | Non activé | Non |
Activé | .system_keyring | ||
Liste MOK (« Machine Owner Key ») | Oui | Non activé | Non |
Activé | .system_keyring |
keyctl
. Ci-dessous figure un exemple abbrévié d'un système Red Hat Enterprise Linux 7 sur lequel UEFI Secure Boot n'est pas activé.
~]# keyctl list %:.system_keyring
3 keys in keyring:
...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87...
...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b...
...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...
~]# keyctl list %:.system_keyring
6 keys in keyring:
...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87...
...asymmetric: Red Hat Secure Boot (CA key 1): 4016841644ce3a810408050766e8f8a29...
...asymmetric: Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed...
...asymmetric: Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e...
...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b...
...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...
Red Hat Secure Boot (CA key 1)
, qui est intégrée au chargeur de démarrage shim.efi
. Vous pouvez également chercher les messages de la console du noyau qui identifient les clés avec une source liée à UEFI Secure Boot, c'est-à-dire UEFI Secure Boot db, un shim intégré, et une liste MOK.
~]# dmesg | grep 'EFI: Loaded cert'
[5.160660] EFI: Loaded cert 'Microsoft Windows Production PCA 2011: a9290239...
[5.160674] EFI: Loaded cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309b...
[5.165794] EFI: Loaded cert 'Red Hat Secure Boot (CA key 1): 4016841644ce3a8...
26.8.2.2. Conditions préalables à l'authentification de modules de noyau
module.sig_enforce
a été spécifié, alors seuls les modules de noyau signés qui sont authentifiés à l'aide d'une clé sur l'anneau des clés du système pourront être chargés, à condition que la clé publique ne se trouve pas sur l'anneau des clés sur liste noire du système. Si UEFI Secure Boot est désactivé et si le paramètre de noyau module.sig_enforce
n'a pas été spécifié, alors les modules de noyau non-signés et les modules de noyau signés sans clé publique pourront être chargés. Ceci est résumé dans la Tableau 26.3, « Conditions préalables à l'authentification de modules de noyau pour effectuer un chargement ».
Tableau 26.3. Conditions préalables à l'authentification de modules de noyau pour effectuer un chargement
Module signé | Clé publique trouvée et signature valide | État UEFI Secure Boot | module.sig_enforce | Charge du module | Noyau avarié |
---|---|---|---|---|---|
Non signé | - | Non activé | Non activé | Réussi | Oui |
Non activé | Activé | Échoué | |||
Activé | - | Échoué | - | ||
Signé | Non | Non activé | Non activé | Réussi | Oui |
Non activé | Activé | Échoué | - | ||
Activé | - | Échoué | - | ||
Signé | Oui | Non activé | Non activé | Réussi | Non |
Non activé | Activé | Réussi | Non | ||
Activé | - | Réussi | Non |
26.8.3. Générer une paire de clés X.509 publique et privée
- L'outil
openssl
peut être utilisé pour générer une paire de clés qui satisfait les conditions préalables à la signature d'un module de noyau sur Red Hat Enterprise Linux 7. Certains des paramètres de cette requêtre de génération de clé sont mieux spécifiés à l'aide d'un fichier de configuration ; veuillez suivre l'exemple ci-dessous pour créer votre propre fichier de configuration.~]#
cat << EOF > configuration_file.config
[ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = myexts [ req_distinguished_name ] O = Organization CN = Organization signing key emailAddress = E-mail address [ myexts ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid EOF - Après avoir créé le fichier de configuration, vous pouvez créer une paire de clés X.509 publique et privée. La clé publique sera écrite sur le fichier
public_key.der
et la clé privée sera écrite sur le fichierprivate_key.priv
.~]#
openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \ -batch -config configuration_file.config -outform DER \ -out public_key.der \ -keyout private_key.priv
- Veuillez inscrire votre clé publique sur tous les systèmes sur lesquels vous souhaitez authentifier et charger votre module de noyau.
Avertissement
26.8.4. Inscrire une clé publique sur un système cible
26.8.4.1. Image du microprogramme d'usine, y compris la clé publique
26.8.4.2. Image d'inscription de clé exécutable ajoutant une clé publique
26.8.4.3. Administrateur systèmes ajoutant manuellement la clé publique à la liste MOK
mokutil
.
- Demandez l'ajout de votre clé publique à la liste MOK en utilisant un utilitaire d'espace utilisateur Red Hat Enterprise Linux 7 :
~]#
mokutil
--import
my_signing_key_pub.der
Il vous sera demandé de saisir et de confirmer un mot de passe pour cette requête d'inscription MOK. - Redémarrez la machine.
- La requête d'inscription de clé MOK en attente sera remarquée par
shim.efi
et lanceraMokManager.efi
afin de vous permettre de terminer l'inscription à partir de la console UEFI. Vous devrez saisir le mot de passe précédemment associé à cette requête et confirmer l'inscription. Votre clé publique est ajoutée à la liste MOK, qui est persistante.
26.8.5. Signer un module de noyau avec la clé privée
- Générez votre module
my_module.ko
de manière standard :~]#
make -C /usr/src/kernels/$(uname -r) M=$PWD modules
- Signez votre module de noyau avec votre clé privée. Ceci peut être fait avec un script Perl. Remarquez que le script requiert que les fichiers contenant la clé privée et la clé publique soient fournis, ainsi que le fichier du module de noyau que vous souhaitez signer.
~]#
perl /usr/src/kernels/$(uname -r)/scripts/sign-file \ sha256 \ my_signing_key.priv \ my_signing_key_pub.der \ my_module.ko
my_module.ko
. L'utilitaire modinfo
peut être utilisé pour afficher des informations sur la signature du module du noyau, si elle est présente. Pour obtenir des informations sur l'utilisation de l'utilitaire, veuillez consulter la Section 26.2, « Afficher des informations sur un module ».
readelf
ne seront pas en mesure d'afficher la signature sur votre module de noyau.
26.8.6. Charger un module de noyau signé
mokutil
pour ajouter votre clé publique à la liste MOK et vous chargerez votre module de noyau manuellement avec modprobe
.
- Optionnellement, vous pouvez vérifier que votre module de noyau ne se charge pas avant d'avoir inscrit la clé publique. Premièrement, veuillez vérifier quelles clés ont été ajoutées à l'anneau des clés du système lors du démarrage actuel en exécutant la commande
keyctl list %:.system_keyring
en tant qu'utilisateur root. Comme votre clé publique n'a pas encore été inscrite, elle ne sera pas affichée dans la sortie de la commande. - Demander l'inscription de votre clé publique.
~]#
mokutil --import my_signing_key_pub.der
- Redémarrez et terminez l'inscription sur la console UEFI.
~]#
reboot
- Après les redémarrages système, veuillez vérifier à nouveau les clés sur l'anneau des clés du système.
~]#
keyctl list %:.system_keyring
- Vous devriez désormais être en mesure de charger votre module de noyau.
~]#
modprobe -v my_module
insmod /lib/modules/3.10.0-123.el7.x86_64/extra/my_module.ko ~]#lsmod | grep my_module
my_module 12425 0