Création d'un système Linux AMI avec des clés de démarrage UEFI sécurisées personnalisées - Amazon Elastic Compute Cloud

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.

Création d'un système Linux AMI avec des clés de démarrage UEFI sécurisées personnalisées

Cette procédure explique comment créer un système Linux AMI avec UEFI Secure Boot et des clés privées personnalisées. Amazon Linux prend en charge le démarrage UEFI sécurisé à partir de la version AL2 023 2023.1. Pour plus d'informations, voir UEFISecure Boot dans le guide de l'utilisateur AL2 023.

Important

La procédure suivante s'adresse uniquement aux utilisateurs expérimentés. Vous devez avoir une connaissance suffisante du flux SSL de démarrage des distributions Linux pour utiliser ces procédures.

Prérequis

Les instances nouvellement créées sans clés de démarrage UEFI sécurisé sont créées dansSetupMode, 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 en créer une nouvelle sur la AMI base de l'originalAMI.

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 sous forme de fichier codé en base64 lorsque vous créez le. 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 un système Linux AMI compatible avec le démarrage UEFI sécurisé, créez d'abord les trois paires de clés, puis complétez l'option A ou l'option B, mais pas les deux :

    UEFISecure Boot est basé sur les trois bases de données clés suivantes, qui sont utilisées dans une chaîne de confiance : la clé de plate-forme (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 devez créer un certificat pour chaque clé. DERdéfinit le SSL format (encodage binaire d'un format). Vous convertissez ensuite chaque certificat en une liste de UEFI signatures, qui est le format binaire compris par UEFI Secure Boot. Enfin, vous signez chaque certificat avec la clé correspondante.

    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.

    1. Connectez-vous à l’instance.

    2. Exécutez la commande suivante dans un shell.

      uuidgen --random > GUID.txt

    Paire de clés 1 : créer la clé de plateforme (PK)

    Le PK est à l'origine de la confiance pour les instances UEFI Secure Boot. Le PK privé est utilisé pour mettre à jour leKEK, qui peut à son tour être utilisé 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 sur Wikipédia.

    Pour créer la PK
    1. 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.crt

      Les 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 UEFI variable.

      • CN=Platform key : le nom commun (CN) de la clé. Vous pouvez saisir le nom de votre propre organisation au lieu de Platform key.

    2. Créez le certificat.

      openssl x509 -outform DER -in PK.crt -out PK.cer
    3. Convertissez le certificat en liste de UEFI signatures.

      cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
    4. Signez la liste de UEFI signatures avec le PK privé (auto-signé).

      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)

    Le private KEK est utilisé pour ajouter des clés à la base de données, qui est la liste des signatures autorisées pour démarrer sur le système.

    Pour créer le KEK
    1. 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
    2. Créez le certificat.

      openssl x509 -outform DER -in KEK.crt -out KEK.cer
    3. Convertissez le certificat en liste de UEFI signatures.

      cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
    4. 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, le privé KEK 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
    1. 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
    2. Créez le certificat.

      openssl x509 -outform DER -in db.crt -out db.cer
    3. Convertissez le certificat en liste de UEFI signatures.

      cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
    4. Signez la liste de signatures avec le privéKEK.

      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. /boot/vmlinuz crée généralement un lien symbolique vers le dernier noyau installé.

    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 leKEK, de créer la base de données et de signer l'image proviennent de la section Création de clés, rédigée par l'équipe de ArchWiki maintenance et/ou les ArchWiki contributeurs.

    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.

    Étape 1 : Lancer une instance qui prendra en charge le démarrage UEFI sécurisé

    Lorsque vous lancez une instance avec les prérequis suivants, l'instance sera alors prête à être configurée pour prendre en charge le démarrage UEFI sécurisé. Vous ne pouvez activer la prise en charge du démarrage UEFI sécurisé sur une instance qu'au lancement ; vous ne pourrez pas l'activer ultérieurement.

    Prérequis
    • AMI— Le Linux AMI doit prendre en charge le mode de UEFI démarrage. Pour vérifier que le mode de UEFI démarrage est pris AMI en charge, le paramètre du mode de AMI démarrage doit être uefi. Pour de plus amples informations, veuillez consulter Déterminer le paramètre du mode de démarrage d'un Amazon EC2 AMI.

      Notez que Linux est AWS uniquement AMIs configuré pour prendre en charge UEFI les types d'instances basés sur Graviton. AWS ne fournit actuellement pas de Linux x86_64 prenant en charge UEFI le mode de AMIs démarrage. Vous pouvez configurer le vôtre AMI pour prendre en charge le mode de UEFI démarrage pour toutes les architectures. Pour configurer le vôtre AMI afin de prendre en charge le mode de UEFI démarrage, vous devez effectuer vous-même un certain nombre d'étapes de configurationAMI. Pour de plus amples informations, veuillez consulter Définir le mode de démarrage d'un Amazon EC2 AMI.

    • Type d'instance : tous les types d'instances virtualisées compatibles prennent UEFI également en charge le démarrage UEFI sécurisé. Les types d'instances bare metal ne prennent pas en charge le démarrage UEFI sécurisé. Pour les types d'instances qui prennent en charge le démarrage UEFI sécurisé, consultezExigences relatives au mode de UEFI démarrage.

    • Lancez votre instance après la sortie de UEFI Secure Boot. Seules les instances lancées après le 10 mai 2022 (date de sortie de UEFI Secure Boot) peuvent prendre en charge le démarrage UEFI sécurisé.

    Après avoir lancé votre instance, vous pouvez vérifier qu'elle est prête à être configurée pour prendre en charge le démarrage UEFI sécurisé (en d'autres termes, vous pouvez passer à l'étape 2) en vérifiant si UEFI des données sont présentes. La présence de UEFI données indique que les données non volatiles sont persistantes.

    Pour vérifier si votre instance est prête pour l’étape 2

    Utilisez la commande get-instance-uefi-data et spécifiez l’ID de l’instance.

    aws ec2 get-instance-uefi-data --instance-id i-0123456789example

    L'instance est prête pour l'étape 2 si UEFI des données sont présentes dans la sortie. Si la sortie est vide, l'instance ne peut pas être configurée pour prendre en charge le démarrage UEFI sécurisé. Cela peut se produire si votre instance a été lancée avant que le support UEFI Secure Boot ne soit disponible. Lancez une nouvelle instance et réessayez.

    Étape 2 : configurer une instance pour prendre en charge le démarrage UEFI sécurisé

    Inscrivez les paires de clés dans votre magasin de UEFI variables 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 UEFI signatures signées (PKKEK,, etdb), elles doivent être inscrites dans le UEFI microprogramme.

    Écriture dans la variable PK n’est possible que si :

    • Aucune PK n’est encore inscrite, ce qui est indiqué si la variable SetupMode est 1. Pour vérifier cela, utilisez la commande suivante. La sortie est soit 1, soit 0.

      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 enregistrer les clés dans votre magasin UEFI variable

    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 le démarrage UEFI sécurisé est activé

    Pour vérifier que le démarrage UEFI sécurisé est activé, suivez les étapes décrites dansVérifiez si une EC2 instance Amazon est activée pour le démarrage UEFI sécurisé.

    Vous pouvez désormais exporter votre répertoire de UEFI variables à l'aide de la get-instance-uefi-dataCLIcommande, ou vous pouvez passer à l'étape suivante et signer vos images de démarrage pour redémarrer sur une instance compatible UEFI Secure Boot.

    Étape 3 : créer un AMI à partir de l'instance

    Pour créer une instance AMI à partir de l'instance, vous pouvez utiliser la console ou le CreateImage APICLI, ouSDKs. Pour des instructions sur l’utilisation de la console, consultez Créez un compte soutenu EBS par Amazon AMI. Pour les API instructions, voir CreateImage.

    Note

    copie CreateImage API automatiquement le magasin de UEFI variables de l'instance dans leAMI. La console utilise le CreateImageAPI. Une fois que vous aurez lancé des instances à l'aide de cette optionAMI, les instances disposeront du même magasin de UEFI variables.

    Après avoir créé les trois paires de clés, vous pouvez créer un blob binaire contenant une banque de variables préremplie contenant les clés de démarrage UEFI sécurisé.

    Avertissement

    Vous devez signer vos images de démarrage avant d’inscrire les clés, sinon vous ne pourrez pas démarrer votre instance.

    É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 JSON représentation 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
    1. Téléchargez l’outil en cliquant sur le lien suivant.

      https://github.com/awslabs/python-uefivars
    2. 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 your_binary_blob.bin. 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 : Téléchargez le blob binaire lors AMI de sa création

    register-imageÀ utiliser pour transmettre les données UEFI variables de votre magasin. Pour le paramètre --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