Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Cette procédure vous montre comment créer une AMI Linux avec un démarrage sécurisé de l’UEFI et des clés privées personnalisées. Amazon Linux prend en charge le démarrage sécurisé UEFI à partir de la version AL2 023 2023.1. Pour plus d'informations, consultez la section UEFI Secure Boot dans le guide de l'utilisateur AL2023.
Important
La procédure suivante est destinée uniquement aux utilisateurs avancés. Vous devez posséder une connaissance suffisante de SSL et du flux de démarrage de distribution Linux pour utiliser ces procédures.
Prérequis
-
Les outils suivants seront utilisés :
-
Votre instance Linux doit avoir été lancée avec une AMI Linux qui prend en charge le mode de démarrage UEFI et contient des données non volatiles.
Les instances nouvellement créées sans clés UEFI Secure Boot sont créées dans SetupMode
, ce qui vous permet d’inscrire vos propres clés. Certaines AMIs sont préconfigurées avec UEFI Secure Boot et vous ne pouvez pas modifier les clés existantes. Si vous souhaitez modifier les clés, vous devez créer une nouvelle AMI basée sur l’AMI d’origine.
Vous pouvez propager les clés dans le magasin de variables de deux manières, décrites dans les options A et B suivantes. L’option A décrit comment le faire depuis l’instance, en imitant le flux de matériel réel. L’option B décrit comment créer un blob binaire, qui est ensuite transmis en tant que fichier codé en base64 lorsque vous créez l’AMI. Pour les deux options, vous devez d’abord créer les trois paires de clés utilisées pour la chaîne de confiance.
Pour créer une AMI Linux prenant en charge le démarrage sécurisé de l’UEFI, créez d’abord les trois paires de clés, puis effectuez l’option A ou l’option B, mais pas les deux :
Étape 1
UEFI Secure Boot repose sur les trois bases de données de clés suivantes, qui sont utilisées dans une chaîne de confiance : la clé de plateforme (PK), la clé d’échange de clés (KEK) et la base de données de signatures (db).¹
Vous créez chaque clé sur l’instance. Pour préparer les clés publiques dans un format valide pour la norme UEFI Secure Boot, vous créez un certificat pour chaque clé. DER
définit le format SSL (codage binaire d’un format). Vous convertissez ensuite chaque certificat en liste de signatures UEFI, qui est le format binaire compris par UEFI Secure Boot. Enfin, vous signez chaque certificat avec la clé correspondante.
Tâches
Préparez-vous à créer les paires de clés
Avant de créer les paires de clés, créez un identifiant unique global (GUID) à utiliser lors de la génération de clés.
-
Exécutez la commande suivante dans un shell.
uuidgen --random > GUID.txt
Paire de clés 1 : créer la clé de plateforme (PK)
La PK est la fondation de la confiance pour les instances UEFI Secure Boot. La PK privée est utilisée pour mettre à jour la KEK, qui peut à son tour être utilisée pour ajouter des clés autorisées à la base de données de signatures (db).
La norme X.509 est utilisée pour créer la paire de clés. Pour plus d’informations sur la norme, veuillez consulter X.509
Pour créer la PK
-
Créez la clé. Vous devez nommer la variable
PK
.openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=
Platform key
/" -out PK.crtLes paramètres suivants sont spécifiés :
-
-keyout PK.key
: le fichier de clé privée. -
-days 3650
: le nombre de jours de validité du certificat. -
-out PK.crt
: le certificat utilisé pour créer la variable UEFI. -
CN=
: le nom commun (CN) de la clé. Vous pouvez saisir le nom de votre propre organisation à la place dePlatform key
Platform key
.
-
-
Créez le certificat.
openssl x509 -outform DER -in PK.crt -out PK.cer
-
Convertissez le certificat en liste de signatures UEFI.
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
-
Signez la liste de signatures UEFI avec la PK privée (auto-signée).
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
Paire de clés 2 : créer la clé d’échange de clés (KEK)
La KEK privée est utilisée pour ajouter des clés à la base de données, qui est la liste des signatures autorisées à démarrer sur le système.
Pour créer la KEK
-
Créez la clé.
openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
-
Créez le certificat.
openssl x509 -outform DER -in KEK.crt -out KEK.cer
-
Convertissez le certificat en liste de signatures UEFI.
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
-
Signez la liste de signatures avec la PK privée.
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
Paire de clés 3 : créez la base de données de signatures (db)
La liste db contient des clés autorisées qui sont habilitées à être démarrées sur le système. Pour modifier la liste, la KEK privée est nécessaire. Les images de démarrage seront signées avec la clé privée créée au cours de cette étape.
Pour créer la db
-
Créez la clé.
openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
-
Créez le certificat.
openssl x509 -outform DER -in db.crt -out db.cer
-
Convertissez le certificat en liste de signatures UEFI.
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
-
Signez la liste de signatures avec la KEK privée.
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
Signez l’image de démarrage (noyau) avec la clé privée
Pour Ubuntu 22.04, les images suivantes nécessitent des signatures.
/boot/efi/EFI/ubuntu/shimx64.efi
/boot/efi/EFI/ubuntu/mmx64.efi
/boot/efi/EFI/ubuntu/grubx64.efi
/boot/vmlinuz
Pour signer une image
Utilisez la syntaxe suivante pour signer une image.
sbsign --key db.key --cert db.crt --output
/boot/vmlinuz
/boot/vmlinuz
Note
Vous devez signer tous les nouveaux noyaux.
sera généralement un lien symbolique vers le dernier noyau installé./boot/vmlinuz
Reportez-vous à la documentation de votre distribution pour connaître votre chaîne de démarrage et les images requises.
¹ Merci à la ArchWiki communauté pour tout le travail qu'elle a accompli. Les commandes permettant de créer le PK, de créer le KEK, de créer la base de données et de signer l'image proviennent de la section Création de clés
Étape 2 (option A) : ajouter des clés au magasin de variables à partir de l’instance
Une fois que vous avez créé les trois paires de clés, vous pouvez vous connecter à votre instance et ajouter les clés au magasin de variables depuis l’instance en effectuant les étapes suivantes. Vous pouvez également suivre les étapes pourÉtape 2 (option B) : créer un blob binaire contenant un magasin de variables pré-rempli.
Étapes de l’option A :
Étape 1 : lancer une instance qui prend en charge le démarrage sécurisé de UEFI
Lorsque vous lancez une instance avec les conditions préalables suivantes, l’instance sera alors prête à être configurée pour prendre en charge UEFI Secure Boot. Vous pouvez uniquement activer la prise en charge de UEFI Secure Boot sur une instance au lancement. Vous ne pouvez pas l’activer ultérieurement.
Prérequis
-
AMI : l’AMI Linux doit prendre en charge le mode de démarrage UEFI. Pour vérifier que l’AMI prend en charge le mode de démarrage UEFI, le paramètre du mode de démarrage de l’AMI doit être uefi. Pour de plus amples informations, veuillez consulter Déterminer le paramètre du mode de démarrage d'une Amazon EC2 AMI.
Notez que AWS seul Linux est AMIs configuré pour prendre en charge l'UEFI pour les types d'instances basés sur Graviton. AWS ne fournit actuellement pas de système Linux x86_64 prenant en charge le mode de AMIs démarrage UEFI. Vous pouvez configurer votre propre AMI afin de prendre en charge le mode de démarrage UEFI pour toutes les architectures. Pour configurer votre propre AMI afin de prendre en charge le mode de démarrage UEFI, vous devez effectuer plusieurs étapes de configuration sur votre propre AMI Linux. Pour de plus amples informations, veuillez consulter Configurer le mode de démarrage d'une Amazon EC2 AMI.
-
Type d’instance : tous les types d’instances virtualisées prenant en charge UEFI prennent également en charge UEFI Secure Boot. Les types d’instance matériel nu ne prennent pas en charge UEFI Secure Boot. Pour connaître les types d’instances prenant en charge UEFI Secure Boot, consultez Conditions requises pour le mode de démarrage UEFI.
-
Lancez votre instance après la sortie d’UEFI Secure Boot. Seules les instances lancées après le 10 mai 2022 (lorsque UEFI Secure Boot a été publié) peuvent prendre en charge UEFI Secure Boot.
Une fois que vous avez lancé votre instance, vous pouvez vérifier qu’elle est prête à être configurée pour prendre en charge UEFI Secure Boot (en d’autres termes, vous pouvez passer à l’étape 2) en vérifiant si les données UEFI sont présentes. La présence de données UEFI indique que les données non volatiles sont persistantes.
Pour vérifier si votre instance est prête pour l’étape 2
Utilisation de la get-instance-uefi-data
aws ec2 get-instance-uefi-data --instance-id
i-1234567890abcdef0
L’instance est prête pour l’étape 2 si des données UEFI sont présentes dans la sortie. Si la sortie est vide, l’instance ne peut pas être configurée pour prendre en charge UEFI Secure Boot. Cela peut se produire si votre instance a été lancée avant que la prise en charge UEFI Secure Boot soit disponible. Lancez une nouvelle instance et réessayez.
Étape 2 : configurer une instance pour prendre en charge UEFI Secure Boot
Inscrivez les paires de clés dans votre magasin de variables UEFI sur l’instance
Avertissement
Vous devez signer vos images de démarrage après avoir inscrit les clés, sinon vous ne pourrez pas démarrer votre instance.
Après avoir créé les listes de signatures UEFI signées (PK
, KEK
et db
), elles doivent être inscrites dans le microprogramme UEFI.
Écriture dans la variable PK
n’est possible que si :
-
Aucune PK n’est encore inscrite, ce qui est indiqué si la variable
SetupMode
est1
. Pour vérifier cela, utilisez la commande suivante. La sortie est soit1
, soit0
.efivar -d -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode
-
La nouvelle PK est signée par la clé privée de la PK existante.
Pour inscrire les clés dans votre magasin de variables UEFI
Les commandes suivantes doivent être exécutées sur l’instance.
Si cette option SetupMode est activée (la valeur est1
), les clés peuvent être inscrites en exécutant les commandes suivantes sur l'instance :
[ec2-user ~]$
efi-updatevar -f db.auth db
[ec2-user ~]$
efi-updatevar -f KEK.auth KEK
[ec2-user ~]$
efi-updatevar -f PK.auth PK
Pour vérifier que UEFI Secure Boot est activé
Pour vérifier que le démarrage sécurisé de UEFI est activé, suivez les étapes de la section Vérifiez si une EC2 instance Amazon est activée pour le démarrage sécurisé UEFI.
Vous pouvez désormais exporter votre magasin de variables UEFI avec get-instance-uefi-data
Étape 3 : créer une AMI à partir de l’instance
Pour créer une AMI à partir de l'instance, vous pouvez utiliser la console ou l'CreateImage
API, la CLI ou SDKs. Pour des instructions sur l’utilisation de la console, consultez Créer une AMI basée sur Amazon EBS. Pour les instructions relatives à l'API, consultez CreateImage.
Note
L’API CreateImage
copie automatiquement le magasin de variables UEFI de l’instance vers l’AMI. La console utilise l’API CreateImage
. Une fois que vous lancez des instances à l’aide de cette AMI, elles auront le même magasin de variables UEFI.
Étape 2 (option B) : créer un blob binaire contenant un magasin de variables pré-rempli
Une fois que vous avez créé les trois paires de clés, vous pouvez créer un blob binaire contenant un magasin de variables prérempli contenant les clés Secure Boot UEFI. Vous pouvez également suivre les étapes pourÉtape 2 (option A) : ajouter des clés au magasin de variables à partir de l’instance.
Avertissement
Vous devez signer vos images de démarrage avant d’inscrire les clés, sinon vous ne pourrez pas démarrer votre instance.
Étapes de l’option B :
Étape 1 : créer un nouveau magasin de variables ou mettre à jour un stockage existant
Vous pouvez créer le magasin de variables hors ligne sans instance en cours d’exécution à l’aide de l’outil python-uefivars. L’outil peut créer un nouveau magasin de variables à partir de vos clés. Le script prend actuellement en charge le EDK2 format, le AWS format et une représentation JSON qui est plus facile à modifier avec des outils de niveau supérieur.
Pour créer le magasin de variables hors ligne sans instance en cours d’exécution
-
Téléchargez l’outil en cliquant sur le lien suivant.
https://github.com/awslabs/python-uefivars
-
Créez un nouveau magasin de variables à partir de vos clés en exécutant la commande suivante. Cela créera un blob binaire codé en base64 dans .bin.
your_binary_blob
L’outil prend également en charge la mise à jour d’un blob binaire via le paramètre-I
../uefivars.py -i none -o aws -O
your_binary_blob
.bin -P PK.esl -K KEK.esl --db db.esl --dbx dbx.esl
Étape 2 : charger le blob binaire lors de la création d’AMI
Utiliser register-image--uefi-data
, spécifiez votre blob binaire et pour le paramètre --boot-mode
, spécifiez uefi
.
aws ec2 register-image \ --name uefi_sb_tpm_register_image_test \ --uefi-data $(cat
your_binary_blob
.bin) \ --block-device-mappings "DeviceName=/dev/sda1,Ebs= {SnapshotId=snap-0123456789example
,DeleteOnTermination=true}" \ --architecture x86_64 \ --root-device-name /dev/sda1 \ --virtualization-type hvm \ --ena-support \ --boot-mode uefi