

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Ein Linux-AMI mit benutzerdefinierten UEFI-Secure-Boot-Schlüsseln erstellen
<a name="create-ami-with-uefi-secure-boot"></a>

Diese Anleitung zeigt Ihnen, wie Sie ein Linux-AMI mit UEFI Secure Boot und benutzerdefinierten privaten Schlüsseln erstellen. Amazon Linux unterstützt UEFI Secure Boot ab AL2023 Version 2023.1. Weitere Informationen finden Sie unter [UEFI Secure Boot on AL2023](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html) im *Amazon Linux 2023-Benutzerhandbuch*.

**Wichtig**  
Das folgende Verfahren ist nur für **fortgeschrittene Benutzer** vorgesehen. Sie müssen über ausreichende Kenntnisse im Bootflow der SSL- und Linux-Distribution verfügen, um diese Verfahren verwenden zu können.

**Voraussetzungen**
+ Die folgenden Tools werden verwendet:
  + OpenSSL – [https://www.openssl.org/](https://www.openssl.org/)
  + [efivar — efivar https://github.com/rhboot/](https://github.com/rhboot/efivar)
  + [efitools — https://git.kernel. org/pub/scm/linux/kernel/git/jejb/efitools.git/](https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git/)
  + [get-instance-uefi-data](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) command
+ Ihre Linux-Instance muss mit einem Linux-AMI gestartet worden sein, das den UEFI-Startmodus unterstützt und es müssen nichtflüchtige Daten vorhanden sein.

Neu erstellte Instances ohne UEFI Secure Boot-Schlüssel werden in `SetupMode` erstellt, wodurch Sie Ihre eigenen Schlüssel registrieren können. Einige AMIs sind mit UEFI Secure Boot vorkonfiguriert und Sie können die vorhandenen Schlüssel nicht ändern. Wenn Sie die Schlüssel ändern möchten, müssen Sie ein neues AMI basierend auf dem ursprünglichen AMI erstellen.

Sie haben zwei Möglichkeiten, die Schlüssel im Variablenspeicher zu propagieren, die in den folgenden Optionen A und B beschrieben sind. Option A beschreibt, wie dies innerhalb der Instance geschieht und den Fluss echter Hardware nachahmt. Option B beschreibt, wie ein binäres Blob erstellt wird, das dann als base64-kodierte Datei übergeben wird, wenn Sie das AMI erstellen. Für beide Optionen müssen Sie zuerst die drei Schlüsselpaare erstellen, die für die Vertrauenskette verwendet werden.

**Topics**
+ [Aufgabe 1: Schlüsselpaare erstellen](#uefi-secure-boot-create-three-key-pairs)
+ [Aufgabe 2 – Option A: Fügen Sie innerhalb der Instance Schlüssel zum Variablenspeicher hinzu](#uefi-secure-boot-optionA)
+ [Aufgabe 2 – Option B: Erstellen Sie ein binäres Blob mit einem vorgefüllten Variablenspeicher](#uefi-secure-boot-optionB)

## Aufgabe 1: Schlüsselpaare erstellen
<a name="uefi-secure-boot-create-three-key-pairs"></a>

UEFI Secure Boot basiert auf den folgenden drei Schlüsseldatenbanken, die in einer Vertrauenskette verwendet werden: dem Plattformschlüssel (PK), dem Schlüsselaustauschschlüssel (KEK) und der Signaturdatenbank (db).¹

Sie erstellen jeden Schlüssel auf der Instance. Um die öffentlichen Schlüssel in einem Format vorzubereiten, das für den UEFI Secure Boot-Standard gültig ist, erstellen Sie für jeden Schlüssel ein Zertifikat. `DER` definiert das SSL-Format (Binärkodierung eines Formats). Anschließend konvertieren Sie jedes Zertifikat in eine UEFI-Signaturliste, bei der es sich um das Binärformat handelt, das von UEFI Secure Boot verstanden wird. Und schließlich signieren Sie jedes Zertifikat mit dem entsprechenden Schlüssel.

**Topics**
+ [Bereiten Sie die Erstellung der Schlüsselpaare vor](#uefisb-prepare-to-create-key-pairs)
+ [Schlüsselpaar 1: Erstellen Sie den Plattformschlüssel (PK)](#uefisb-create-key-pair-1)
+ [Schlüsselpaar 2: Erstellen Sie den Schlüsselaustauschschlüssel (KEK)](#uefisb-create-key-pair-2)
+ [Schlüsselpaar 3: Erstellen Sie die Signaturdatenbank (db)](#uefisb-create-key-pair-3)
+ [Signieren Sie das Boot-Image (Kernel) mit dem privaten Schlüssel.](#uefi-secure-boot-sign-kernel)

### Bereiten Sie die Erstellung der Schlüsselpaare vor
<a name="uefisb-prepare-to-create-key-pairs"></a>

Erstellen Sie vor dem Erstellen der Schlüsselpaare einen global eindeutigen Bezeichner (GUID), der bei der Schlüsselgenerierung verwendet werden soll.

1. [Stellen Sie eine Verbindung zur Instance her.](connect.md)

1. Führen Sie in der Eingabeaufforderung einen Shell-Befehl aus.

   ```
   uuidgen --random > GUID.txt
   ```

### Schlüsselpaar 1: Erstellen Sie den Plattformschlüssel (PK)
<a name="uefisb-create-key-pair-1"></a>

Der PK ist der Vertrauensanker für UEFI Secure Boot-Instances. Die private PK wird verwendet, um den KEK zu aktualisieren, der wiederum dazu verwendet werden kann, autorisierte Schlüssel zur Signaturdatenbank (db) hinzuzufügen.

Der X.509-Standard wird zum Erstellen des Schlüsselpaars verwendet. Informationen zum Standard finden Sie unter [X.509](https://en.wikipedia.org/wiki/X.509) auf *Wikipedia*.

**So erstellen Sie den PK**

1. Erstellen Sie den Schlüssel. Sie müssen die Variable `PK` benennen.

   ```
   openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=Platform key/" -out PK.crt
   ```

   Die folgenden Parameter werden angegeben:
   + `-keyout PK.key` – Die private Schlüsseldatei.
   + `-days 3650` – Die Anzahl der Tage, an denen das Zertifikat gültig ist.
   + `-out PK.crt` – Das Zertifikat, das zum Erstellen der UEFI-Variablen verwendet wird.
   + `CN=Platform key` – Der gemeinsame Name (common name, CN) für den Schlüssel. Sie können stattdessen den Namen Ihrer eigenen Organisation eingeben. *Platform key*

1. Erstellen Sie das Zertifikat.

   ```
   openssl x509 -outform DER -in PK.crt -out PK.cer
   ```

1. Wandeln Sie das Zertifikat in eine UEFI-Signaturliste um.

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
   ```

1. Signieren Sie die UEFI-Signaturliste mit dem privaten PK (selbstsigniert).

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
   ```

### Schlüsselpaar 2: Erstellen Sie den Schlüsselaustauschschlüssel (KEK)
<a name="uefisb-create-key-pair-2"></a>

Der private KEK wird verwendet, um Schlüssel zur Datenbank hinzuzufügen, was die Liste der autorisierten Signaturen darstellt, die im System gestartet werden sollen. 

**So erstellen Sie den KEK**

1. Erstellen Sie den Schlüssel.

   ```
   openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
   ```

1. Erstellen Sie das Zertifikat.

   ```
   openssl x509 -outform DER -in KEK.crt -out KEK.cer
   ```

1. Wandeln Sie das Zertifikat in eine UEFI-Signaturliste um.

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
   ```

1. Signieren Sie die Signaturliste mit dem privaten PK.

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
   ```

### Schlüsselpaar 3: Erstellen Sie die Signaturdatenbank (db)
<a name="uefisb-create-key-pair-3"></a>

Die db-Liste enthält autorisierte Schlüssel, die zum Booten auf dem System autorisiert sind. Um die Liste zu ändern, ist der private KEK erforderlich. Boot-Images werden mit dem privaten Schlüssel signiert, der in diesem Schritt erstellt wird.

**So erstellen Sie den db**

1. Erstellen Sie den Schlüssel.

   ```
   openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
   ```

1. Erstellen Sie das Zertifikat.

   ```
   openssl x509 -outform DER -in db.crt -out db.cer
   ```

1. Wandeln Sie das Zertifikat in eine UEFI-Signaturliste um.

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
   ```

1. Signieren Sie die Signaturliste mit dem privaten KEK.

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
   ```

### Signieren Sie das Boot-Image (Kernel) mit dem privaten Schlüssel.
<a name="uefi-secure-boot-sign-kernel"></a>

Für Ubuntu 22.04 erfordern die folgenden Images Signaturen.

```
/boot/efi/EFI/ubuntu/shimx64.efi
/boot/efi/EFI/ubuntu/mmx64.efi
/boot/efi/EFI/ubuntu/grubx64.efi
/boot/vmlinuz
```

**So signieren Sie ein Image**  
Verwenden Sie die folgende Syntax, um ein Image zu signieren.

```
sbsign --key db.key --cert db.crt --output /boot/vmlinuz /boot/vmlinuz
```

**Anmerkung**  
Sie müssen alle neuen Kernel signieren. *`/boot/vmlinuz`* wird normalerweise einen Link zum zuletzt installierten Kernel führen.

In der Dokumentation Ihrer Distribution erfahren Sie mehr über Ihre Bootchain und die erforderlichen Images.

¹ Vielen Dank an die ArchWiki Community für all die Arbeit, die sie geleistet hat. Die Befehle zum Erstellen des PK, zum Erstellen des KEK, zum Erstellen der Datenbank und zum Signieren des Images stammen aus [Creating keys](https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Creating_keys), das vom ArchWiki Wartungsteam and/or und den Mitwirkenden verfasst wurde. ArchWiki 

## Aufgabe 2 – Option A: Fügen Sie innerhalb der Instance Schlüssel zum Variablenspeicher hinzu
<a name="uefi-secure-boot-optionA"></a>

Nachdem Sie die [drei Schlüsselpaare](#uefi-secure-boot-create-three-key-pairs) erstellt haben, können Sie eine Verbindung zu Ihrer Instance herstellen und die Schlüssel innerhalb der Instance zum Variablenspeicher hinzufügen, indem Sie die folgenden Schritte ausführen. Führen Sie alternativ die Schritte unter [Aufgabe 2 – Option B: Erstellen Sie ein binäres Blob mit einem vorgefüllten Variablenspeicher](#uefi-secure-boot-optionB) aus.

**Topics**
+ [Schritt 1: Starten Sie eine Instance mit UEFI Secure Boot-Unterstützung](#step1-launch-uefi-sb)
+ [Schritt 2: Konfigurieren Sie eine Instance zur Unterstützung von UEFI Secure Boot](#step2-launch-uefi-sb)
+ [Schritt 3: Erstellen eines AMI Ihrer Instance](#step3-launch-uefi-sb)

### Schritt 1: Starten Sie eine Instance mit UEFI Secure Boot-Unterstützung
<a name="step1-launch-uefi-sb"></a>

Wenn Sie mit den folgenden Voraussetzungen [eine Instance starten](LaunchingAndUsingInstances.md), kann die Instance dann für die Unterstützung von UEFI Secure Boot konfiguriert werden. Sie können die Unterstützung für UEFI Secure Boot nur für eine Instance beim Start aktivieren; Sie können sie später nicht aktivieren.

**Voraussetzungen**
+ **AMI** – Das Linux-AMI muss den UEFI-Startmodus unterstützen. Um zu überprüfen, ob das AMI den UEFI-Startmodus unterstützt, muss der AMI-Startmodus-Parameter **uefi** sein. Weitere Informationen finden Sie unter [Den Bootmodus-Parameter für ein Amazon-EC2-AMI bestimmen](ami-boot-mode.md).

  Beachten Sie, dass AWS nur Linux AMIs so konfiguriert ist, dass es UEFI für Graviton-basierte Instance-Typen unterstützt. AWS stellt derzeit kein x86\$164-Linux AMIs bereit, das den UEFI-Boot-Modus unterstützt. Sie können Ihr eigenes AMI so konfigurieren, dass es den UEFI-Boot-Modus für alle Architekturen unterstützt. Um ein Ihren eigenes AMI für die Unterstützung des UEFI-Startmodus zu konfigurieren, müssen Sie eine Reihe von Konfigurationsschritten auf Ihrem eigenen AMI durchführen. Weitere Informationen finden Sie unter [Den Bootmodus eines Amazon-EC2-AMIs festlegen](set-ami-boot-mode.md).
+ **Instance-Typ** – Alle virtualisierten Instance-Typen, die UEFI unterstützen, unterstützen auch UEFI Secure Boot. Bare-Metal-Instance-Typen unterstützen UEFI Secure Boot nicht. Informationen zu den Instance-Typen, die UEFI Secure Boot unterstützen, finden Sie unter [Anforderungen für den UEFI-Bootmodus](launch-instance-boot-mode.md).
+ Starten Sie Ihre Instance nach dem Veröffentlichen von UEFI Secure Boot. Nur Instances, die nach dem 10. Mai 2022 (als UEFI Secure Boot veröffentlicht wurde) gestartet wurden, können UEFI Secure Boot unterstützen.

Nachdem Sie Ihre Instance gestartet haben, können Sie überprüfen, ob sie für die Unterstützung von UEFI Secure Boot konfiguriert werden kann (mit anderen Worten, Sie können mit [Schritt 2](#step2-launch-uefi-sb) fortfahren), indem Sie prüfen, ob UEFI-Daten vorhanden sind. Das Vorhandensein von UEFI-Daten weist darauf hin, dass nichtflüchtige Daten beibehalten werden.

**So überprüfen Sie, ob die Instance für Schritt 2 bereit ist**  
Verwenden Sie den Befehl [https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) und geben Sie die Instance-ID an.

```
aws ec2 get-instance-uefi-data --instance-id i-1234567890abcdef0
```

Die Instance ist bereit für Schritt 2, wenn UEFI-Daten in der Ausgabe vorhanden sind. Wenn die Ausgabe leer ist, kann die Instance nicht für die Unterstützung von UEFI Secure Boot konfiguriert werden. Dies kann passieren, wenn Ihre Instance gestartet wurde, bevor die UEFI Secure Boot-Unterstützung verfügbar wurde. Starten Sie eine neue Instance und versuchen Sie es erneut.

### Schritt 2: Konfigurieren Sie eine Instance zur Unterstützung von UEFI Secure Boot
<a name="step2-launch-uefi-sb"></a>

#### Registrieren Sie die Schlüsselpaare in Ihrem UEFI-Variablenspeicher in der Instance
<a name="step2a-launch-uefi-sb"></a>

**Warnung**  
Sie müssen Ihre Boot-Images signieren, *nachdem* Sie die Schlüssel registriert haben, sonst können Sie Ihre Instance nicht starten.

Nachdem Sie die signierten UEFI-Signaturlisten (`PK`, `KEK` und `db`) erstellt haben, müssen sie bei der UEFI-Firmware registriert sein.

Schreiben in der `PK`-Variablen ist nur möglich, wenn:
+ Es ist noch keine PK angemeldet, was angegeben wird, wenn die `SetupMode`Variable `1` ist. Prüfen Sie dies mit dem folgenden Befehl: Die Ausgabe ist entweder `1` oder `0`.

  ```
  efivar -d -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode 
  ```
+ Die neue PK ist durch den privaten Schlüssel der bestehenden PK signiert.

**So melden Sie die Schlüssel in Ihrem UEFI-Variablenspeicher an**  
Die folgenden Befehle müssen in der Instance ausgeführt werden.

Wenn aktiviert SetupMode ist (der Wert ist`1`), können die Schlüssel registriert werden, indem die folgenden Befehle auf der Instanz ausgeführt werden:

```
[ec2-user ~]$ efi-updatevar -f db.auth db
```

```
[ec2-user ~]$ efi-updatevar -f KEK.auth KEK
```

```
[ec2-user ~]$ efi-updatevar -f PK.auth PK
```

**So überprüfen Sie, ob UEFI Secure Boot aktiviert ist**  
Führen Sie die Schritte unter [Überprüfen, ob eine Amazon-EC2-Instance für UEFI Secure Boot aktiviert ist](verify-uefi-secure-boot.md) aus, um zu überprüfen, ob UEFI Secure Boot aktiviert ist.

Sie können Ihren UEFI-Variablenspeicher jetzt mit dem CLI-Befehl [https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) exportieren oder mit dem nächsten Schritt fortfahren und Ihre Boot-Images signieren, um sie in einer UEFI Secure Boot-fähigen Instance neu zu starten.

### Schritt 3: Erstellen eines AMI Ihrer Instance
<a name="step3-launch-uefi-sb"></a>

Um ein AMI aus der Instance zu erstellen, können Sie die Konsole oder die `CreateImage` API, CLI oder verwenden SDKs. Informationen zur Verwendung der Konsole finden Sie unter [Ein Amazon-EBS-gestütztes AMI erstellen](creating-an-ami-ebs.md). Die API-Anweisungen finden Sie unter [CreateImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html).

**Anmerkung**  
Die `CreateImage`-API kopiert den UEFI-Variablenspeicher der Instance automatisch in das AMI. Die Konsole verwendet die `CreateImage`-API. Nachdem Sie Instances mit diesem AMI gestartet haben, haben die Instances denselben UEFI-Variablenspeicher.

## Aufgabe 2 – Option B: Erstellen Sie ein binäres Blob mit einem vorgefüllten Variablenspeicher
<a name="uefi-secure-boot-optionB"></a>

Nachdem Sie die [drei Schlüsselpaare](#uefi-secure-boot-create-three-key-pairs) erstellt haben, können Sie ein binäres Blob erstellen, das einen vorgefüllten Variablenspeicher enthält, der die UEFI Secure Boot-Schlüssel enthält. Führen Sie alternativ die Schritte unter [Aufgabe 2 – Option A: Fügen Sie innerhalb der Instance Schlüssel zum Variablenspeicher hinzu](#uefi-secure-boot-optionA) aus.

**Warnung**  
Sie müssen Ihre Boot-Images signieren, *bevor* Sie die Schlüssel registrieren, sonst können Sie Ihre Instance nicht starten.

**Topics**
+ [Schritt 1: Erstellen Sie einen neuen Variablenspeicher oder aktualisieren Sie einen vorhandenen](#uefi-secure-boot-create-or-update-variable)
+ [Schritt 2: Hochladen des binären Blobs bei der AMI-Erstellung](#uefi-secure-boot-upload-binary-blob-on-ami-creation)

### Schritt 1: Erstellen Sie einen neuen Variablenspeicher oder aktualisieren Sie einen vorhandenen
<a name="uefi-secure-boot-create-or-update-variable"></a>

Sie können den Variablenspeicher *offline* ohne eine laufende Instance erstellen, indem Sie das Python-Uefivars-Tool verwenden. Das Tool kann aus Ihren Schlüsseln einen neuen Variablenspeicher erstellen. Das Skript unterstützt derzeit das EDK2 Format, das AWS Format und eine JSON-Darstellung, die mit Tools auf höherer Ebene einfacher zu bearbeiten ist.

**So erstellen Sie den Variablenspeicher offline ohne laufende Instance**

1. Laden Sie das Tool unter folgendem Link herunter.

   ```
   https://github.com/awslabs/python-uefivars
   ```

1. Erstellen Sie einen neuen Variablenspeicher von Ihren Schlüsseln, indem Sie den folgenden Befehl ausführen. Dadurch wird ein Base64-kodierter Binär-Blob in .bin erstellt. *your\$1binary\$1blob* Das Tool unterstützt auch das Aktualisieren eines binären Blobs über die `-I`-Parameter.

   ```
   ./uefivars.py -i none -o aws -O your_binary_blob.bin -P PK.esl -K KEK.esl --db db.esl --dbx dbx.esl
   ```

### Schritt 2: Hochladen des binären Blobs bei der AMI-Erstellung
<a name="uefi-secure-boot-upload-binary-blob-on-ami-creation"></a>

Verwenden Sie [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) um Ihre UEFI-Variablenspeicherdaten zu übergeben. Geben Sie für den Parameter `--uefi-data` geben Sie Ihr binäres Blob an, und geben Sie für den Parameter `--boot-mode` `uefi` an.

```
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
```