

# Amazon EC2 インスタンスの UEFI 安全ブート
<a name="uefi-secure-boot"></a>

UEFI 安全ブート は、長期の使用実績がある Amazon EC2 の安全なブートプロセスを基に構築されたものです。これには詳細な防御が追加されているので、ユーザーは、起動後も持続する脅威からソフトウェアを保護できます。インスタンスが起動できるのは、暗号化キーで署名されたソフトウェアのみになります。キーは、[UEFI の不揮発性変数ストア](uefi-variables.md)のキーデータベースに保存されています。UEFI 安全ブート は、インスタンスのブートフローが不正な変更を受けることを防止します。

**Topics**
+ [Amazon EC2 インスタンスで UEFI 安全ブート を使用する方法](how-uefi-secure-boot-works.md)
+ [Amazon EC2 で UEFI 安全ブート を使用するための要件](launch-instance-with-uefi-sb.md)
+ [Amazon EC2 インスタンスで UEFI 安全ブート が有効化されているかどうかを確認する](verify-uefi-secure-boot.md)
+ [カスタム UEFI 安全ブート キーを使用して Linux AMI を作成する](create-ami-with-uefi-secure-boot.md)
+ [UEFI 安全ブート の AWS バイナリ BLOB を作成する](aws-binary-blob-creation.md)

# Amazon EC2 インスタンスで UEFI 安全ブート を使用する方法
<a name="how-uefi-secure-boot-works"></a>

UEFI 安全ブート は、UEFI の中で規定された機能であり、これにより、ブートチェーンの状態を検証することができます。ファームウェア自体による初期化後は、暗号を使用した検証が行われた UEFI バイナリコードのみを、実行するように設計されています。これらのバイナリコードには、UEFI ドライバーやメインブートローダーに加え、ブートチェーンによりロードされるコンポーネントも含まれます。

UEFI 安全ブート では、信頼チェーンで使用される 4 つのキーデータベースが指定されています。このデータベースは、UEFI の変数ストアに格納されています。

信頼チェーンには、以下が含まれます。

**プラットフォームキー (PK) データベース**  
PK データベースは信頼チェーンのルートに置かれます。これには、キー交換キー (KEK) データベースを更新する際に信頼チェーンで使用される、単一のパブリック PK キーが含まれています。  
PK データベースを変更するためには、プライベート PK キーを使用して、その更新リクエストに署名する必要があります。この変更処理には、空の PK キーの書き込みによる PK データベースの削除も含まれます。

**キー交換キー (KEK) データベース**  
KEK データベースでは、公開 KEK キーがリストされています。これらのキーは、署名データベース (db) と拒否リストデータベース (dbx) を更新する際に、信頼チェーンが使用します。  
パブリック KEK データベースを変更するには、プライベート PK キーを使用して、更新のリクエストに署名をする必要があります。

**署名 (DB) データベース**  
db データベースには、すべての UEFI ブートバイナリを検証するために信頼チェーンが使用する、パブリックキーとハッシュがリストされています。  
db データベースを変更するには、プライベート PK キーまたはプライベート KEK キーを使用して、更新リクエストに署名する必要があります。

**署名拒否リスト (dbx) データベース**  
dbx データベースは、信頼されていないパブリックキーとバイナリハッシュをリストします。このリストは、信頼チェーンが失効ファイルとして使用します。  
dbx データベースは、常に、他のすべてのキーデータベースよりも優先されます。  
dbx データベースを変更するには、プライベート PK キーまたはプライベート KEK キーを使用して、その更新リクエストに署名する必要があります。  
UEFI フォーラム ([https://uefi.org/revocationlistfile](https://uefi.org/revocationlistfile)) には、既知の問題のあるバイナリコードと証明書を多数リストした dbx が公開されており、いつでも使用できます。

**重要**  
UEFI 安全ブート は、任意の UEFI バイナリでシグニチャ検証を適用します。UEFI 安全ブート 内での UEFI バイナリの実行を許可するには、上記で説明したいずれかのプライベート db キーを使用して、そのバイナリに署名します。

デフォルトでは、UEFI 安全ブート は無効になっており、システムは `SetupMode` になっています。`SetupMode` の状態であるシステムでは、暗号による署名なしですべてのキー変数の更新が可能です。PK が設定されると、UEFI 安全ブート が有効化されるとともに、SetupMode が取り消されます。

# Amazon EC2 で UEFI 安全ブート を使用するための要件
<a name="launch-instance-with-uefi-sb"></a>

サポートされている AMI とサポートされているインスタンス タイプで [Amazon EC2 インスタンスを起動する](LaunchingAndUsingInstances.md)と、そのインスタンスは UEFI 安全ブート データベースで UEFI ブートバイナリを自動的に検証します。追加の設定は必要ありません。UEFI 安全ブート は、インスタンスを起動した後に設定することもできます。

**注記**  
UEFI 安全ブート は、インスタンスとそのオペレーティングシステムについて、ブートフローが変更されないように保護します。UEFI 安全ブート が有効になっているソース AMI から新しい AMI を作成し、コピープロセス中に AMI 内で `UefiData` を変更するなど、特定のパラメータを変更すると、UEFI 安全ブート を無効にできます。

**Topics**
+ [サポートされている AMI](#uefi-amis)
+ [サポートされるインスタンスタイプ](#uefi-instance)

## サポートされている AMI
<a name="uefi-amis"></a>

**Linux AMI**  
Linux インスタンスを起動するには、Linux AMI で UEFI セキュアブートが有効になっている必要があります。

Amazon Linux は、AL2023 リリース 2023.1 から UEFI セキュアブートをサポートしています。ただし UEFI セキュアブートは、デフォルトの AMI では有効になっていません。詳細については、「*AL2023 ユーザーガイド*」の「[UEFI Secure Boot](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html)」を参照してください。古いバージョンの Amazon Linux AMI では、UEFI セキュアブートは有効ではありません。サポートされている AMI を使用するには、独自の Linux AMI でいくつかの設定ステップを実行する必要があります。詳細については、「[カスタム UEFI 安全ブート キーを使用して Linux AMI を作成する](create-ami-with-uefi-secure-boot.md)」を参照してください。

**Windows AMI**  
Windows インスタンスを起動するには、Windows AMI で UEFI セキュアブートが有効になっている必要があります。Microsoft キーで UEFI Secure Boot 用に事前設定された AWS Windows AMI を見つけるには、「*AWSWindows AMI リファレンス*」の「[NitroTPM と UEFI Secure Boot で設定された Windows Server AMI を見つける](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/ami-windows-tpm.html#ami-windows-tpm-find)」を参照してください。

現時点では、[import-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/import-image.html) コマンドにより、UEFI 安全ブート 使用する Windows をインポートすることはできません。

## サポートされるインスタンスタイプ
<a name="uefi-instance"></a>

UEFI をサポートするすべての仮想インスタンスタイプは、UEFI 安全ブート もサポートします。UEFI 安全ブート をサポートするインスタンスタイプについては、[UEFI ブートモードの要件](launch-instance-boot-mode.md) を参照してください。

**注記**  
ベアメタルインスタンスタイプは UEFI 安全ブート をサポートしていません。

# Amazon EC2 インスタンスで UEFI 安全ブート が有効化されているかどうかを確認する
<a name="verify-uefi-secure-boot"></a>

次のステップを使用して、Amazon EC2 で UEFI 安全ブート が有効になっているかどうかを確認できます。

## Linux インスタンス
<a name="verify-uefi-secure-boot-linux"></a>

Linux インスタンスが UEFI 安全ブート に対して有効になっているかどうかを確認するには `mokutil` ユティリティを使用できます。`mokutil` がインスタンスにインストールされていない場合は、これをインストールする必要があります。Amazon Linux 2 のインストールステップについては、「[Find and install software packages on an Amazon Linux 2 instance](https://docs.aws.amazon.com/linux/al2/ug/find-install-software.html)」を参照してください。その他の Linux ディストリビューションについては、それぞれの個別のドキュメントを参照してください。

**Linux インスタンスが UEFI 安全ブート に対して有効になっているかどうかを確認するには**  
インスタンスに接続し、ターミナルウィンドウで `root` として次のコマンドを実行します。

```
mokutil --sb-state 
```

以下は出力の例です。
+ UEFI 安全ブート が有効な場合、出力には `SecureBoot enabled` が含まれます。
+ UEFI 安全ブート が有効化されていない場合は、出力に `SecureBoot disabled` または `Failed to read SecureBoot` が含まれます。

## Windows インスタンス
<a name="verify-uefi-secure-boot-windows"></a>

**Windows インスタンスで UEFI 安全ブート が有効になっているかどうかを確認するには**

1. インスタンスに接続します。

1. msinfo32 ツールを開きます。

1. **[安全ブート State]** (安全ブート の状態) フィールドを確認します。UEFI 安全ブート が有効になっている場合、次の図に示すように、この値は **[サポート対象]** です。  
![\[システム情報内の 安全ブート の状態。\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/secure-boot-state-win.png)

Windows PowerShell コマンドレット `Confirm-SecureBootUEFI` を使用して安全ブートのステータスを確認することもできます。コマンドの詳細については、Microsoft ドキュメントの「[Confirm-SecureBootUEFI](https://learn.microsoft.com/en-us/powershell/module/secureboot/confirm-securebootuefi)」を参照してください。

# カスタム UEFI 安全ブート キーを使用して Linux AMI を作成する
<a name="create-ami-with-uefi-secure-boot"></a>

この手順では、UEFI 安全ブートとカスタムメイドのプライベートキーを使用して Linux AMI を作成する方法を示します。Amazon Linux は、AL2023 リリース 2023.1 から UEFI セキュアブートをサポートしています。詳細については、「Amazon Linux 2023 ユーザーガイド」の「[UEFI Secure Boot on AL2023](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html)」を参照してください。

**重要**  
次の手順は、**上級ユーザーのみ**を対象としています。これらの手順を使用するには、SSL および Linux ディストリビューションのブートフローに関する十分な知識が必要です。

**前提条件**
+ 以下のツールを使用します。
  + OpenSSL – [https://www.openssl.org/](https://www.openssl.org/)
  + efivar – [https://github.com/rhboot/efivar](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) コマンド
+ Linux インスタンスは、UEFI ブートモードをサポートする Linux AMI で起動され、不揮発性データを使用している必要があります。

UEFI 安全ブート キーを使用せずに新規で作成されたインスタンスには、`SetupMode` が適用されます。この状態で、独自のキーを登録することが可能です。一部の AMI では UEFI 安全ブート が事前設定されており、既定のキーを変更することはできません。AMI のキーを変更する場合は、その AMI をベースに、新らたな AMI を作成する必要があります。

変数ストア内のキーを伝達するには 2 つの方法があり、それぞれを、以下の オプション A とオプション B の中で説明します。オプション A では、実際のハードウェアのフローを模倣することで、インスタンス内からこれを行う方法について説明します。オプション B では、AMI の作成時に base64 でエンコードされたファイルとして渡される、バイナリ BLOB を作成する方法について説明します。どちらのオプションでも、最初に、信頼チェーンに使用するためのキーペアを 3 つ作成する必要があります。

**Topics**
+ [タスク 1: キーペアを作成する](#uefi-secure-boot-create-three-key-pairs)
+ [タスク 2 – オプション A: インスタンス内から変数ストアにキーを追加する](#uefi-secure-boot-optionA)
+ [タスク 2 – オプション B: 値が事前に設定済みの変数ストアを含むバイナリ BLOB を作成する](#uefi-secure-boot-optionB)

## タスク 1: キーペアを作成する
<a name="uefi-secure-boot-create-three-key-pairs"></a>

UEFI 安全ブート は、プラットフォームキー (PK)、キー交換キー (KEK)、署名データベース (db) という 3 つのキーデータベースに基づいおり、これらのデータベースは信頼チェーンで使用されます。

インスタンスでは、これらの各キーを作成する必要があります。UEFI 安全ブート 標準が有効な形式でパブリックキーの準備を行うには、それぞれのキー用に証明書を作成します。`DER` では SSL 形式 (バイナリエンコード用の形式) を定義しています。その後、各証明書を UEFI 署名リストに変換します。このリストはバイナリ形式で、UEFI 安全ブート による解析が可能です。最後に、関連するキーで各証明書に署名します。

**Topics**
+ [キーペアの作成を準備するには](#uefisb-prepare-to-create-key-pairs)
+ [キーペア 1: プラットフォームキー (PK) を作成します。](#uefisb-create-key-pair-1)
+ [キーペア 2: キー交換キー (KEK) を作成します](#uefisb-create-key-pair-2)
+ [キーペア 3: 署名データベース (db) を作成します](#uefisb-create-key-pair-3)
+ [ブートイメージ (カーネル) にプライベートキーで署名する](#uefi-secure-boot-sign-kernel)

### キーペアの作成を準備するには
<a name="uefisb-prepare-to-create-key-pairs"></a>

キーペアを作成する前に、キー生成処理で使用するための、グローバルで一意の識別子 (GUID) を作成します。

1. [インスタンスに接続します。](connect.md)

1. シェルプロンプトで、次のコマンドを実行します。

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

### キーペア 1: プラットフォームキー (PK) を作成します。
<a name="uefisb-create-key-pair-1"></a>

PK は UEFI 安全ブート インスタンスの信頼のルートです。プライベート PK は KEK を更新するために使用されます。このキーはその後、認証されたキーを署名データベース (db) に追加するためにも使用されます。

キーペアの作成には、X.509 標準が適用されます。標準の詳細については、*ウィキペディア*の「[X.509](https://en.wikipedia.org/wiki/X.509)」を参照してください。

**PK を作成するには**

1. キーを作成します。変数 `PK` に名前を付ける必要があります

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

   以下の各パラメータが指定されます。
   + `-keyout PK.key` – プライベートキーファイル。
   + `-days 3650` – 証明書が有効な日数。
   + `-out PK.crt` – UEFI 変数の作成に使用される証明書。
   + `CN=Platform key` – キーの共通名 (CN)。ここでは、*プラットフォームキー* の代わりに組織の独自の名前を入力できます。

1. 証明書を作成します。

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

1. 証明書を UEFI 署名リストに変換します。

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

1. UEFI 署名リストに (自己署名の) プライベート PKで署名します。

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

### キーペア 2: キー交換キー (KEK) を作成します
<a name="uefisb-create-key-pair-2"></a>

プライベート KEK は db にキーを追加するために使用されます。このデータベースは、システム上で起動が許可された署名のリストです。

**KEK を作成するには**

1. キーを作成します。

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

1. 証明書を作成します。

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

1. 証明書を UEFI 署名リストに変換します。

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

1. プライベート PK で署名リストに署名します。

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

### キーペア 3: 署名データベース (db) を作成します
<a name="uefisb-create-key-pair-3"></a>

db リストには、システム上で起動することが認証されているキーが記載されています。このリストを変更する場合は、プライベート KEK が必要です。ブートイメージは、このステップで作成したプライベートキーで署名されます。

**db を作成するには**

1. キーを作成します。

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

1. 証明書を作成します。

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

1. 証明書を UEFI 署名リストに変換します。

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

1. プライベート KEK を使用して署名リストに署名します。

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

### ブートイメージ (カーネル) にプライベートキーで署名する
<a name="uefi-secure-boot-sign-kernel"></a>

Ubuntu 22.04 の場合、以下のイメージに署名が必要です。

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

**イメージに署名するには**  
イメージに署名するには、以下の構文を使用します。

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

**注記**  
署名は、すべての新しいカーネルに対して行う必要があります。通常、*`/boot/vmlinuz`* は、最近インストールしたカーネルへのシンボリックリンクとなります。

ブートチェーンおよび必要なイメージは、ディストリビューションのドキュメントで確認してください。

¹ ArchWiki コミュニティの皆さんから提供された、すべての作業に感謝します。PK の作成、KEK の作成、DB の作成、およびイメージへの署名のためのコマンドは、[Creating keys](https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Creating_keys) から提供されており、ArchWiki メンテナンスチームおよび (または) ArchWiki のコントリビューターによって作成されたものです。

## タスク 2 – オプション A: インスタンス内から変数ストアにキーを追加する
<a name="uefi-secure-boot-optionA"></a>

[3 つのキーペア](#uefi-secure-boot-create-three-key-pairs)の作成が完了すると、以下のステップにより、インスタンスに接続し、インスタンス内から変数ストアにキーを追加できるようになります。または、[タスク 2 – オプション B: 値が事前に設定済みの変数ストアを含むバイナリ BLOB を作成する](#uefi-secure-boot-optionB) の手順を完了します。

**Topics**
+ [ステップ 1: UEFI 安全ブート をサポートするインスタンスを起動する](#step1-launch-uefi-sb)
+ [ステップ 2: UEFI 安全ブート をサポートするようにインスタンスを設定する](#step2-launch-uefi-sb)
+ [ステップ 3: インスタンスから AMI を作成する](#step3-launch-uefi-sb)

### ステップ 1: UEFI 安全ブート をサポートするインスタンスを起動する
<a name="step1-launch-uefi-sb"></a>

次の前提条件の下で‭[‭‬インスタンスを起動‭](LaunchingAndUsingInstances.md)‬することで、UEFI 安全ブート をサポートするようにインスタンスを構成する準備が整います。インスタンスでの UEFI 安全ブート のサポートは、起動時にみ有効化が可能で、その後に有効にすることはできません。

**前提条件**
+ **AMI** - Linux AMI では、UEFI ブートモードをサポートする必要があります。AMI が UEFI ブートモードをサポートしていることを確認するには、AMI ブートモードパラメータで **uefi** を指定する必要があります。詳細については、「[Amazon EC2 AMI のブートモードパラメータを確認する](ami-boot-mode.md)」を参照してください。

  AWS では、重力子 ベースのインスタンスタイプ向けに UEFI をサポートするように構成された Linux AMI のみを提供します。AWS では、UEFI ブートモードをサポートする x86\$164 Linux AMI を提供していません。すべてのアーキテクチャで UEFI ブートモードをサポートするように独自の AMI を構成できます。UEFI ブートモードをサポートするように AMI を設定するには、独自の AMI に対して、複数の設定ステップを実行する必要があります。詳細については、「[Amazon EC2 AMI のブートモードを設定する](set-ami-boot-mode.md)」を参照してください。
+ **インスタンスタイプ** — UEFI をサポートするすべての仮想インスタンスタイプは、UEFI 安全ブート もサポートします。ベアメタルインスタンスタイプは UEFI 安全ブート をサポートしていません。UEFI 安全ブート をサポートするインスタンスタイプについては、[UEFI ブートモードの要件](launch-instance-boot-mode.md) を参照してください。
+ UEFI 安全ブート の立ち上げ後に、インスタンスの起動を行います。UEFI 安全ブート のサポートが可能なのは、2022 年 5 月 10 日 (UEFI 安全ブート リリース日) より後に起動されたインスタンスのみです。

インスタンスを起動したら、UEFI データが存在するかどうかを調べ、UEFI 安全ブート のサポートを設定できる状態であることを確認します ([ステップ 2](#step2-launch-uefi-sb)‬ に進みます)。UEFI データが見つかれば、不揮発性データが保持されていることになります。

**インスタンスがステップ 2 に進める状態かどうかを確認するには**  
[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) コマンドを使用して、インスタンス ID を指定します。

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

出力に UEFI データが含まれていれば、そのインスタンスはステップ 2 に進める状態です。空の出力が表示される場合、そのインスタンスで UEFI 安全ブート をサポートする設定は行えません。この状態は、UEFI 安全ブート サポートが利用可能になる前に起動されたインスタンスで発生します。この場合、新しいインスタンスを起動して再試行します。

### ステップ 2: UEFI 安全ブート をサポートするようにインスタンスを設定する
<a name="step2-launch-uefi-sb"></a>

#### インスタンスの UEFI 変数ストアにキーペアを登録します。
<a name="step2a-launch-uefi-sb"></a>

**警告**  
ブートイメージへの署名は、キーの登録*後*に行う必要があります。そうしないと、インスタンスを起動できなくなります。

署名済みの UEFI 署名リスト (`PK`、`KEK`、および `db`) は、作成後に UEFI ファームウェアに登録する必要があります。

`PK` 変数に対する書き込みは、以下の場合にのみ行うことができます。
+ `SetupMode`変数が`1`の場合、PKはまだ登録されていない。これは、次のコマンドを使用して確認します。`1` または `0` のどちらかが出力されている。

  ```
  efivar -d -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode 
  ```
+ 新しい PK が、既存の PK のプライベートキーによって署名されている。

**UEFI 変数ストアにキーを登録するには**  
インスタンスで以下のコマンドを実行する必要があります。

SetupMode が有効 (値が `1`) になっていれば、インスタンスで以下のコマンドを実行することでキーを登録できます。

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

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

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

**UEFI 安全ブート が有効になっていることを確認するには**  
UEFI 安全ブート が有効であることを確認するには、「[Amazon EC2 インスタンスで UEFI 安全ブート が有効化されているかどうかを確認する](verify-uefi-secure-boot.md)」に示したステップに従います。

この段階で、[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) CLI コマンドにより UEFI 変数ストアをエクスポートすることが可能です。あるいは、次のステップに進みブートイメージに署名して、それを UEFI 安全ブート-対応のインスタンスで再起動できます。

### ステップ 3: インスタンスから AMI を作成する
<a name="step3-launch-uefi-sb"></a>

インスタンスから AMI を作成するには、コンソールまたは `CreateImage` API、CLI、または SDK を使用します。コンソールでのステップについては、「[Amazon EBS-backed AMI を作成する](creating-an-ami-ebs.md)」を参照してください。API でのステップについては、「[CreateImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html)」を参照してください。

**注記**  
`CreateImage` API は、インスタンスの UEFI 変数ストアを AMI に自動的にコピーします。コンソールは `CreateImage` API を使用します。この AMI を使用してインスタンスを起動した場合、インスタンスにも AMI と同じ UEFI 変数ストアが含まれます。

## タスク 2 – オプション B: 値が事前に設定済みの変数ストアを含むバイナリ BLOB を作成する
<a name="uefi-secure-boot-optionB"></a>

[3 つのキーペア](#uefi-secure-boot-create-three-key-pairs)の作成後、事前に値が設定され UEFI 安全ブート キーが指定された変数ストアを含む、バイナリ BLOB を作成できます。または、[タスク 2 – オプション A: インスタンス内から変数ストアにキーを追加する](#uefi-secure-boot-optionA) の手順を完了します。

**警告**  
ブートイメージへの署名は、キーの登録*前*に行う必要があります。そうしないと、インスタンスを起動できなくなります。

**Topics**
+ [ステップ 1: 変数ストアを新規で作成するか既存の変数ストアを更新する](#uefi-secure-boot-create-or-update-variable)
+ [ステップ 2: AMI の作成時にバイナリ BLOB をアップロードする](#uefi-secure-boot-upload-binary-blob-on-ami-creation)

### ステップ 1: 変数ストアを新規で作成するか既存の変数ストアを更新する
<a name="uefi-secure-boot-create-or-update-variable"></a>

python-uefivars ツールを使用すれば、インスタンスを実行しなくても*オフラインで*変数ストアを作成できます。このツールでは、キーから新しい変数ストアを作成できます。現在、このスクリプトでは、EDK2 形式、AWS 形式、および上位レベルのツールで編集しやすい JSON 表現がサポートされています。

**インスタンスを実行せずに変数ストアをオフラインで作成するには**

1. 次のリンクからツールをダウンロードします。

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

1. 次のコマンドを実行して、キーから新しい変数ストアを作成します。これにより、base64 でエンコードされたバイナリ BLOB が、*your\$1binary\$1blob* bin として作成されます。このツールでは、`-I` パラメータ経由でバイナリ BLOB を更新することもできます。

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

### ステップ 2: AMI の作成時にバイナリ BLOB をアップロードする
<a name="uefi-secure-boot-upload-binary-blob-on-ami-creation"></a>

[https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) により、UEFI 変数ストアデータを渡します。`--uefi-data` パラメータではバイナリ BLOB を指定し、また `--boot-mode` パラメータでは `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
```

# UEFI 安全ブート の AWS バイナリ BLOB を作成する
<a name="aws-binary-blob-creation"></a>

次のステップにより、AMI の作成中に UEFI 安全ブート 変数をカスタマイズすることができます。このステップで使用される KEK は、2021 年 9 月現在のものです。Microsoft により KEK が更新された場合は、その最新の KEK を使用する必要があります。

**AWS でバイナリ BLOB を作成するには**

1. 空の PK 署名リストを作成します。

   ```
   touch empty_key.crt
   cert-to-efi-sig-list empty_key.crt PK.esl
   ```

1. KEK 証明書をダウンロードします。

   ```
   https://go.microsoft.com/fwlink/?LinkId=321185
   ```

1. UEFI 署名リスト (`siglist`) で KEK 証明書をラップします。

   ```
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK.esl MicCorKEKCA2011_2011-06-24.crt 
   ```

1. Microsoft から db 証明書をダウンロードします。

   ```
   https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt
   https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt
   ```

1. db 署名リストを生成します。

   ```
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
   cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl
   ```

1. Unified Extensible Firmware Interface Forum は、DBX ファイルを提供しなくなりました。これらは、Microsoft によって GitHub で提供されるようになりました。[https://github.com/microsoft/secureboot\$1objects](https://github.com/microsoft/secureboot_objects) の Microsoft セキュアブート更新リポジトリから最新の DBX 更新をダウンロードしてください。

1. 署名付きの更新バイナリを解凍します。

   以下のスクリプトコンテンツを使用して `SplitDbxContent.ps1` を作成します。または、`Install-Script -Name SplitDbxContent` を使用して [PowerShell Gallery](https://www.powershellgallery.com/packages/SplitDbxContent/1.0) からスクリプトをインストールすることもできます。

   ```
   <#PSScriptInfo
    
   .VERSION 1.0
    
   .GUID ec45a3fc-5e87-4d90-b55e-bdea083f732d
    
   .AUTHOR Microsoft Secure Boot Team
    
   .COMPANYNAME Microsoft
    
   .COPYRIGHT Microsoft
    
   .TAGS Windows Security
    
   .LICENSEURI
    
   .PROJECTURI
    
   .ICONURI
    
   .EXTERNALMODULEDEPENDENCIES
    
   .REQUIREDSCRIPTS
    
   .EXTERNALSCRIPTDEPENDENCIES
    
   .RELEASENOTES
   Version 1.0: Original published version.
    
   #>
   
   <#
   .DESCRIPTION
    Splits a DBX update package into the new DBX variable contents and the signature authorizing the change.
    To apply an update using the output files of this script, try:
    Set-SecureBootUefi -Name dbx -ContentFilePath .\content.bin -SignedFilePath .\signature.p7 -Time 2010-03-06T19:17:21Z -AppendWrite'
   .EXAMPLE
   .\SplitDbxAuthInfo.ps1 DbxUpdate_x64.bin
   #>
   
   
   # Get file from script input
   $file  = Get-Content -Encoding Byte $args[0]
   
   # Identify file signature
   $chop = $file[40..($file.Length - 1)]
   if (($chop[0] -ne 0x30) -or ($chop[1] -ne 0x82 )) {
       Write-Error "Cannot find signature"
       exit 1
   }
   
   # Signature is known to be ASN size plus header of 4 bytes
   $sig_length = ($chop[2] * 256) + $chop[3] + 4
   $sig = $chop[0..($sig_length - 1)]
   
   if ($sig_length -gt ($file.Length + 40)) {
       Write-Error "Signature longer than file size!"
       exit 1
   }
   
   # Content is everything else
   $content = $file[0..39] + $chop[$sig_length..($chop.Length - 1)]
   
   # Write signature and content to files
   Set-Content -Encoding Byte signature.p7 $sig
   Set-Content -Encoding Byte content.bin $content
   ```

   次のスクリプトを使用して、署名付き DBX ファイルを解凍します。

   ```
   PS C:\Windows\system32> SplitDbxContent.ps1 .\dbx.bin
   ```

   これにより、`signature.p7` および `content.bin` の 2 つのファイルが生成されます。`content.bin` は次のステップで使用します。

1. `uefivars.py` スクリプトを使用して UEFI 変数ストアを作成します。

   ```
   ./uefivars.py -i none -o aws -O uefiblob-microsoft-keys-empty-pk.bin -P ~/PK.esl -K ~/MS_Win_KEK.esl --db ~/MS_db.esl  --dbx ~/content.bin 
   ```

1. バイナリ BLOB と UEFI 変数ストアを確認します。

   ```
   ./uefivars.py -i aws -I uefiblob-microsoft-keys-empty-pk.bin -o json | less
   ```

1. 再度、同じツールに渡すと、BLOB を更新できます。

   ```
   ./uefivars.py -i aws -I uefiblob-microsoft-keys-empty-pk.bin -o aws -O uefiblob-microsoft-keys-empty-pk.bin -P ~/PK.esl -K ~/MS_Win_KEK.esl --db ~/MS_db.esl  --dbx ~/content.bin
   ```

   正常な出力

   ```
   Replacing PK
   Replacing KEK
   Replacing db
   Replacing dbx
   ```