

# Amazon EC2 ブートモードでのインスタンスの起動動作
<a name="ami-boot"></a>

コンピュータが起動して最初に実行されるソフトウェアが、プラットフォームの初期化を行い、そのプラットフォーム固有の操作を実行するためのオペレーティングシステム用のインタフェースを提供する必要があります。

Amazon EC2 では、統合拡張ファームウェアインターフェイス (UEFI) とレガシー BIOS の、2 種類のブートモードソフトウェアがサポートされます。

**AMI で使用可能なブートモードパラメータ**  
AMI のブートモードパラメータ値には、`uefi`、`legacy-bios` または `uefi-preferred` のどちらかを指定できます。AMI ブートモードパラメータの設定はオプションです。ブートモードパラメータがない AMI の場合、これらの AMI から起動されるインスタンスでは、インスタンスタイプごとのデフォルトのブートモード値が使用されます。

**AMI ブートモードパラメータの目的**  
AMI ブートモードパラメータは、インスタンスの起動時に使用するブートモードを Amazon EC2 に通知します。ブートモードパラメータが `uefi` に設定されている場合、EC2 は UEFI でのインスタンスの起動を試みます。オペレーティングシステムが UEFI をサポートするように設定されていない場合、インスタンスの起動が失敗します。

**UEFI Preferred ブートモードパラメータ**  
`uefi-preferred` ブートモードパラメータを使用して、UEFI とレガシー BIOS の両方をサポートする AMI を作成できます。ブートモードパラメータが `uefi-preferred` に設定されている場合、インスタンスタイプごとの EFI がサポートされている場合、インスタンスは UEFI での起動になります。インスタンスタイプが UEFI をサポートしていない場合、インスタンスはレガシー BIOS で起動されます。

**警告**  
UEFI セキュアブートなどの一部の機能は、UEFI で起動するインスタンスでのみ使用できます。UEFI をサポートしないインスタンスタイプで `uefi-preferred` AMI ブートモードパラメータを使用すると、インスタンスはレガシー BIOS として起動し、UEFI 依存機能は無効になります。UEFI に依存する機能の可用性を重視する場合は、AMI ブートモードパラメータを `uefi` に設定します。

**インスタンスタイプごとのデフォルトのブートモード**
+ Graviton インスタンスタイプ: UEFI
+ Intel および AMD インスタンスタイプ: レガシー BIOS

**ゾーンのサポート**  
UEFI ブートは Wavelength ゾーンではサポートされていません。

**Topics**
+ [UEFI ブートモードで EC2 インスタンスを起動するための要件](launch-instance-boot-mode.md)
+ [Amazon EC2 AMI のブートモードパラメータを確認する](ami-boot-mode.md)
+ [EC2 インスタンスタイプがサポートしているブートモードを確認する](instance-type-boot-mode.md)
+ [EC2 インスタンスのブートモードを確認する](instance-boot-mode.md)
+ [EC2 インスタンスのオペレーティングシステムのブートモードを確認する](os-boot-mode.md)
+ [Amazon EC2 AMI のブートモードを設定する](set-ami-boot-mode.md)
+ [Amazon EC2 インスタンスの UEFI 変数](uefi-variables.md)
+ [Amazon EC2 インスタンスの UEFI 安全ブート](uefi-secure-boot.md)

# UEFI ブートモードで EC2 インスタンスを起動するための要件
<a name="launch-instance-boot-mode"></a>

インスタンスのブートモードは、AMI の設定、その中に含まれるオペレーティングシステム、およびインスタンスタイプによって決まります。UEFI ブートモードでインスタンスを起動するには、以下の要件を満たしている必要があります。

**AMI**  
UEFI では、AMI は次のように設定する必要があります。  
+ **オペレーティングシステム** – AMI に含まれるオペレーティングシステムです。UEFI の使用を設定する必要があり、この設定がない場合はインスタンスの起動に失敗します。詳細については、「[EC2 インスタンスのオペレーティングシステムのブートモードを確認する](os-boot-mode.md)」を参照してください。
+ **AMI ブートモードパラメータ** - AMI のブートモードパラメータは `uefi` または `uefi-preferred` に設定します。詳細については、「[Amazon EC2 AMI のブートモードパラメータを確認する](ami-boot-mode.md)」を参照してください。
**Linux** – 以下の Linux AMI は UEFI をサポートしています。  
+ Amazon Linux 2023
+ Amazon Linux 2 (重力子 インスタンスタイプのみ)
その他の Linux AMI の場合、[AMI の設定](set-ami-boot-mode.md)、[VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/) を介した AMI のインポート、または [CloudEndure](https://docs.cloudendure.com/) を介した AMI のインポートを行う必要があります。  
**Windows** – 以下の Windows AMI は UEFI をサポートしています。  
+ Windows\$1Server-2025-\$1 (`BIOS-` 名前のプレフィックスが付いた AMI を除く)
+ TPM-Windows\$1Server-2022-English-Full-Base
+ TPM-Windows\$1Server-2022-English-Core-Base
+ TPM-Windows\$1Server-2019-English-Full-Base
+ TPM-Windows\$1Server-2019-English-Core-Base
+ TPM-Windows\$1Server-2016-English-Full-Base
+ TPM-Windows\$1Server-2016-English-Core-Base

**インスタンスタイプ**  
AWS Nitro System に構築されているすべてのインスタンス (ベアメタルインスタンス、DL1、G4ad、P4、u-3tb1、u-6tb1、u-9tb1、u-12tb1、u-18tb1、u-24tb1 および VT1 を除く) では、UEFI とレガシー BIOS の両方がサポートされます。詳細については、「[EC2 インスタンスタイプがサポートしているブートモードを確認する](instance-type-boot-mode.md)」を参照してください。

次の表は、インスタンスのブートモード (**インスタンス起動モードの結果**列で示される) が AMI のブートモードパラメータ (列 1)、AMI に含まれるオペレーティングシステムのブートモード設定 (列 2)、およびインスタンスタイプのブートモードサポート (列 3) の組み合わせによって決定されることを示しています。


| AMI ブートモードパラメータ | オペレーティングシステムのブートモード設定 | インスタンスタイプのブートモードサポート | インスタンスのブートモードの結果 | 
| --- | --- | --- | --- | 
| UEFI | UEFI | UEFI | UEFI | 
| レガシー BIOS | レガシー BIOS | レガシー BIOS | レガシー BIOS | 
| UEFI Preferred | UEFI | UEFI | UEFI | 
| UEFI Preferred | UEFI | UEFI とレガシー BIOS | UEFI | 
| UEFI Preferred | レガシー BIOS | レガシー BIOS | レガシー BIOS | 
| UEFI Preferred | レガシー BIOS | UEFI とレガシー BIOS | レガシー BIOS | 
| ブートモードが指定されていません - ARM | UEFI | UEFI | UEFI | 
| ブートモードが指定されていません - x86 | レガシー BIOS | UEFI とレガシー BIOS | レガシー BIOS | 

# Amazon EC2 AMI のブートモードパラメータを確認する
<a name="ami-boot-mode"></a>

AMI ブートモードパラメータの設定はオプションです。AMI のブートモードパラメータ値には、`uefi`、`legacy-bios` または `uefi-preferred` のどちらかを指定できます。

一部の AMI には、ブートモードパラメータがありません。AMI にブートモードパラメータがない場合、AMI から起動されるインスタンスでは、インスタンスタイプごとのデフォルト値が使用されます。重力子 ではこの設定は `uefi` となり、Intel および AMD インスタンスタイプでは `legacy-bios` となります。

------
#### [ Console ]

**AMI のブートモードパラメータを確認するには ()**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで [**AMI**] をクリックした後、AMI を選択してください。

1. **[ブートモード]** フィールドを調べます。
   + **uefi** という値は、AMI が UEFI をサポートしていることを示します。
   + **uefi-preferred** という値は、AMI が UEFI とレガシー BIOS の両方をサポートしていることを示します。
   + 値がない場合、AMI から起動されるインスタンスは、インスタンスタイプのデフォルト値を使用します。

**インスタンスの起動時に AMI のブートモードパラメータを確認するには**  
インスタンスの起動ウィザードを使用してインスタンスを起動する場合、AMI を選択するステップで、[**ブートモード**] フィールドを表示します。詳細については、「[アプリケーションと OS イメージ (Amazon マシンイメージ)](ec2-instance-launch-parameters.md#liw-ami)」を参照してください。

------
#### [ AWS CLI ]

**AMI のブートモードパラメータを確認するには ()**  
[https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) コマンドを使用して、AMI のブートモードを確認します。

```
aws ec2 describe-images \
    --region us-east-1 \
    --image-id ami-0abcdef1234567890 \
    --query Images[].BootMode \
    --output text
```

以下は出力の例です。

```
uefi
```

出力で、`uefi` という値はその AMI が UEFI をサポートしていることを示しています。`uefi-preferred` の値により、その AMI が UEFI とレガシー BIOS の両方をサポートしていることを示されます。値がない場合、AMI から起動されるインスタンスは、インスタンスタイプのデフォルト値を使用します。

------
#### [ PowerShell ]

**AMI のブートモードパラメータを確認するには ()**  
[https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) コマンドレットを使用して、AMI のブートモードを確認します。

```
Get-EC2Image -Region us-east-1 `
    -ImageId ami-0abcdef1234567890 | Format-List Name, BootMode, TpmSupport
```

以下は出力の例です。

```
Name       : TPM-Windows_Server-2016-English-Full-Base-2023.05.10
BootMode   : uefi
TpmSupport : v2.0
```

出力で、`BootMode` という値は AMI のブートモードを示しています。`uefi` という値により、その AMI が UEFI をサポートしていることを示します。`uefi-preferred` の値により、その AMI が UEFI とレガシー BIOS の両方をサポートしていることを示されます。値がない場合、AMI から起動されるインスタンスは、インスタンスタイプのデフォルト値を使用します。

------

# EC2 インスタンスタイプがサポートしているブートモードを確認する
<a name="instance-type-boot-mode"></a>

インスタンスタイプがサポートしているブートモードを確認できます。

Amazon EC2 コンソールには、インスタンスタイプがサポートしているブートモードは表示されません。

------
#### [ AWS CLI ]

[https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) コマンドを使用して、インスタンスタイプがサポートしているブートモードを確認します。`--query` パラメータは、サポートされているブートモードのみを返すように出力をフィルタリングします。

次の例では、指定されたインスタンスタイプが UEFI ブートモードとレガシー BIOS ブートモードの両方をサポートしていることを示しています。

```
aws ec2 describe-instance-types \
    --instance-types m5.2xlarge \
    --query "InstanceTypes[*].SupportedBootModes"
```

以下は出力の例です。

```
[
    [
        "legacy-bios",
        "uefi"
    ]
]
```

次の例は、`t2.xlarge` がレガシー BIOS のみをサポートしていることを示しています。

```
aws ec2 describe-instance-types \
    --instance-types t2.xlarge \
    --query "InstanceTypes[*].SupportedBootModes"
```

以下は出力の例です。

```
[
    [
        "legacy-bios"
    ]
]
```

------
#### [ PowerShell ]

[https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) コマンドレットを使用して、インスタンスタイプがサポートしているブートモードを確認します。

次の例では、`m5.2xlarge` が UEFI ブートモードとレガシー BIOS ブートモードの両方をサポートしていることを示しています。

```
Get-EC2InstanceType -InstanceType m5.2xlarge | Format-List InstanceType, SupportedBootModes
```

以下は出力の例です。

```
InstanceType       : m5.2xlarge
SupportedBootModes : {legacy-bios, uefi}
```

次の例は、`t2.xlarge` がレガシー BIOS のみをサポートしていることを示しています。

```
Get-EC2InstanceType -InstanceType t2.xlarge | Format-List InstanceType, SupportedBootModes
```

以下は出力の例です。

```
InstanceType       : t2.xlarge
SupportedBootModes : {legacy-bios}
```

------

**UEFI をサポートするインスタンスタイプを確認するには**  
UEFI をサポートするインスタンスタイプを確認できます。Amazon EC2 コンソールには、インスタンスタイプの UEFI のサポートは表示されません。

------
#### [ AWS CLI ]

利用可能なインスタンスタイプは、AWS リージョン ごとに異なります。リージョンで使用可能であり、UEFI をサポートしているインスタンスタイプを確認するには、[describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) コマンドを使用します。`--filters` パラメータを含めることで結果の範囲を UEFI をサポートするインスタンスタイプに規定し、`--query` パラメータを含めることで出力の範囲を `InstanceType` の値に規定します。

```
aws ec2 describe-instance-types \
    --filters Name=supported-boot-mode,Values=uefi \
    --query "InstanceTypes[*].[InstanceType]" --output text | sort
```

------
#### [ PowerShell ]

利用可能なインスタンスタイプは、AWS リージョン ごとに異なります。リージョンで使用可能であり、UEFI をサポートしているインスタンスタイプを確認するには、[Get-EC2InstanceType](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) コマンドレットを使用します。

```
Get-EC2InstanceType | `
	Where-Object {$_.SupportedBootModes -Contains "uefi"} | `
	Sort-Object InstanceType | `
	Format-Table InstanceType -GroupBy CurrentGeneration
```

------

**UEFI 安全ブート をサポートし不揮発性変数を保持する、インスタンスタイプを確認するには**  
ベアメタルインスタンスでは UEFI 安全ブート と不揮発性変数はサポートされないため、以下の例では出力から除外します。UEFI 安全ブート の詳細については、「[Amazon EC2 インスタンスの UEFI 安全ブート](uefi-secure-boot.md)」を参照してください。

------
#### [ AWS CLI ]

[describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) コマンドを使用し、出力からベアメタルインスタンスを除外します。

```
aws ec2 describe-instance-types \
    --filters Name=supported-boot-mode,Values=uefi Name=bare-metal,Values=false \
    --query "InstanceTypes[*].[InstanceType]" \
    --output text | sort
```

------
#### [ PowerShell ]

[Get-EC2InstanceType](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) コマンドレットを使用し、出力からベアメタルインスタンスを除外します。

```
Get-EC2InstanceType | `
    Where-Object { `
        $_.SupportedBootModes -Contains "uefi" -and `
        $_.BareMetal -eq $False
        } | `
    Sort-Object InstanceType  | `
    Format-Table InstanceType, SupportedBootModes, BareMetal, `
        @{Name="SupportedArchitectures"; Expression={$_.ProcessorInfo.SupportedArchitectures}}
```

------

# EC2 インスタンスのブートモードを確認する
<a name="instance-boot-mode"></a>

インスタンスのブートモードは、Amazon EC2 コンソールの **[ブートモード]** フィールドに表示され、AWS CLI の `currentInstanceBootMode` パラメータによって表示されます。

インスタンスの起動時、そのブートモードパラメータの値は、インスタンスの起動に使用された AMI のブートモードパラメータの値によって決まります。
+ `uefi` のブートモードパラメータを持つ AMI は、`uefi` の `currentInstanceBootMode` パラメータを持つインスタンスを作成します。
+ `legacy-bios` のブートモードパラメータを持つ AMI は、` legacy-bios` の `currentInstanceBootMode` パラメータを持つインスタンスを作成します。
+ `uefi-preferred` のブートモードパラメータを持つ AMI は、インスタンスタイプが UEFI をサポートしている場合はという `uefi` の `currentInstanceBootMode` パラメータを持つインスタンスを作成します。それ以外の場合は、`legacy-bios` の `currentInstanceBootMode` パラメータがのインスタンスを作成します。
+ ブートモードのパラメータ値を持たない AMI は、AMI アーキテクチャが ARM か x86 か、サポートされているインスタンスタイプのブートモードによって決まる `currentInstanceBootMode` パラメータ値を持つインスタンスを作成します。デフォルトのブートモードは、重力子 インスタンスタイプでは `uefi`、Intel と AMD インスタンスタイプでは `legacy-bios` です。

------
#### [ Console ]

**インスタンスのブートモードを確認するには ()**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで [**インスタンス**] を選択し、インスタンスを選択してください。

1. [**詳細**] タブを開き、[**ブートモード**] フィールドを確認します。

------
#### [ AWS CLI ]

**インスタンスのブートモードを確認するには ()**  
インスタンスのブートモードを決定するには [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) を使用します。インスタンスの作成に使用された AMI のブートモードを確認することもできます。

```
aws ec2 describe-instances \
    --region us-east-1 \
    --instance-ids i-1234567890abcdef0 \
    --query Reservations[].Instances[].BootMode \
    --output text
```

以下は出力の例です。

```
uefi
```

------
#### [ PowerShell ]

**インスタンスのブートモードを確認するには ()**  
インスタンスのブートモードを決定するには [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) コマンドレットを使用します。インスタンスの作成に使用された AMI のブートモードを確認することもできます。

```
(Get-EC2Instance `
    -InstanceId i-1234567890abcdef0).Instances | Format-List BootMode, CurrentInstanceBootMode, InstanceType, ImageId
```

以下は出力の例です。

```
BootMode                : uefi
CurrentInstanceBootMode : uefi
InstanceType            : c5a.large
ImageId                 : ami-0abcdef1234567890
```

------

# EC2 インスタンスのオペレーティングシステムのブートモードを確認する
<a name="os-boot-mode"></a>

Amazon EC2 のブートモードは AMI のブートモードに従います。このブートモードがインスタンスの起動に使用されます。インスタンスのオペレーティングシステムが UEFI 用に設定されているかどうかを確認するには、SSH (Linux インスタンス) または RDP (Windows インスタンス) を使用してインスタンスに接続する必要があります。

インスタンスのオペレーティングシステムの説明を使用してください。

## Linux
<a name="os-boot-mode-linux"></a>

**インスタンスのオペレーティングシステムのブートモードを特定するには**

1. [SSH を使用しての Linux インスタンスへの接続](connect-linux-inst-ssh.md)

1. オペレーティングシステムのブートモードを表示するには、以下のいずれかを実行します。
   + 以下のコマンドを実行してください。

     ```
     [ec2-user ~]$ sudo /usr/sbin/efibootmgr
     ```

     UEFI ブートモードで起動されたインスタンスで想定される出力

     ```
     BootCurrent: 0001
     Timeout: 0 seconds
     BootOrder: 0000,0001
     Boot0000* UiApp
     Boot0001* UEFI Amazon Elastic Block Store vol-xyz
     ```
   + 次のコマンドを実行して、`/sys/firmware/efi` ディレクトリが存在するか確認します。このディレクトリは、インスタンスが UEFI を使用して起動する場合のみ存在します。このディレクトリが存在しない場合、このコマンドは `Legacy BIOS Boot Detected` を返します。

     ```
     [ec2-user ~]$ [ -d /sys/firmware/efi ] && echo "UEFI Boot Detected" || echo "Legacy BIOS Boot Detected"
     ```

     UEFI ブートモードで起動されたインスタンスで想定される出力

     ```
     UEFI Boot Detected
     ```

     レガシー BIOS ブートモードで起動されたインスタンスで想定される出力

     ```
     Legacy BIOS Boot Detected
     ```
   + 次のコマンドを実行して、`dmesg` 出力に EFI が 含まれていることを確認します。

     ```
     [ec2-user ~]$ dmesg | grep -i "EFI"
     ```

     UEFI ブートモードで起動されたインスタンスで想定される出力

     ```
     [    0.000000] efi: Getting EFI parameters from FDT:
     [    0.000000] efi: EFI v2.70 by EDK II
     ```

## Server
<a name="os-boot-mode-windows"></a>

**インスタンスのオペレーティングシステムのブートモードを特定するには**

1. [RDP を使用しての Windows インスタンスへの接続](connecting_to_windows_instance.md)

1. [**システム情報**] を開き、[**BIOS モード**] 行を確認します。  
![\[システム情報ウィンドウに、選択した BIOS モード行が表示されます。BIOS モードの値はレガシーです。\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/BIOS-mode-win.png)

# Amazon EC2 AMI のブートモードを設定する
<a name="set-ami-boot-mode"></a>

デフォルトでは、AMI には、その作成に使用される EC2 インスタンスのブートモードが継承されます。例えば、レガシー BIOS で実行されている EC2 インスタンスから AMI を作成する場合、新しい AMI のブートモードは `legacy-bios` になります。ブートモードが `uefi-preferred` の EC2 インスタンスから AMI を作成する場合、新しい AMI のブートモードは `uefi-preferred` になります。

AMI を登録する際に、AMI のブートモードを `uefi`、`legacy-bios`、または `uefi-preferred` に設定できます。

AMI ブートモードを `uefi-preferred` に設定すると、インスタンスは次のように起動します。
+ UEFI とレガシー BIOS の両方をサポートするインスタンスタイプ (例えば `m5.large` など) の場合、インスタンスは UEFI を使用して起動します。
+ レガシー BIOS のみをサポートするインスタンスタイプ (例えば `m4.large` など) の場合、インスタンスはレガシー BIOS を使用して起動します。

AMI ブートモードを `uefi-preferred` に設定した場合、オペレーティングシステムは UEFI と Legacy BIOS の両方を起動する機能をサポートしている必要があります。

既存のレガシー BIOS ベースのインスタンスを UEFI に、または既存の UEFI ベースのインスタンスをレガシー BIOS に変換するには、まず、選択したブートモードをサポートするように、インスタンスのボリュームとオペレーティングシステムを変更する必要があります。次に、ボリュームのスナップショットを作成します。最後に、スナップショットから AMI を作成します。

**考慮事項**
+ AMI ブートモードパラメータを設定しても、オペレーティングシステムは指定されたブートモードに自動的に変更されません。最初に、インスタンスのボリュームとオペレーティングシステムに対し、選択したブートモードを使用した起動をサポートするための適切な変更を加える必要があります。これを行わないと、作成される AMI を使用できません。例えば、レガシー BIOS ベースの Windows インスタンスを UEFI に変換する場合、Microsoft の [MBR2GPT](https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt) ツールを使用して、システムディスクを MBR から GPT に変換できます。ここでの変更内容は、オペレーティングシステムにより異なります。詳細については、オペレーティングシステムのマニュアルを参照してください。
+ [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) コマンドまたは [https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) コマンドレットを使用して、[NitroTPM](nitrotpm.md) と UEFI Preferred の両方をサポートする AMI を作成することはできません。
+ UEFI セキュアブートなどの一部の機能は、UEFI で起動するインスタンスでのみ使用できます。UEFI をサポートしないインスタンスタイプで `uefi-preferred` AMI ブートモードパラメータを使用すると、インスタンスはレガシー BIOS として起動し、UEFI 依存機能は無効になります。UEFI に依存する機能の可用性を重視する場合は、AMI ブートモードパラメータを `uefi` に設定します。

------
#### [ AWS CLI ]

**AMI のブートモードを設定するには**

1. インスタンスのボリュームとオペレーティングシステムに対し、選択したブートモードでの起動をサポートするための適切な変更を加えます。ここでの変更内容は、オペレーティングシステムにより異なります。詳細については、オペレーティングシステムのマニュアルを参照してください。
**警告**  
このステップを実行しないと、AMI は使用不可能になります。

1. インスタンスのボリューム ID を、[https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) コマンドを使用して確認します。次のステップでは、このボリュームのスナップショットを作成します。

   ```
   aws ec2 describe-instances \
       --instance-ids i-1234567890abcdef0 \
       --query Reservations[].Instances[].BlockDeviceMappings
   ```

   以下は出力の例です。

   ```
   [
       [
           {
               "DeviceName": "/dev/xvda",
               "Ebs": {
                   "AttachTime": "2024-07-11T01:05:51+00:00",
                   "DeleteOnTermination": true,
                   "Status": "attached",
                   "VolumeId": "vol-1234567890abcdef0"
               }
           }
       ]
   ]
   ```

1. ボリュームのスナップショットを作成するには、[https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshot.html) コマンドを使用します。前のステップで取得したボリューム ID を使用します。

   ```
   aws ec2 create-snapshot \
       --volume-id vol-01234567890abcdef \
       --description "my snapshot"
   ```

   以下は出力の例です。

   ```
   {
       "Description": "my snapshot",
       "Encrypted": false,
       "OwnerId": "123456789012",
       "Progress": "",
       "SnapshotId": "snap-0abcdef1234567890",
       "StartTime": "",
       "State": "pending",
       "VolumeId": "vol-01234567890abcdef",
       "VolumeSize": 30,
       "Tags": []
   }
   ```

1. スナップショットの状態が `completed` になるまで待ってから、次のステップに進みます。スナップショットの状態を取得するには、[https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html) コマンドを前のステップのスナップショット ID と共に使用します。

   ```
   aws ec2 describe-snapshots \
       --snapshot-ids snap-0abcdef1234567890 \
       --query Snapshots[].State \
       --output text
   ```

   以下は出力の例です。

   ```
   completed
   ```

1. 新しい AMI を作成するには、[https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) コマンドを使用します。**CreateSnapshot** の出力の `SnapshotId` の値を使用します。
   + ブートモードを UEFI に設定するには、`uefi` の値を使用した `--boot-mode` パラメータを追加します。

     ```
     aws ec2 register-image \
        --description "my image" \
        --name "my-image" \
        --block-device-mappings "DeviceName=/dev/sda1,Ebs={SnapshotId=snap-0abcdef1234567890,DeleteOnTermination=true}" \
        --root-device-name /dev/sda1 \
        --virtualization-type hvm \
        --ena-support \
        --boot-mode uefi
     ```
   + ブートモードを `uefi-preferred` に設定するには、`--boot-mode` の値を `uefi-preferred` に設定します

     ```
     aws ec2 register-image \
        --description "my description" \
        --name "my-image" \
        --block-device-mappings "DeviceName=/dev/sda1,Ebs={SnapshotId=snap-0abcdef1234567890,DeleteOnTermination=true}" \
        --root-device-name /dev/sda1 \
        --virtualization-type hvm \
        --ena-support \
        --boot-mode uefi-preferred
     ```

1. (オプション) 新しく作成した AMI が、指定したブートモードに設定されていることを確認するには、[https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) コマンドを使用します。

   ```
   aws ec2 describe-images \
       --image-id ami-1234567890abcdef0 \
       --query Images[].BootMode \
       --output text
   ```

   以下は出力の例です。

   ```
   uefi
   ```

------
#### [ PowerShell ]

**AMI のブートモードを設定するには**

1. インスタンスのボリュームとオペレーティングシステムに対し、選択したブートモードでの起動をサポートするための適切な変更を加えます。ここでの変更内容は、オペレーティングシステムにより異なります。詳細については、オペレーティングシステムのマニュアルを参照してください。
**警告**  
このステップを実行しないと、AMI は使用不可能になります。

1. インスタンスのボリューム ID を確認するには、[https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) コマンドレットを使用します。

   ```
   (Get-EC2Instance `
       -InstanceId i-1234567890abcdef0).Instances.BlockDeviceMappings.Ebs
   ```

   以下は出力の例です。

   ```
   AssociatedResource  : 
   AttachTime          : 7/11/2024 1:05:51 AM
   DeleteOnTermination : True
   Operator            : 
   Status              : attached
   VolumeId            : vol-01234567890abcdef
   ```

1. ボリュームのスナップショットを作成するには、[https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Snapshot.html) コマンドレットを使用します。前のステップで取得したボリューム ID を使用します。

   ```
   New-EC2Snapshot `
       -VolumeId vol-01234567890abcdef `
       -Description "my snapshot"
   ```

   以下は出力の例です。

   ```
   AvailabilityZone          : 
   Description               : my snapshot
   Encrypted                 : False
   FullSnapshotSizeInBytes   : 0
   KmsKeyId                  : 
   OwnerId                   : 123456789012
   RestoreExpiryTime         : 
   SnapshotId                : snap-0abcdef1234567890
   SseType                   : 
   StartTime                 : 4/25/2025 6:08:59 PM
   State                     : pending
   StateMessage              : 
   VolumeId                  : vol-01234567890abcdef
   VolumeSize                : 30
   ```

1. スナップショットの状態が `completed` になるまで待ってから、次のステップに進みます。スナップショットの状態を取得するには、[https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html) コマンドレットを前のステップのスナップショット ID と共に使用します。

   ```
   (Get-EC2Snapshot `
       -SnapshotId snap-0abcdef1234567890).State.Value
   ```

   以下は出力の例です。

   ```
   completed
   ```

1. 新しい AMI を作成するには、[https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) コマンドレットを使用します。**New-EC2Snapshot** の出力の `SnapshotId` の値を使用します。
   + ブートモードを UEFI に設定するには、`uefi` の値を使用した `-BootMode` パラメータを追加します。

     ```
     $block = @{SnapshotId=snap-0abcdef1234567890}
     Register-EC2Image ` 
        -Description "my image" `
        -Name "my-image" `
        -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
        -RootDeviceName /dev/xvda `
        -EnaSupport $true `
        -BootMode uefi
     ```
   + ブートモードを `uefi-preferred` に設定するには、`-BootMode` の値を `uefi-preferred` に設定します

     ```
     $block = @{SnapshotId=snap-0abcdef1234567890}
     Register-EC2Image ` 
        -Description "my image" `
        -Name "my-image" `
        -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
        -RootDeviceName /dev/xvda `
        -EnaSupport $true `
        -BootMode uefi-preferred
     ```

1. (オプション) 新しく作成した AMI が、指定したブートモードに設定されていることを確認するには、[https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) コマンドレットを使用します。

   ```
   (Get-EC2Image `
       -ImageId ami-1234567890abcdef0).BootMode.Value
   ```

   以下は出力の例です。

   ```
   uefi
   ```

------

# Amazon EC2 インスタンスの UEFI 変数
<a name="uefi-variables"></a>

ブートモードが UEFI に設定されているインスタンスを起動すると、変数の key-value ストアが作成されます。このストアは、UEFI およびインスタンスオペレーティングシステムで UEFI 変数を格納するために使用できます。

UEFI 変数は、ブートローダーとオペレーティングシステムにより使用されるもので、システムの起動初期における処理を指定します。これにより、オペレーティングシステムは、(ブート順序や UEFI 安全ブート キーの管理など) ブートプロセスに関する特定の設定を行えます。

**警告**  
インスタンス (およびインスタンス上で実行されている可能性のある任意のソフトウェア) に接続できるユーザー、またはインスタンスで [GetInstanceUefiData](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceUefiData.html) API を使用するアクセス許可を持つユーザーは誰でも変数を読み取ることができます。パスワードや個人識別情報などの機密データを UEFI 変数ストアに保存しないでください。

**UEFI 変数の永続性**
+ 2022 年 5 月 10 日以前に起動されたインスタンスの UEFI 変数は、再起動または停止時に消去されます。
+ 2022 年 5 月 11 日以降に起動されたインスタンスの場合、不揮発性として設定された UEFI 変数であれば、再起動および停止/開始時にも保持されます。
+ ベアメタルインスタンスの場合は、インスタンスの停止/開始オペレーションの全体を通して、不揮発性の UEFI 変数は保持されません。

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