

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# のセキュリティ AWS AppConfig
<a name="appconfig-security"></a>

のクラウドセキュリティが最優先事項 AWS です。お客様は AWS 、セキュリティを最も重視する組織の要件を満たすように構築されたデータセンターとネットワークアーキテクチャを活用できます。

セキュリティは、 AWS とお客様の間の責任共有です。[責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)ではこれをクラウド*の*セキュリティおよびクラウド*内*のセキュリティと説明しています。
+ **クラウドのセキュリティ** – AWS は、 で AWS サービスを実行するインフラストラクチャを保護する責任があります AWS クラウド。 AWS また、 では、安全に使用できるサービスも提供しています。サードパーティーの監査者は、[AWS コンプライアンスプログラム](https://aws.amazon.com/compliance/programs/)コンプライアンスプログラムの一環として、当社のセキュリティの有効性を定期的にテストおよび検証。が適用されるコンプライアンスプログラムの詳細については AWS Systems Manager、「コンプライアンス[AWS プログラムによる対象範囲内のサービスコンプライアンス](https://aws.amazon.com/compliance/services-in-scope/)」を参照してください。
+ **クラウドのセキュリティ** – お客様の責任は、使用する AWS サービスによって決まります。また、ユーザーは、データの機密性、会社の要件、適用される法律や規制など、その他の要因についても責任を負います。

AWS AppConfig はツールインです AWS Systems Manager。の使用時に責任共有モデルを適用する方法については AWS AppConfig、「 [のセキュリティ AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/security.html)」を参照してください。ここでは、 AWS AppConfigのセキュリティおよびコンプライアンス目標を達成するために Systems Manager を設定する方法を説明しています。

## 最小特権アクセスの実装
<a name="appconfig-security-least-privilege-access"></a>

セキュリティのベストプラクティスとして、ID が特定の条件下で特定のリソースに対して特定のアクションを実行するために必要な最小限のアクセス許可を付与します。 AWS AppConfig エージェントには、エージェントがインスタンスまたはコンテナのファイルシステムにアクセスできるようにする 2 つの機能があります。*バックアップ*と*ディスクへの書き込み*です。これらの機能を有効にする場合は、 AWS AppConfig エージェントのみがファイルシステム上の指定された設定ファイルに書き込むアクセス許可を持っていることを確認します。また、これらの設定ファイルから読み取る必要があるプロセスのみがその権限を持っていることも確認してください。最小特権アクセスの実装は、セキュリティリスクと、エラーや悪意によってもたらされる可能性のある影響の低減における基本です。

最小特権アクセスの実装の詳細については、「*AWS Well-Architected Tool ユーザーガイド*」の「[SEC03-BP02 最小特権アクセスを付与する](https://docs.aws.amazon.com/wellarchitected/latest/framework/sec_permissions_least_privileges.html)」を参照してください。このセクションで説明する AWS AppConfig エージェント機能の詳細については、「」を参照してください[マニフェストを使用して追加の取得機能を有効にする](appconfig-agent-how-to-use-additional-features.md)。

## の保管時のデータ暗号化 AWS AppConfig
<a name="appconfig-security-data-encryption"></a>

AWS AppConfig はデフォルトで暗号化を提供し、 を使用して保管中の顧客データを保護します AWS 所有のキー。

**AWS 所有のキー** — デフォルトでは、これらのキー AWS AppConfig を使用して、サービスによってデプロイされ、データストアでホストされる AWS AppConfig データを自動的に暗号化します。表示、管理、使用 AWS 所有のキー、またはそれらの使用を監査することはできません。ただし、データを暗号化するキーを保護するために何か行動を起こしたり、プログラムを変更したりする必要はありません。詳細については、「*AWS Key Management Service デベロッパーガイド*」の 「[AWS 所有のキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)」を参照してください。

この暗号化レイヤーを無効にしたり、別の暗号化タイプを選択したりすることはできませんが、 AWS AppConfig データストアでホストされている設定データを保存したり、設定データをデプロイしたりするときに使用するカスタマーマネージドキーを指定できます。

**カスタマーマネージドキー** — 作成、所有、管理する対称カスタマーマネージドキー AWS AppConfig を使用して、既存のキーに 2 番目の暗号化レイヤーを追加します AWS 所有のキー。ユーザーがこの暗号化レイヤーを完全に制御できるため、次のようなタスクを実行できます。
+ キーポリシーとグラントの策定と維持
+ IAM ポリシーの策定と維持
+ キーポリシーの有効化と無効化
+ キー暗号化マテリアルのローテーション
+  タグを追加する
+ キーエイリアスの作成
+ キー削除のスケジュール設定

詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[Customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)」を参照してください。

**AWS AppConfig がカスタマーマネージドキーをサポート**

AWS AppConfig では、設定データのカスタマーマネージドキー暗号化がサポートされています。 AWS AppConfig ホストされたデータストアに保存されている設定バージョンの場合、お客様は対応する設定プロファイル`KmsKeyIdentifier`で を設定できます。`CreateHostedConfigurationVersion` API オペレーションを使用して設定データの新しいバージョンを作成するたびに、 は から AWS KMS データキー AWS AppConfig を生成`KmsKeyIdentifier`し、保存する前にデータを暗号化します。`GetHostedConfigurationVersion` または `StartDeployment` API オペレーション中に後でデータにアクセスすると、 は生成されたデータキーに関する情報を使用して設定データを AWS AppConfig 復号します。

AWS AppConfig は、デプロイされた設定データのカスタマーマネージドキー暗号化もサポートしています。設定データを暗号化するために、お客様はデプロイ`KmsKeyIdentifier`に を提供できます。 はこれを使用して AWS KMS データキー AWS AppConfig を生成`KmsKeyIdentifier`し、`StartDeployment`API オペレーションのデータを暗号化します。

**AWS AppConfig 暗号化アクセス**

顧客管理キーを作成するときは、次のキーポリシーを使用して、キーが使用可能であることを確認してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/role_name"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "*"
        }
    ]
}
```

------

ホストされている設定データをカスタマー管理キーで暗号化するには、ID 呼び出しにユーザー、グループ、`CreateHostedConfigurationVersion` またはロールに割り当てることができる以下のポリシーステートメントが必要です。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:GenerateDataKey",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
        }
    ]
}
```

------

Secrets Manager のシークレットや、顧客管理キーで暗号化されたその他の設定データを使用している場合は `retrievalRoleArn` 、`kms:Decrypt` データを復号化して取得する必要があります。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
    }
  ]
}
```

------

 AWS AppConfig [StartDeployment](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_appconfigdata_StartDeployment.html) API オペレーションを呼び出す場合、ID 呼び出しには、ユーザー、グループ、またはロールに割り当てることができる次の IAM ポリシー`StartDeployment`が必要です。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKey*"
      ],
      "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
    }
  ]
}
```

------

 AWS AppConfig [GetLatestConfiguration](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_appconfigdata_GetLatestConfiguration.html) API オペレーションを呼び出す場合、ID 呼び出しには、ユーザー、グループ、またはロールに割り当てることができる次のポリシー`GetLatestConfiguration`が必要です。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
        }
    ]
}
```

------

**暗号化コンテキスト**

[暗号化コンテキスト](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)は、データに関する追加のコンテキスト情報が含まれたキーバリューペアのオプションのセットです。

AWS KMS は、追加の認証済みデータとして暗号化コンテキストを使用して、認証済み暗号化をサポートします。データを暗号化するリクエストに暗号化コンテキストを含めると、 は暗号化コンテキストを暗号化されたデータに AWS KMS バインドします。データを復号化するには、そのリクエストに (暗号化時と) 同じ暗号化コンテキストを含めます。

 **AWS AppConfig 暗号化コンテキスト**: 暗号化されたホスト設定データとデプロイのすべての AWS KMS 暗号化オペレーションで暗号化コンテキスト AWS AppConfig を使用します。コンテキストには、データのタイプに対応するキーと、特定のデータ項目を識別する値が含まれます。

**の暗号化キーのモニタリング AWS**

で AWS KMS カスタマーマネージドキーを使用する場合 AWS AppConfig、 AWS CloudTrail または Amazon CloudWatch Logs を使用して、 が AWS AppConfig に送信するリクエストを追跡できます AWS KMS。

次の例は、 がカスタマーマネージドキーによって暗号化されたデータにアクセス AWS AppConfig するために によって呼び出されるオペレーションをモニタリング`Decrypt` AWS KMS するための CloudTrail イベントです。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "appconfig.amazonaws.com"
    },
    "eventTime": "2023-01-03T02:22:28z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "Region",
    "sourceIPAddress": "172.12.34.56",
    "userAgent": "ExampleDesktop/1.0 (V1; OS)",
    "requestParameters": {
        "encryptionContext": {
            "aws:appconfig:deployment:arn": "arn:aws:appconfig:Region:account_ID:application/application_ID/environment/environment_ID/deployment/deployment_ID"
        },
        "keyId": "arn:aws:kms:Region:account_ID:key/key_ID",
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "account_ID",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:Region:account_ID:key_ID"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "account_ID",
    "sharedEventID": "dc129381-1d94-49bd-b522-f56a3482d088"
}
```

## インターフェイスエンドポイント (AWS PrivateLink) AWS AppConfig を使用した へのアクセス
<a name="vpc-interface-endpoints"></a>

を使用して AWS PrivateLink 、VPC と の間にプライベート接続を作成できます AWS AppConfig。インターネットゲートウェイ、NAT デバイス、VPN 接続、または Direct Connect 接続を使用せずに、VPC 内にある AWS AppConfig かのように にアクセスできます。VPC 内のインスタンスは AWS AppConfigにアクセスするためにパブリック IP アドレスを必要としません。

このプライベート接続を確立するには、 AWS PrivateLinkを利用した*インターフェイスエンドポイント*を作成します。インターフェイスエンドポイントに対して有効にする各サブネットにエンドポイントネットワークインターフェイスを作成します。これらは、 AWS AppConfig宛てのトラフィックのエントリポイントとして機能するリクエスタ管理型ネットワークインターフェイスです。

詳細については「*AWS PrivateLink ガイド*」の「[Access AWS のサービス through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)」を参照してください。

### に関する考慮事項 AWS AppConfig
<a name="vpc-endpoint-considerations"></a>

のインターフェイスエンドポイントを設定する前に AWS AppConfig、「 *AWS PrivateLink ガイド*」の[「考慮事項](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#considerations-interface-endpoints)」を参照してください。

AWS AppConfig は、インターフェイスエンドポイントを介した [https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_Amazon_AppConfig.html](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_Amazon_AppConfig.html)および [https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_AWS_AppConfig_Data.html](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_AWS_AppConfig_Data.html)サービスの呼び出しをサポートしています。

### のインターフェイスエンドポイントを作成する AWS AppConfig
<a name="vpc-endpoint-create"></a>

Amazon VPC コンソールまたは AWS Command Line Interface () AWS AppConfig を使用して、 のインターフェイスエンドポイントを作成できますAWS CLI。詳細については、「*AWS PrivateLink ガイド*」の「[インターフェイスエンドポイントを作成](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)」を参照してください。

次のサービス名 AWS AppConfig を使用して 用のインターフェイスエンドポイントを作成します。

```
com.amazonaws.region.appconfig
```

```
com.amazonaws.region.appconfigdata
```

インターフェイスエンドポイントのプライベート DNS を有効にすると、リージョンのデフォルト DNS 名を使用して、 AWS AppConfig への API リクエストを実行できます。例えば、`appconfig.us-east-1.amazonaws.com` と `appconfigdata.us-east-1.amazonaws.com` です。

### インターフェイスエンドポイントのエンドポイントポリシーを作成する
<a name="vpc-endpoint-policy"></a>

エンドポイントポリシーは、インターフェイスエンドポイントにアタッチできる IAM リソースです。デフォルトのエンドポイントポリシーでは、インターフェイスエンドポイント AWS AppConfig を介した へのフルアクセスが許可されます。VPC AWS AppConfig から に許可されるアクセスを制御するには、カスタムエンドポイントポリシーをインターフェイスエンドポイントにアタッチします。

エンドポイントポリシーは以下の情報を指定します。
+ アクションを実行できるプリンシパル (AWS アカウント、IAM ユーザー、IAM ロール)。
+ 実行可能なアクション。
+ このアクションを実行できるリソース。

詳細については、*AWS PrivateLink ガイド*の[Control access to services using endpoint policies (エンドポイントポリシーを使用してサービスへのアクセスをコントロールする)](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)を参照してください。

**例: AWS AppConfig アクションの VPC エンドポイントポリシー**  
以下は、カスタムエンドポイントポリシーの例です。インターフェイスエンドポイントにアタッチされると、このポリシーは、すべてのリソースですべてのプリンシパルに、リストされている AWS AppConfig アクションへのアクセス権を付与します。

```
{
   "Statement": [
      {
         "Principal": "*",
         "Effect": "Allow",
         "Action": [
            "appconfig:CreateApplication",
            "appconfig:CreateEnvironment",
            "appconfig:CreateConfigurationProfile",
            "appconfig:StartDeployment",
            "appconfig:GetLatestConfiguration"
            "appconfig:StartConfigurationSession"
         ],
         "Resource":"*"
      }
   ]
}
```

## Secrets Manager のキーローテーション
<a name="appconfig-security-secrets-manager-key-rotation"></a>

このセクションでは、Secrets Manager と AWS AppConfig の統合に関する重要なセキュリティ情報について説明します。Secrets Manager の詳細については、*AWS Secrets Manager 「 ユーザーガイド*」の[「What is AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)」を参照してください。

### によってデプロイされた Secrets Manager シークレットの自動ローテーションの設定 AWS AppConfig
<a name="appconfig-security-secrets-manager-key-rotation-setting-up"></a>

*ローテーション*とは、Secrets Manager に保存されているシークレットを定期的に更新するためのプロセスのことです。‬‬ シークレットのローテーションを行うと、シークレット、ならびに、データベースまたはサービスの認証情報が更新されます。 AWS Lambda 関数を使用してシークレットとデータベースを更新することで、Secrets Manager でシークレットの自動ローテーションを設定できます。詳細については、「*AWS Secrets Manager ‬ ユーザーガイド*」の「[Rotate AWS Secrets Manager secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)」を参照してください。

によってデプロイされた Secrets Manager シークレットのキーローテーションを有効にするには AWS AppConfig、ローテーション Lambda 関数を更新し、ローテーションされたシークレットをデプロイします。

**注記**  
シークレットがローテーションされ、新しいバージョンに完全に更新されたら、 AWS AppConfig 設定プロファイルをデプロイします。`VersionStage` のステータスが `AWSPENDING` から `AWSCURRENT` に変更されたためにシークレットがローテーションされたかどうかを判断できます。シークレットローテーションの完了は、Secrets Managerのローテーションテンプレート `finish_secret` 機能内で行われます。

シークレットがローテーションされた後に AWS AppConfig デプロイを開始する 関数の例を次に示します。

```
import time
import boto3
client = boto3.client('appconfig')

def finish_secret(service_client, arn, new_version):
    """Finish the rotation by marking the pending secret as current
    This method finishes the secret rotation by staging the secret staged AWSPENDING with the AWSCURRENT stage.
    Args:
        service_client (client): The secrets manager service client
        arn (string): The secret ARN or other identifier
        new_version (string): The new version to be associated with the secret
    """
    # First describe the secret to get the current version
    metadata = service_client.describe_secret(SecretId=arn)
    current_version = None
    for version in metadata["VersionIdsToStages"]:
        if "AWSCURRENT" in metadata["VersionIdsToStages"][version]:
            if version == new_version:
                # The correct version is already marked as current, return
                logger.info("finishSecret: Version %s already marked as AWSCURRENT for %s" % (version, arn))
                return
            current_version = version
            break

    # Finalize by staging the secret version current
    service_client.update_secret_version_stage(SecretId=arn, VersionStage="AWSCURRENT", MoveToVersionId=new_version, RemoveFromVersionId=current_version)
    
    # Deploy rotated secret
    response = client.start_deployment(
            ApplicationId='TestApp',
            EnvironmentId='TestEnvironment',
            DeploymentStrategyId='TestStrategy',
            ConfigurationProfileId='ConfigurationProfileId',
            ConfigurationVersion=new_version,
            KmsKeyIdentifier=key,
            Description='Deploy secret rotated at ' + str(time.time())
        )
   
    logger.info("finishSecret: Successfully set AWSCURRENT stage to version %s for secret %s." % (new_version, arn))
```