

# 許可された AMI を使用して Amazon EC2 で AMI の検出と使用を制御する
<a name="ec2-allowed-amis"></a>

AWS アカウント での Amazon マシンイメージ (AMI) の検出と使用を制御するには、*許可された AMI* の機能を使用できます。アカウント内で AMI を表示して使用するために満たす必要がある基準を指定します。条件を有効にすると、インスタンスを起動するユーザーは、指定された条件に準拠する AMI のみを表示し、アクセスできます。例えば、信頼された AMI プロバイダーのリストを条件として指定できます。これらのプロバイダーからの AMI のみが表示され、使用できます。

許可された AMI 設定を有効にする前に、*監査モード*を有効にして、どの AMI を表示および使用不可にするかをプレビューできます。これにより、必要に応じて条件を絞り込み、目的の AMI のみがアカウント内のユーザーに表示されるようにすることができます。さらに、[describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) コマンドを実行し、指定した条件を満たしていない AMI で起動されたインスタンスを特定します。この情報は、準拠した AMI を使用するように起動設定を更新する (起動テンプレートで別の AMI を指定するなど) か、これらの AMI を許可するように条件を調整するかどうかを決定するのに役立ちます。

許可された AMI 設定は、アカウントレベルで直接指定するか、宣言ポリシーを使用して指定します。これらの設定は、AMI の使用を制御する各 AWS リージョンで設定する必要があります。宣言型ポリシーを使用すると、複数の リージョンと複数の アカウントで同時に設定を適用できます。宣言ポリシーが使用されている場合、アカウント内で直接設定を変更することはできません。このトピックでは、アカウント内で設定を直接設定する方法について説明します。宣言ポリシーの使用の詳細については、「*AWS Organizations ユーザーガイド*」の「[宣言ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)」を参照してください。

**注記**  
許可された AMI 機能は、アカウントと共有されている AMI とパブリック AMI の検出と使用のみを制御します。アカウントが所有する AMI は制限されません。設定した条件にかかわらず、特定のアカウントで作成した AMI は、常にそのアカウントのユーザーが検出、使用することができます。

**許可された AMI の主な利点**
+ **コンプライアンスとセキュリティ**: ユーザーは、指定された基準を満たす AMI のみを検出して使用できるため、準拠されていない AMI を使用するリスクが軽減されます。
+ **効率的な管理**: 許可される AMI の数を減らすことで、残りの AMI の管理が簡単になり、効率が向上します。
+ **アカウントレベルの一元化された実装**: アカウント内で直接、または宣言ポリシーを使用して、アカウントレベルで許可された AMI 設定を構成します。これにより、アカウント全体で AMI の使用を一元的かつ効率的に制御できます。

**Topics**
+ [許可された AMI の仕組み](#how-allowed-amis-works)
+ [許可された AMI を実装するためのベストプラクティス](#best-practice-for-implementing-allowed-amis)
+ [必要な IAM 許可](#iam-permissions-for-allowed-amis)
+ [許可された AMI の設定を管理する](manage-settings-allowed-amis.md)

## 許可された AMI の仕組み
<a name="how-allowed-amis-works"></a>

お使いのアカウントで、どの AMI を検出して使用できるかを制御するには、AMI を評価するための一連の基準を定義します。次の図に示すように、基準は 1 つまたは複数の `ImageCriterion` で構成されます。説明は図の後に続きます。

![\[許可された AMI の ImageCriteria 設定階層。\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/ami_allowed-amis-imagecriteria.png)


設定には 3 つのレベルがあります。
+ **1** – パラメータ値
  + 複数値パラメータ:
    + `ImageProviders`
    + `ImageNames`
    + `MarketplaceProductCodes`

      AMI は、パラメータ内の*任意の*値と一致した場合に許可されます。

      例: `ImageProviders` = `amazon` **または**アカウント `111122223333` **または** アカウント `444455556666` (パラメータ値の評価ロジックは図に示されていません。)
  + 単一値パラメータ:
    + `CreationDateCondition`
    + `DeprecationTimeCondition`
+ **2** – `ImageCriterion`
  + 複数のパラメータを **AND** ロジックでグループ化します。
  + AMI が許可されるには、`ImageCriterion` 内の*すべての*パラメータと一致する必要があります。
  + 例: `ImageProviders` = `amazon` **AND** `CreationDateCondition` = 300 日以下
+ **3** – `ImageCriteria`
  + 複数の `ImageCriterion` を **OR** ロジックでグループ化します。
  + AMI は、*任意の* `ImageCriterion` と一致した場合に許可されます。
  + AMI を評価するための完全な設定を形成します。

**Topics**
+ [許可された AMI のパラメータ](#allowed-amis-criteria)
+ [許可された AMI の設定](#allowed-amis-json-configuration)
+ [基準の評価方法](#how-allowed-amis-criteria-are-evaluated)
+ [制限](#allowed-amis-json-configuration-limits)
+ [許可されている操作](#allowed-amis-operations)

### 許可された AMI のパラメータ
<a name="allowed-amis-criteria"></a>

次のパラメータを設定すると `ImageCriterion` を作成できます。

`ImageProviders`  
AMI が許可されている AMI プロバイダーです。  
有効な値は、次のように AWS、および AWS アカウント ID で定義されたエイリアスであり、次のようなものがあります。  
+ `amazon` – Amazon または検証済みのプロバイダーによって作成された AMI を識別するエイリアス
+ `aws-marketplace` – AWS Marketplace で検証済みプロバイダーによって作成された AMI を識別するエイリアス 
+ `aws-backup-vault` – 論理エアギャップバックアップボールトアカウントに存在する AWS バックアップ AMI を識別するエイリアス。AWS バックアップの論理エアギャップボールト機能を使用する場合は、このエイリアスが AMI プロバイダーとして含まれていることを確認してください。
+ AWS アカウント ID – 1 つ以上の 12 桁の AWS アカウント ID
+ `none` – アカウントによって作成された AMI のみを検出して使用できることを示します。パブリックまたは共有 AMI を検出して使用することはできません。これを指定すると、他の条件は指定できなくなります。

`ImageNames`  
完全一致またはワイルドカード (`?` または `*`) を使用した、許可された AMI の名前。

`MarketplaceProductCodes`  
許可された AMI の AWS Marketplace 製品コード。

`CreationDateCondition`  
許可された AMI の最大有効期間。

`DeprecationTimeCondition`  
許可された AMI が非推奨になってからの最大経過期間。

各条件の有効な値と制約については、「*Amazon EC2 API リファレンス*」の「[ImageCriterionRequest](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImageCriterionRequest.html)」を参照してください。

### 許可された AMI の設定
<a name="allowed-amis-json-configuration"></a>

許可された AMI のコア設定は、許可された AMI の基準を定義する `ImageCriteria` 設定です。次の JSON 構造は、指定できるパラメータを示しています。

```
{
    "State": "enabled" | "disabled" | "audit-mode",  
    "ImageCriteria" : [
        {
            "ImageProviders": ["string",...],
            "MarketplaceProductCodes": ["string",...],           
            "ImageNames":["string",...],
            "CreationDateCondition" : {
                "MaximumDaysSinceCreated": integer
            },
            "DeprecationTimeCondition" : {
                "MaximumDaysSinceDeprecated": integer
            }
         },
         ...
}
```

#### ImageCriteria の例
<a name="allowed-amis-json-configuration-example"></a>

以下の `ImageCriteria` の例では 4 つの `ImageCriterion` を設定します。AMI は、これらの `ImageCriterion` のいずれかと一致する場合に許可されます。条件の評価方法に関する詳細は、「[基準の評価方法](#how-allowed-amis-criteria-are-evaluated)」を参照してください。

```
{
    "ImageCriteria": [
        // ImageCriterion 1: Allow AWS Marketplace AMIs with product code "abcdefg1234567890"
        {
            "MarketplaceProductCodes": [
                "abcdefg1234567890"
            ]
        },
        // ImageCriterion 2: Allow AMIs from providers whose accounts are
        // "123456789012" OR "123456789013" AND AMI age is less than 300 days
        {
            "ImageProviders": [
                "123456789012",
                "123456789013"
            ],
            "CreationDateCondition": {
                "MaximumDaysSinceCreated": 300
            }
        },
        // ImageCriterion 3: Allow AMIs from provider whose account is "123456789014" 
        // AND with names following the pattern "golden-ami-*"
        {
            "ImageProviders": [
                "123456789014"
            ],
            "ImageNames": [
                "golden-ami-*"
            ]
        },
        // ImageCriterion 4: Allow AMIs from Amazon or verified providers 
        // AND which aren't deprecated
        {
            "ImageProviders": [
                "amazon"
            ],
            "DeprecationTimeCondition": {
                "MaximumDaysSinceDeprecated": 0
            }
        }
    ]
}
```

### 基準の評価方法
<a name="how-allowed-amis-criteria-are-evaluated"></a>

以下の表は、AMI が許可されるかどうかを判断する評価ルールを説明し、各レベルで `AND` 演算子または `OR` 演算子がどのように適用されるかを示しています。


| 評価レベル | オペレーター | 許可された AMI になるための要件 | 
| --- | --- | --- | 
| ImageProviders、ImageNames、および MarketplaceProductCodes のパラメータ値 | OR | AMI は、各パラメータリストの少なくとも 1 つの値と一致する必要があります。 | 
| ImageCriterion | AND | AMI は、各 ImageCriterion のすべてのパラメータと一致する必要があります。 | 
| ImageCriteria | OR | AMI は、ImageCriterion のいずれかと一致する必要があります。 | 

上記の評価ルールを使用して、それらを [ImageCriteria の例](#allowed-amis-json-configuration-example) に適用する方法を見てみましょう。
+ `ImageCriterion` 1: AWS Marketplace 製品コード `abcdefg1234567890` を持つ AMI を許可する

  `OR`
+ `ImageCriterion` 2: 次の両方の基準を満たす AMI を許可する
  + `123456789012` `OR` `123456789013` のいずれかのアカウントが所有している
    + `AND`
  + 過去 300 日以内に作成された

  `OR`
+ `ImageCriterion` 3: 次の両方の条件を満たす AMI を許可する:
  + `123456789014` アカウントが所有している
    + `AND`
  + `golden-ami-*` パターンで命名されている

  `OR`
+ `ImageCriterion` 4: 次の両方の条件を満たす AMI を許可する:
  + Amazon か検証済みのプロバイダーが公開している (`amazon` エイリアスで指定)
    + `AND`
  + 非推奨 (非推奨になってからの最大日数が `0`)

### 制限
<a name="allowed-amis-json-configuration-limits"></a>

`ImageCriteria` には以下までを含めることができます:
+ 10 `ImageCriterion`

各 `ImageCriterion` には以下までを含めることができます:
+ `ImageProviders` の 200 個の値
+ `ImageNames` の 50 個の値 
+ `MarketplaceProductCodes` の 50 個の値 

**制限の例**

前述の [ImageCriteria の例](#allowed-amis-json-configuration-example) の使用:
+ 4 つの `ImageCriterion` があります。上限の 10 に達するまで、最大 6 個を追加できます。
+ 最初の `ImageCriterion` には、`MarketplaceProductCodes` に 1 つの値があります。この `ImageCriterion` には、上限の 50 に達するまで、最大 49 個を追加できます。
+ 2 番目の `ImageCriterion` には、`ImageProviders` に 2 つの値があります。この `ImageCriterion` には、上限の 200 に達するまで、最大 198 個を追加できます。
+ 3 番目の `ImageCriterion` には、`ImageNames` に 1 つの値があります。この `ImageCriterion` には、上限の 50 に達するまで、最大 49 個を追加できます。

### 許可されている操作
<a name="allowed-amis-operations"></a>

許可された AMI 機能には、イメージ条件を管理するための 3 つのオペレーション状態 (**有効**、**無効**、**監査モード**) があります。これにより、イメージ条件を有効または無効にしたり、必要に応じて確認したりできます。

**有効**

許可された AMI が有効になっている場合: 
+ `ImageCriteria` が適用されます。
+ 許可された AMI のみが EC2 コンソールとイメージを使用する API (イメージを使用する他のアクションを記述、コピー、保存、実行するなど) で検出できます。
+ インスタンスは、許可された AMI を使用してのみ起動できます。

**Disabled**

許可された AMI が無効になっている場合: 
+ `ImageCriteria` は適用されません。
+ AMI の検出可能性や使用に制限はありません。

**オーディオモード**

 監査モードの場合:
+ `ImageCriteria` は適用されますが、AMI の検出可能性や使用に制限はありません。
+ EC2 コンソールでは、AMI ごとに、**許可されたイメージ**フィールドには、許可された AMI が有効になっているときに、AMI を検出してアカウント内のユーザーが利用可能であるかを示す **[はい]** または **[いいえ]** が表示されます。
+ コマンドラインでは、`describe-image` オペレーションのレスポンスに `"ImageAllowed": true` または `"ImageAllowed": false` が含まれ、許可された AMI が有効になっている場合に、AMI が検出可能になり、アカウント内のユーザーが利用可能であるかを示します。
+ EC2 コンソールでは、許可された AMI が有効になっている場合に、アカウント内のユーザーが検出または使用できない AMI の横には **[許可されていません]** と表示されます。

## 許可された AMI を実装するためのベストプラクティス
<a name="best-practice-for-implementing-allowed-amis"></a>

許可された AMI、スムーズな移行を確保し、AWS 環境への潜在的な中断を最小限に抑えるために、これらのベストプラクティスを検討してください。

1. **監査モードを有効にする**

   まず、監査モードで許可された AMI を有効にします。この状態では、実際にアクセスを制限することなく、どの AMI が基準の影響を受けるかを確認し、リスクのない評価期間を提供できます。

1. **許可された AMI 基準を設定する**

   組織のセキュリティポリシー、コンプライアンス要件、運用ニーズに合った AMI プロバイダーを慎重に確立します。
**注記**  
Amazon ECS、Amazon EKS、AWS Lambda マネージドインスタンスなどの AWS マネージドサービスを使用する場合は、AWS が作成した AMI を許可するために `amazon` エイリアスを指定することが推奨されます。これらのサービスは、Amazon が公開した AMI に依存してインスタンスを起動します。  
AMI `CreationDateCondition` に制限を設定するときは注意が必要です。過度に制限された日付条件 (AMI は作成から 5 日未満でなければならないなど) を設定すると、AMI が、AWS か他のプロバイダーのいずれのものかにかかわらず、指定された期間内に更新されなかった場合にインスタンスの起動が失敗する可能性があります。  
コントロールと特異度を向上させるために、`ImageNames` と `ImageProviders` を組み合わせることが推奨されます。`ImageNames` のみを使用すると、AMI を一意に識別できない可能性があります。

1. **期待されるビジネスプロセスへの影響を確認する**

   コンソールまたは CLI を使用して、指定した基準を満たさない AMI で起動されたインスタンスを特定できます。この情報は、準拠した AMI を使用するように起動設定を更新する (起動テンプレートで別の AMI を指定するなど) か、これらの AMI を許可するように条件を調整するかどうかを決定するのに役立ちます。

   コンソール: [ec2-instance-launched-with-allowed-ami](https://docs.aws.amazon.com/config/latest/developerguide/ec2-instance-launched-with-allowed-ami.html) AWS Config ルールを使用し、実行中または停止中のインスタンスが、許可された AMI 基準を満たす AMI で起動されたかどうかを確認します。ルールは、許可された AMI 基準を AMI が満たしていない場合は **[NON\$1COMPLIANT]**、満たしている場合は **[COMPLIANT]** です。ルールは、許可された AMI 設定が **有効** または **監査モード** に設定されている場合にのみ機能します。

   CLI: [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) コマンドを実行し、レスポンスをフィルタリングして、指定した条件を満たさない AMI で起動されたインスタンスを特定します。

   コンソールと CLI での手順については、「[許可されていない AMI から起動したインスタンスを見つける](manage-settings-allowed-amis.md#identify-instances-with-allowed-AMIs)」を参照してください。

1. **許可された AMI を有効にする**

   基準が期待されるビジネスプロセスに悪影響を及ぼさないことを確認したら、許可された AMI を有効にします。

1. **インスタンスの起動をモニタリングする**

   Amazon EMR、Amazon ECR、Amazon EKS、AWS Elastic Beanstalk など、アプリケーションおよび使用する AWS マネージドサービス全体で AMI からのインスタンス起動を引き続きモニタリングします。予期しない問題がないか確認し、許可された AMI 基準に必要な調整を行います。

1. **新しい AMI のパイロット**

   現在の許可されている AMI 設定に準拠していないサードパーティ AMI をテストするために、AWS は次のアプローチを推奨します。
   + 別の AWS アカウント を使用する: ビジネスクリティカルなリソースにアクセスできないアカウントを作成します。このアカウントで許可された AMI 設定が有効になっていない、またはテストする AMI が明示的に許可されていることを確認し、テストできるようにします。
   + 別の AWS リージョン でテストする: サードパーティー AMI は使用できるが、許可された AMI 設定をまだ有効にしていないリージョンを使用します。

   こうすることで、新しいAMIのテスト中でも、ビジネスクリティカルなリソースの安全性を確保することができます。

## 必要な IAM 許可
<a name="iam-permissions-for-allowed-amis"></a>

許可された AMI 機能を使用するには、次の IAM アクセス許可が必要です:
+ `GetAllowedImagesSettings`
+ `EnableAllowedImagesSettings`
+ `DisableAllowedImagesSettings`
+ `ReplaceImageCriteriaInAllowedImagesSettings`