

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 可驗證的 AMI
<a name="attestable-ami"></a>

可驗證的 AMI 是一種 Amazon Machine Image (AMI)，包含代表其全部內容的對應密碼編譯雜湊。AMI 建立程序期間會生成雜湊，且依據該 AMI 的整個內容進行計算，包括應用程式、程式碼，以及啟動程序。

## 維護可驗證狀態
<a name="maintain-attestability"></a>

執行個體的衡量項基於其初始啟動狀態。啟動之後對執行個體做出任何軟體或程式碼變更，以及重新啟動之後持續存在，都會在重新啟動之後變更執行個體的衡量項。若更改衡量項，則會偏離可驗證的 AMI 的參考衡量項，並且執行個體重新啟動之後，執行個體不再能夠對 AWS KMS 成功進行驗證。因此，為了讓可驗證的 AMI 有用，執行個體需要在重新啟動之後返回其原始啟動狀態。

始終返回原始啟動狀態，能夠確保執行個體在重新啟動之後成功進行驗證。可以使用下面的公用程式，確保執行個體在重新啟動之後仍可驗證：
+ `erofs` – 增強了唯讀檔案系統。此公用程式能確保根檔案系統為唯讀。將此公用程式寫入檔案系統，包括 `/etc`、`/run` 及 `/var`，存放於記憶體，以及在執行個體重新啟動時遺失，並讓根檔案系統處於其原始啟動狀態。若要了解詳細資訊，請參閱 [erofs 文件](https://docs.kernel.org/filesystems/erofs.html)。
+ `dm-verity` – 針對唯讀根檔案系統提供完整性防護。公用程式可計算檔案系統區塊的雜湊，並將其存放於核心命令列。此操作可讓核心在啟動期間確認檔案系統的完整性。若要了解詳細資訊，請參閱 [dm-verity 文件](https://docs.kernel.org/admin-guide/device-mapper/verity.html)。

## 建立可驗證的 AMI 的要求
<a name="ami-attestable-requirements"></a>

可驗證的 AMI 具有以下要求：
+ **基本作業系統** – Amazon Linux 2023 與 [NixOS](https://github.com/aws/nitrotpm-attestation-samples)
+ **架構** – `x86_64` 或 `arm64` 架構
+ **TPM 支援** – 必須啟用 NitroTPM。如需詳細資訊，請參閱[搭配 Amazon EC2 執行個體使用 NitroTPM 的需求](enable-nitrotpm-prerequisites.md)。
+ **啟用模式** – 必須啟用 UEFI 啟動模式。

**Topics**
+ [維護可驗證狀態](#maintain-attestability)
+ [建立可驗證的 AMI 的要求](#ami-attestable-requirements)
+ [建立可驗證的 AMI](#sample-ami)
+ [建置範例映像說明](build-sample-ami.md)
+ [範例 Amazon Linux 2023 映像說明](al2023-isolated-compute-recipe.md)
+ [自訂範例映像說明](customize-sample-ami.md)
+ [運算 PCR 衡量項](create-pcr-compute.md)

## 建立可驗證的 AMI
<a name="sample-ami"></a>

如需建立可驗證的 AMI，您將需要使用 [KIWI Next Generation (KIWI NG)](https://osinside.github.io/kiwi/) 並搭配 Amazon Linux 2023。Amazon Linux 2023 提供了使用 KIWI NG 建置可驗證的 AMI 所需的全部軟體及公用程式。

KIWI NG 是一款開放原始碼工具，可用於建置預先設定的基於 Linux 的映像。KIWI NG 使用可定義映像內容的 XML *映像說明*。映像說明指定了要執行的基本作業系統、軟體、核心組態與指令碼，以便針對特定使用案例來建置即用型 AMI。

AMI 建置期間，您需要使用 `nitro-tpm-pcr-compute` 公用程式，依據 KIWI NG 生成的統一核心映像 (UKI) 來生成參考衡量項。若要了解使用 `nitro-tpm-pcr-compute` 公用程式的相關詳細資訊，請參閱 [使用自訂 AMI 的運算 PCR 衡量項](create-pcr-compute.md)。

AWS 提供範例 Amazon Linux 2023 映像描述，其中包含在隔離的運算環境中設定 EC2 執行個體所需的所有組態。如需詳細資訊，請參閱[建置範例 Amazon Linux 2023 映像說明](build-sample-ami.md)。

# 建置範例 Amazon Linux 2023 映像說明
<a name="build-sample-ami"></a>

AWS 提供範例 Amazon Linux 2023 映像描述，您可以用作為工作負載建立自訂可認證 AMIs起點。範例映像說明包括做為基本作業系統的 Amazon Linux 2023，以及實現檔案系統不可變性的 `dm-verity` 與 `erofs` 組態，並且該說明移除了全部互動式存取權 (例如 SSH、EC2 Instance Connect，以及序列主控台)，以建立隔離式運算環境。若要了解範例映像說明的詳細資訊，請參閱 [Github 儲存庫](https://github.com/amazonlinux/kiwi-image-descriptions-examples)。

範例映像說明可在 `/usr/bin/` 目錄的建置映像中，自動安裝 NitroTPM 工具 (`nitro-tpm-pcr-compute` 與 `nitro-tpm-attest`)。這樣一來，確保工具會預先安裝在透過 AMI 啟動的執行個體上。

範例影像說明包括一個指令碼 `edit_boot_install.sh`，其中包括生成參考衡量項所需的命令。指令碼可將 KIWI NG 建立的原始磁碟映像檔案 (`.raw`) 掛載至迴路裝置，尋找具有 `.efi` 副檔名的 UKI，然後執行 `nitro-tpm-pcr-compute` 公用程式來生成 AMI 的參考衡量項。在建置期間，KIWI NG 可自動執行指令碼。

本教學課程向您介紹了如何建置範例映像說明，以便建立可驗證的 AMI。

若要了解建立自己的映像說明的相關詳細資訊，請參閱下面的 KIWI NG 文件：
+ [Quick Start](https://osinside.github.io/kiwi/quickstart.html)
+ [映像說明](https://osinside.github.io/kiwi/image_description.html)
+ [範例 Amazon Linux 2023 映像說明](https://github.com/amazonlinux/kiwi-image-descriptions-examples)

先決條件

您的 IAM 身分必須具有下列許可才能完成本教學課程：
+ `ebs:CompleteSnapshot`、 `ebs:StartSnapshot`和 `ebs:PutSnapshotBlock`上的 `arn:aws:ec2:*::snapshot/*`
+ `ec2:RegisterImage` 在所有資源上

**如需使用 KIWI NG 來建置範例 Amazon Linux 2023 映像說明**

1. 使用最新的 AL2023 AMI 來啟動 Amazon EC2 執行個體 如需確保執行個體具有足夠的儲存空間以建置 AMI，請確保至少佈建 12 GB 的儲存空間。

1. 安裝所需的依存項目。使用下面的命令可安裝以下公用程式：
   + `kiwi-cli`
   + `veritysetup`
   + `erofs-utils`
   + `aws-nitro-tpm-tools`

   ```
   sudo dnf install -y kiwi-cli python3-kiwi kiwi-systemdeps-core python3-poetry-core qemu-img veritysetup erofs-utils git cargo aws-nitro-tpm-tools
   ```

1. 安裝 `coldsnap` 公用程式。使用此公用程式，您可透過原始映像資料來建立 Amazon EBS 快照。您將使用此公用程式，透過 KIWI NG 建立的原始磁碟映像檔案來建立 EBS 快照。

   ```
   git clone https://github.com/awslabs/coldsnap.git
   cd coldsnap
   cargo install --locked coldsnap
   cd ..
   ```

1. 獲取範例映像說明檔案。

   ```
   sudo dnf install kiwi-image-descriptions-examples
   ```

   範例映像說明檔案可下載至以下目錄：`/usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example`

1. 使用 KIWI NG `system build` 命令來建置範例映像說明。使用下面的命令可在 `./image` 目錄中建立原始磁碟映像檔案。

   ```
   sudo kiwi-ng \
   --color-output \
   --loglevel 0 \
   system build \
   --description /usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example \
   --target-dir ./image
   ```

   若要了解詳細資訊，請參閱 [ kiwi-ng system build](https://osinside.github.io/kiwi/commands/system_build.html) 文件。

1. 獲取 AMI 的參考衡量項。`nitro-tpm-pcr-compute` 公用程式可在上一步驟的映像建置期間生成衡量項。您可在以下檔案中尋找參考衡量項：`./image/pcr_measurements.json`。

   衡量項以下列 JSON 格式提供：

   ```
   {
     "Measurements": {
       "HashAlgorithm": "SHA384 { ... }",
       "PCR4": "PCR4_measurement",
       "PCR7": "PCR7_measurement",
       "PCR12": "PCR12_measurement"
     }
   }
   ```

1. 使用 `coldsnap` 公用程式可上傳 KIWI NG 建立的原始磁碟映像至 EBS 快照。使用命令可傳回快照 ID。請記下 ID，您在後續步驟會用到。

   ```
   SNAPSHOT=$(.cargo/bin/coldsnap upload ./image/al2023*.raw)
   echo "Created snapshot: $SNAPSHOT"
   ```

   若要了解 `coldsnap` 公用程式的相關詳細資訊，請參閱 [coldsnap GitHub 儲存庫](https://github.com/awslabs/coldsnap)。

1. 使用上一步驟的快照，在 UEFI 啟動模式下註冊支援 TPM 2.0 的 AMI。若是 `--architecture`，針對 Intel 指定 `x86_64`，或針對 Graviton 指定 `arm64`。

   ```
   aws ec2 register-image \
   --name "attestable_isolated_al2023_ami" \
   --virtualization-type hvm \
   --boot-mode uefi \
   --architecture x86_64|arm64 \
   --root-device-name /dev/xvda \
   --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=${SNAPSHOT}} \
   --tpm-support v2.0 \
   --ena-support
   ```

# 範例 Amazon Linux 2023 映像說明
<a name="al2023-isolated-compute-recipe"></a>

範例 Amazon Linux 2023 映像說明有以下特性：

1. **統一核心映像 (UKI) 啟動** – 使用單一且簽署的二進位檔啟動，可將核心、`initrd` 及啟動參數組合為一個不可變映像。

1. **唯讀根檔案系統** – 使用增強的唯讀檔案系統 (`erofs`) 搭配 dm-verity 防護，來確保無法修改根檔案系統，以及確保密碼編譯完整性驗證。

1. **臨時堆疊式檔案系統** – 建立允許臨時寫入 `/etc`、`/run` 及 `/var` 等目錄的臨時堆疊式檔案系統。由於此堆疊式檔案系統僅存在於記憶體中，一切變更皆會在執行個體重新啟動後自動遺失，從而確保系統返回到其原始可信狀態。

1. **停用的遠端存取方法** – 移除下面的遠端存取機制以阻止遠端存取：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/al2023-isolated-compute-recipe.html)

   \$1 若要了解詳細資訊，請參閱[映像說明元素](https://osinside.github.io/kiwi/image_description/elements.html#packages-ignore)。

# 針對您的工作負載，自訂範例 Amazon Linux 2023 映像說明
<a name="customize-sample-ami"></a>

您可自訂範例 Amazon Linux 2023 映像說明，以及包括您的特定工作負載所需的軟體套件、指令碼，以及檔案。在 KIWI NG 映像說明中新增或修改各種元素，藉此來實現自訂。

**Topics**
+ [儲存庫管理](#prepare-custom-image-repos)
+ [套件管理](#customize-sample-ami-packages)
+ [新增檔案及目錄](#customize-sample-ami-overlay)
+ [新增自訂指令碼](#customize-sample-ami-script)

## 儲存庫管理
<a name="prepare-custom-image-repos"></a>

範例映像說明預設會包括單一 `<repository>` 元素，其會指向適用於 Amazon Linux 2023 核心儲存庫的鏡像端點。您可視需要新增參考至其他儲存庫，以便從中安裝您的必要軟體。

範例映像說明使用如 `<packagemanager>` 元素中所定義的 `dnf` 套件管理員。

若要了解新增儲存庫的相關詳細資訊，請參閱[設定儲存庫](https://osinside.github.io/kiwi/concept_and_workflow/repository_setup.html)。

## 套件管理
<a name="customize-sample-ami-packages"></a>

範例映像說明預設會包括所需的一切套件，用於針對包含 `erofs` 唯讀檔案系統的隔離式運算環境來建立 Amazon Linux 2023 可驗證的 AMI。

您可新增額外的軟體套件至映像說明中的 `<packages>` 元素，藉此在映像說明中加入這些額外的軟體套件。`<packages>` 元素可定義應安裝至 AMI 的全部軟體。

您亦可使用 `<packages>` 元素，來解除安裝或刪除特定軟體套件。

若要了解在映像說明中新增或移除套件的相關詳細資訊，請參閱[新增及移除套件](https://osinside.github.io/kiwi/concept_and_workflow/packages.html#)。

## 新增檔案及目錄
<a name="customize-sample-ami-overlay"></a>

範例映像說明包括堆疊式樹狀目錄 (`/root/`)。堆疊式樹狀目錄是一個包含檔案與目錄的目錄，這些檔案與目錄會在映像建置程序期間複製到映像中。您在堆疊式樹狀目錄中置放的任何檔案及目錄，都會在映像建置程序期間直接複製到映像的根檔案系統。

安裝全部套件之後，堆疊式樹狀目錄即會複製到映像中。檔案即可新增，且會覆寫現有檔案。

## 新增自訂指令碼
<a name="customize-sample-ami-script"></a>

範例映像說明包括單一自訂指令碼 `edit_boot_install.sh`。此指令碼包括執行 `nitro-tpm-pcr-compute` 公用程式所需的命令，這些命令可依據映像內容生成參考衡量項。安裝啟動載入程式之後，即可呼叫此指令碼。

您可視需要在映像說明中加入您自己的自訂指令碼，以便在映像建置程序期間或首次啟動映像時執行任務或組態。使用指令碼，您能夠以單獨使用映像說明無法實現的方式來自訂您的映像。

如需在您的映像說明中加入自訂指令碼，您需要依據指令碼類型來對指令碼正確命名，然後將其新增至與 `appliance.kiwi` 檔案相同的目錄。若對指令碼正確命名且置於正確位置，KIWI NG 無需在映像說明檔案中明確參考這些指令碼，即可自動偵測及執行指令碼。

若要了解 KIWI NG 支援的指令碼相關詳細資訊，請參閱[使用者定義的指令碼](https://osinside.github.io/kiwi/concept_and_workflow/shell_scripts.html)。

# 使用自訂 AMI 的運算 PCR 衡量項
<a name="create-pcr-compute"></a>

使用 `nitro-tpm-pcr-compute` 公用程式，您可依據統一核心映像 (UKI)，在建置期間針對可驗證的 AMI 生成參考衡量項。

範例 Amazon Linux 2023 映像說明可在 `/usr/bin/` 目錄的建置映像中，自動安裝公用程式。範例映像說明還包括指令碼，其中包含映像建置期間執行公用程式生成參考衡量項所需的命令。若使用範例映像說明，則您無須安裝公用程式或手動執行。如需詳細資訊，請參閱[建置範例 Amazon Linux 2023 映像說明](build-sample-ami.md)。

## 安裝 `nitro-tpm-pcr-compute` 公用程式
<a name="nitro-tpm-compute-install"></a>

若使用 Amazon Linux 2023，則您可如下所示透過 Amazon Linux 儲存庫安裝 `nitro-tpm-pcr-compute` 公用程式。

```
sudo yum install aws-nitro-tpm-tools
```

這些工具皆安裝於 `/usr/bin` 目錄。

## 使用 `nitro-tpm-pcr-compute` 公用程式
<a name="nitro-tpm-compute-use"></a>

公用程式提供了單一命令 `nitro-tpm-pcr-compute` 來生成參考衡量項。

您在執行命令時可指定以下各項：
+ 統一核心映像 (`UKI.efi`) – 標準啟動及 UEFI 的必要項目。

**如需生成可驗證的 AMI 的參考衡量項：**  
請使用下列命令和參數：

```
/usr/bin/nitro-tpm-pcr-compute \
--image UKI.efi
```

公用程式能夠以下列 JSON 格式來傳回參考衡量項：

```
{
  "Measurements": {
    "HashAlgorithm": "SHA384 { ... }",
    "PCR4": "PCR4_measurement",
    "PCR7": "PCR7_measurement",
    "PCR12": "PCR12_measurement"
  }
}
```

若要了解如何使用 `nitro-tpm-pcr-compute` 公用程式的實際範例，請參閱[範例 Amazon Linux 2023 映像說明](build-sample-ami.md)中包括的 `edit_boot_install.sh` 指令碼。