

# 構成証明可能 AMI
<a name="attestable-ami"></a>

構成証明可能 AMI は、すべてのコンテンツを表す対応する暗号化ハッシュを持つ Amazon マシンイメージ (AMI) です。ハッシュは AMI の作成プロセス中に生成され、アプリケーション、コード、起動プロセスなど、その AMI のコンテンツ全体に基づいて計算されます。

## Attestable State の維持
<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**
+ [Attestable State の維持](#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 によって生成された Unified Kernel Image (UKI) に基づいてリファレンス測定値を生成する必要があります。`nitro-tpm-pcr-compute` ユーティリティの使用に関する詳細については、「[カスタム AMI の PCR 測定値を計算する](create-pcr-compute.md)」を参照してください。

AWS は、分離されたコンピューティング環境で EC2 インスタンスを設定するために必要なすべての設定を含む Amazon Linux 2023 のサンプルイメージの説明を提供します。詳細については、「[Amazon Linux 2023 のサンプルイメージの説明を作成する](build-sample-ami.md)」を参照してください。

# Amazon Linux 2023 のサンプルイメージの説明を作成する
<a name="build-sample-ami"></a>

AWS は、ワークロード用に独自のカスタム構成証明可能 AMI を作成するための出発点として使用できる Amazon Linux 2023 のサンプルイメージの説明を提供します。サンプルイメージの説明には、ベースオペレーティングシステムとしての Amazon Linux 2023、ファイルシステムのイミュータビリティ用の `dm-verity` と `erofs` の設定が含まれ、分離されたコンピューティング環境を作成するためにすべてのインタラクティブアクセス (SSH、EC2 インスタンス接続、シリアルコンソールなど) が削除されます。サンプルイメージの説明の詳細については、[Github リポジトリ](https://github.com/amazonlinux/kiwi-image-descriptions-examples)を参照してください。

サンプルイメージの説明では、NitroTPM ツール (`nitro-tpm-pcr-compute` および `nitro-tpm-attest`) が `/usr/bin/` ディレクトリのビルド済みイメージに自動的にインストールされます。これにより、AMI から起動されたインスタンスにツールがプリインストールされます。

サンプルイメージの説明には、リファレンス測定値の生成に必要なコマンドを含むスクリプトである `edit_boot_install.sh` が含まれています。スクリプトは、KIWI NG によって作成された raw ディスクイメージファイル (`.raw`) をループバックデバイスにマウントし、UKI (`.efi` ファイル拡張子を持つ) を見つけ、`nitro-tpm-pcr-compute` ユーティリティを実行して AMI のリファレンス測定値を生成します。スクリプトは、ビルド時に KIWI NG によって自動的に実行されます。

このチュートリアルでは、サンプルイメージの説明を作成して構成証明可能 AMI を作成する方法を示します。

独自のイメージの説明の作成に関する詳細については、次の KIWI NG ドキュメントを参照してください。
+ [クイックスタート](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 アイデンティティに次の許可が必要です。
+ `arn:aws:ec2:*::snapshot/*` に対する `ebs:CompleteSnapshot`、`ebs:StartSnapshot`、`ebs:PutSnapshotBlock`
+ すべてのリソースの `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` ユーティリティをインストールします。このユーティリティを使用すると、raw イメージデータから Amazon EBS スナップショットを作成できます。このユーティリティを使用して、KIWI NG によって作成された raw ディスクイメージファイルから 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` ディレクトリに raw ディスクイメージファイルを作成します。

   ```
   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 によって作成された raw ディスクイメージを EBS スナップショットにアップロードします。コマンドはスナップショット ID を返します。次のステップで必要になるため、ID を書きとめておきます。

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

   `coldsnap` ユーティリティの詳細については、[コールドスナップ GitHub リポジトリ](https://github.com/awslabs/coldsnap)を参照してください。

1. 前のステップのスナップショットを使用して、TPM 2.0 対応 AMI を UEFI ブートモードで登録します。`--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. **Unified Kernel Image (UKI) ブート** – カーネル、`initrd`、およびブートパラメータを 1 つのイミュータブルイメージに結合する単一の署名付きバイナリを使用してブートします。

1. **読み取り専用ルートファイルシステム** – dm-verity 保護で拡張読み取り専用ファイルシステム (`erofs`) を使用して、ルートファイルシステムを変更できなくし、暗号整合性の検証を維持します。

1. **一時オーバーレイファイルシステム** – `/etc`、`/run`、`/var` などのディレクトリへの一時的な書き込みを許可する一時オーバーレイファイルシステムを作成します。このオーバーレイファイルシステムはメモリにのみ存在するため、インスタンスの再起動時にすべての変更が自動的に失われるため、システムは元の信頼された状態に戻ります。

1. **無効なリモートアクセス方法** – リモートアクセスを防ぐために、次のリモートアクセスメカニズムを削除します。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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>

デフォルトでは、サンプルイメージの説明には、Amazon Linux 2023 コアリポジトリのミラーエンドポイントを指す単一の `<repository>` 要素が含まれています。必要に応じて、必要なソフトウェアをインストールする他のリポジトリへの参照を追加できます。

サンプルイメージの説明では、`<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` ユーティリティを使用すると、Unified Kernel Image (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` を提供します。

コマンドの実行時に以下を指定する必要がありますます。
+ Unified Kernel Image (`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` スクリプトを参照してください。