

# Amazon EC2 부팅 모드를 사용한 인스턴스 시작 동작
<a name="ami-boot"></a>

컴퓨터가 부팅될 때 실행되는 첫 번째 소프트웨어는 플랫폼을 초기화하고 운영 체제가 플랫폼별 작업을 수행할 수 있는 인터페이스를 제공합니다.

Amazon EC2에서는 부팅 모드 소프트웨어의 두 가지 변형, 즉 통합 확장 가능 펌웨어 인터페이스(UEFI)와 레거시 BIOS입니다.

**AMI에서 가능한 부팅 모드 파라미터**  
AMI는 부트 모드 파라미터 값인 `uefi`, `legacy-bios` 또는 `uefi-preferred` 중에서 하나를 가질 수 있습니다. AMI 부트 모드 파라미터는 선택 사항입니다. 부팅 모드 파라미터가 없는 AMI의 경우 이러한 AMI에서 시작된 인스턴스는 인스턴스 유형의 기본 부팅 모드 값을 사용합니다.

**AMI 부팅 모드 파라미터의 목적**  
AMI 부팅 모드 파라미터는 인스턴스를 시작할 때 사용할 부팅 모드를 Amazon EC2에 알립니다. 부팅 모드 파라미터가 `uefi`로 설정되면 EC2는 인스턴스를 UEFI에서 시작하려고 시도합니다. 운영 체제가 UEFI를 지원하도록 구성되지 않은 경우에는 인스턴스 시작에 실패할 수 있습니다.

**UEFI 기본 부팅 모드 파라미터**  
`uefi-preferred` 부팅 모드 파라미터를 사용하여 UEFI와 레거시 BIOS를 모두 지원하는 AMI를 생성할 수 있습니다. 부팅 모드 파라미터가 `uefi-preferred`로 설정되고 인스턴스 유형이 UEFI를 지원하는 경우 인스턴스가 UEFI에서 시작됩니다. 인스턴스 유형이 UEFI를 지원하지 않는 경우 인스턴스는 레거시 BIOS에서 시작됩니다.

**주의**  
UEFI 보안 부팅과 같은 일부 기능은 UEFI에서 부팅하는 인스턴스에서만 사용할 수 있습니다. UEFI를 지원하지 않는 인스턴스 유형과 함께 `uefi-preferred` AMI 부팅 모드 파라미터를 사용하면 인스턴스가 레거시 BIOS로 시작되고 UEFI 종속 기능이 비활성화됩니다. UEFI 종속 기능의 가용성에 의존하는 경우 AMI 부팅 모드 파라미터를 `uefi`로 설정하세요.

**인스턴스 유형별 기본 부팅 모드**
+ Graviton 인스턴스 유형: UEFI
+ 인텔 및 AMD 인스턴스 유형: 레거시 BIOS

**영역 지원**  
UEFI 부팅은 Wavelength Zone에서 지원되지 않습니다.

**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**  
AMI는 UEFI에 대해 다음과 같이 구성되어야 합니다.  
+ **운영 체제** – 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(Graviton 인스턴스 유형만 해당)
다른 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 시스템에 구축된 모든 인스턴스는 UEFI와 레거시 BIOS를 모두 지원합니다. 단, 베어 메탈 인스턴스, DL1, G4ad, P4, u-3tb1, u-6tb1, u-9tb1, u-12tb1, u-18tb1, u-24tb1 및 VT1은 예외입니다. 자세한 내용은 [EC2 인스턴스 유형의 지원되는 부팅 모드 결정](instance-type-boot-mode.md) 섹션을 참조하세요.

다음 표에서는 인스턴스의 부팅 모드(**결과 인스턴스 부팅 모드** 열로 표시됨)가 AMI의 부팅 모드 파라미터(열 1), AMI에 포함된 운영 체제의 부팅 모드 구성(열 2), 인스턴스 유형의 부팅 모드 지원(열 3)을 조합하여 결정된다는 것을 보여줍니다.


| AMI 부팅 모드 파라미터 | 운영 체제 부팅 모드 구성 | 인스턴스 유형 부팅 모드 지원 | 결과 인스턴스 부팅 모드 | 
| --- | --- | --- | --- | 
| UEFI | UEFI | UEFI | UEFI | 
| 레거시 BIOS | 레거시 BIOS | 레거시 BIOS | 레거시 BIOS | 
| UEFI 기본 | UEFI | UEFI | UEFI | 
| UEFI 기본 | UEFI | UEFI 및 레거시 BIOS | UEFI | 
| UEFI 기본 | 레거시 BIOS | 레거시 BIOS | 레거시 BIOS | 
| UEFI 기본 | 레거시 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에서 시작된 인스턴스는 인스턴스 유형의 기본값(Graviton의 경우에 `uefi`, Intel 및 AMD 인스턴스 유형의 경우에 `legacy-bios`)을 사용합니다.

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

**AMI의 부팅 모드 파라미터를 확인하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **AMI**를 선택한 후에 AMI를 선택합니다.

1. **부트 모드** 필드를 검사합니다.
   + **uefi** 값은 UEFI가 AMI에서 지원된다는 것을 나타냅니다.
   + **uefi-preferred** 값은 UEFI와 레거시 BIOS가 모두 AMI에서 지원된다는 것을 나타냅니다.
   + 값이 없으면 AMI에서 시작된 인스턴스에서는 인스턴스 유형의 기본값을 사용합니다.

**인스턴스 시작 시 AMI의 부팅 모드 파라미터를 확인하려면**  
인스턴스 시작 마법사를 사용하여 인스턴스를 시작하는 경우에는 AMI를 선택하는 단계에서 **부트 모드** 필드를 검사합니다. 자세한 내용은 [애플리케이션 및 OS 이미지(Amazon Machine Image)](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) cmdlet을 사용하여 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"
    ]
]
```

다음 예시에서는 레거시 BIOS만 지원하는 `t2.xlarge`를 보여 줍니다.

```
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) cmdlet을 사용하여 인스턴스 유형의 지원되는 부팅 모드를 확인합니다.

다음 예시에서는 `m5.2xlarge`가 UEFI 및 레거시 BIOS 부트 모드를 모두 지원하는 사례를 보여줍니다.

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

다음은 예제 출력입니다.

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

다음 예시에서는 레거시 BIOS만 지원하는 `t2.xlarge`를 보여 줍니다.

```
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) 명령을 사용합니다. UEFI를 지원하는 인스턴스 유형으로 결과 범위를 지정하려면 `--filters` 파라미터를 포함하고 `InstanceType` 값으로 출력 범위를 지정하려면 `--query` 파라미터를 포함합니다.

```
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) cmdlet을 사용합니다.

```
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) cmdlet을 사용하고 출력에서 베어 메탈 인스턴스를 제외합니다.

```
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는 `currentInstanceBootMode` 파라미터가 `uefi`인 인스턴스를 생성합니다.
+ 부팅 모드 파라미터가 `legacy-bios`인 AMI는 `currentInstanceBootMode` 파라미터가 ` legacy-bios`인 인스턴스를 생성합니다.
+ 부팅 모드 파라미터가 `uefi-preferred`인 AMI는 인스턴스 유형이 UEFI를 지원하는 경우 `currentInstanceBootMode` 파라미터가 `uefi`인 인스턴스를 생성하고, 그렇지 않으면 `currentInstanceBootMode` 파라미터가 `legacy-bios`인 인스턴스를 생성합니다.
+ 부팅 모드 파라미터 값이 없는 AMI는 AMI 아키텍처가 ARM인지 x86인지 여부와 인스턴스 유형에서 지원되는 부팅 모드에 따라 달라지는 `currentInstanceBootMode` 파라미터 값을 가진 인스턴스를 생성합니다. 기본 부팅 모드는 Graviton 인스턴스 유형에서 `uefi`, Intel 및 AMD 인스턴스 유형에서 `legacy-bios`입니다.

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

**인스턴스의 부팅 모드를 확인하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon 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) cmdlet을 사용하여 인스턴스의 부팅 모드를 확인합니다. 또한 인스턴스 생성에 사용된 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>

AMI의 부팅 모드는 인스턴스를 부팅하는 데 사용할 부팅 모드를 Amazon EC2에 안내합니다. 인스턴스의 운영 체제가 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
     ```
   + 다음 명령을 실행하여 EFI가 `dmesg` 출력에 표시되는지 확인합니다.

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

     UEFI 부팅 모드로 부팅된 인스턴스의 예상 출력

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

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

**인스턴스 운영 체제의 부팅 모드 확인**

1. [RDP를 사용하여 Windows 인스턴스에 연결합니다](connecting_to_windows_instance.md).

1. **시스템 정보**로 이동하여 **BIOS 모드** 행을 확인합니다.  
![\[선택한 BIOS 모드 행을 보여주는 시스템 정보 창입니다. BIOS 모드의 값은 레거시입니다.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/BIOS-mode-win.png)

# Amazon EC2 AMI의 부팅 모드 설정
<a name="set-ami-boot-mode"></a>

기본적으로 AMI는 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와 레거시 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) cmdlet을 사용하여 [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` 상태가 될 때까지 기다렸다가 다음 단계로 이동합니다. 스냅샷의 상태를 가져오려면 이전 단계에서 얻은 스냅샷 ID와 함께 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html) 명령을 사용합니다.

   ```
   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) cmdlet을 사용합니다.

   ```
   (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) cmdlet을 사용합니다. 이전 단계의 볼륨 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` 상태가 될 때까지 기다렸다가 다음 단계로 이동합니다. 스냅샷의 상태를 가져오려면 이전 단계에서 얻은 스냅샷 ID와 함께 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html) cmdlet을 사용합니다.

   ```
   (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) cmdlet을 사용합니다. **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) cmdlet을 사용합니다.

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

   다음은 예제 출력입니다.

   ```
   uefi
   ```

------

# Amazon EC2 인스턴스의 UEFI 변수
<a name="uefi-variables"></a>

부팅 모드가 UEFI로 설정된 인스턴스를 시작하면 변수에 대한 키-값 스토어가 생성됩니다. 스토어는 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**
+ [UEFI 보안 부팅이 Amazon EC2 인스턴스에서 작동하는 방식](how-uefi-secure-boot-works.md)
+ [Amazon EC2의 UEFI 보안 부팅 요구 사항](launch-instance-with-uefi-sb.md)
+ [UEFI 보안 부팅에 대해 Amazon EC2 인스턴스가 활성화되어 있는지 확인](verify-uefi-secure-boot.md)
+ [사용자 지정 UEFI 보안 부팅 키를 사용하여 Linux AMI 생성](create-ami-with-uefi-secure-boot.md)
+ [UEFI 보안 부팅에 대한 AWS 바이너리 blob 생성](aws-binary-blob-creation.md)

# UEFI 보안 부팅이 Amazon EC2 인스턴스에서 작동하는 방식
<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 데이터베이스는 서명(db) 및 거부 목록(dbx) 데이터베이스를 업데이트하기 위해 신뢰 체인에 사용되는 퍼블릭 KEK 키 목록입니다.  
퍼블릭 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 보안 부팅](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 보안 부팅을 위해 사전 구성된 AWS Windows AMI를 찾으려면 *AWS Windows AMIs Reference*의 [Find Windows Server AMIs configured with NitroTPM and UEFI Secure Boot](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 보안 부팅을 지원하지 않습니다.

# UEFI 보안 부팅에 대해 Amazon EC2 인스턴스가 활성화되어 있는지 확인
<a name="verify-uefi-secure-boot"></a>

다음 절차에 따라 UEFI 보안 부팅에 대해 Amazon EC2가 활성화되어 있는지 확인할 수 있습니다.

## Linux 인스턴스
<a name="verify-uefi-secure-boot-linux"></a>

`mokutil` 유틸리티를 사용하여 Linux 인스턴스가 UEFI 보안 부팅을 사용하도록 설정되어 있는지 확인할 수 있습니다. 인스턴스에 `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 배포는 관련 문서를 참조하세요.

**UEFI 보안 부팅에 대해 Linux 인스턴스가 활성화되어 있는지 확인**  
인스턴스에 연결하고 터미널 창에서 `root`로 다음 명령을 실행합니다.

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

다음은 예제 출력입니다.
+ UEFI 보안 부팅이 활성화된 경우 출력에 `SecureBoot enabled`가 포함됩니다.
+ UEFI 보안 부팅이 활성화되지 않은 경우 출력에 `SecureBoot disabled` 또는 `Failed to read SecureBoot`가 포함됩니다.

## Windows 인스턴스
<a name="verify-uefi-secure-boot-windows"></a>

**UEFI 보안 부팅에 대해 Windows 인스턴스가 활성화되어 있는지 확인**

1. 인스턴스에 연결합니다.

1. msinfo32 도구를 엽니다.

1. **보안 부팅 상태(Secure Boot State)** 필드를 확인합니다. UEFI 보안 부팅이 활성화된 경우 값은 다음 이미지와 같이 **지원됨**입니다.  
![\[시스템 정보 내의 보안 부팅 상태입니다.\]](http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/images/secure-boot-state-win.png)

Windows PowerShell Cmdlet `Confirm-SecureBootUEFI`를 사용하여 보안 부팅 상태를 확인할 수도 있습니다. cmdlet에 대한 자세한 내용은 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 사용 설명서*의 [AL2023의 UEFI 보안 부팅](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-dat](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) 명령
+ Linux 인스턴스는 UEFI 부팅 모드를 지원하는 Linux AMI로 시작되고 비휘발성 데이터가 있어야 합니다.

UEFI 보안 부팅 키 없이 새로 생성된 인스턴스는 `SetupMode`에 생성됩니다. 이를 통해 자체 키를 등록할 수 있습니다. 일부 AMI는 UEFI 보안 부팅으로 사전 구성되어 제공되며 기존 키를 변경할 수 없습니다. 키를 변경하려면 원래 AMI를 기반으로 새 AMI를 생성해야 합니다.

변수 스토어에 키를 전파하는 방법에는 두 가지가 있습니다. 이들 방법은 다음에 나오는 옵션 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)의 세 가지 키 데이터베이스를 기반으로 합니다.¹

인스턴스에서 각 키를 생성합니다. 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를 업데이트하는 데 사용되며, KEK는 승인된 키를 서명 데이터베이스(db)에 추가하는 데 사용할 수 있습니다.

X.509 표준은 키 페어를 생성하는 데 사용됩니다. 표준에 대한 자세한 내용은 *Wikipedia*의 [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. 프라이빗 PK(자체 서명)로 UEFI 서명 목록에 서명합니다.

   ```
   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 생성 및 이미지 서명을 위한 명령은 ArchWiki 유지 관리 팀 및/또는 ArchWiki 기고자가 작성한 [키 생성](https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Creating_keys)에서 가져왔습니다.

## 작업 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에서는 Graviton 기반 인스턴스 유형의 UEFI를 지원하도록 구성된 Linux AMI만 제공합니다. AWS에서는 현재 UEFI 부팅 모드를 지원하는 x86\$164 Linux AMI를 제공하지 않습니다. 모든 아키텍처의 UEFI 부팅 모드를 지원하도록 자체 AMI를 구성할 수 있습니다. UEFI 부팅 모드를 지원하도록 자체 AMI를 구성하려면 자체 AMI에서 여러 구성 단계를 수행해야 합니다. 자세한 내용은 [Amazon EC2 AMI의 부팅 모드 설정](set-ami-boot-mode.md) 섹션을 참조하세요.
+ **인스턴스 유형(Instance type)** - 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` 변수에 쓸 수 있습니다.
+ 아직 등록된 PK가 없으며 이는 `SetupMode` 변수가 `1`인 경우 표시됩니다. 다음 명령을 사용하여 이를 확인합니다. 출력은 `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 보안 부팅이 활성화되었는지 확인하려면 [UEFI 보안 부팅에 대해 Amazon EC2 인스턴스가 활성화되어 있는지 확인](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 지원 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를 사용하여 인스턴스를 시작하면 인스턴스는 동일한 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. 다음 명령을 실행하여 키에서 새 변수 스토어를 생성합니다. 그러면 *your\$1binary\$1blob*.bin에 base64로 인코딩된 바이너리 blob이 생성됩니다. 이 도구는 `-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. 통합 확장 가능 펌웨어 인터페이스 포럼은 더 이상 DBX 파일을 제공하지 않습니다. 이제 Microsoft가 GitHub에서 제공합니다. Microsoft 보안 부팅 업데이트 리포지토리([https://github.com/microsoft/secureboot\$1objects](https://github.com/microsoft/secureboot_objects))에서 최신 DBX 업데이트를 다운로드합니다.

1. 서명된 update-binary의 압축을 풉니다.

   아래 스크립트 콘텐츠로 `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`이라는 두 파일이 생성됩니다. 다음 단계에서 `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
   ```