

# OpenTelemetry メトリクスの保管時の暗号化
<a name="cmk-encryption"></a>

## CloudWatch データセットとは
<a name="cmk-encryption-dataset-overview"></a>

Amazon CloudWatch に送信する OpenTelemetry (OTel) メトリクスは、データセットと呼ばれるリソースに保存されます。すべての AWS アカウント には、すべての OTel メトリクスが存在する各リージョンに `default` データセットがあります。`default` データセットはサポートされている唯一のデータセットです。追加のデータセットを作成することはできません。

データセットは、他の AWS リソースと同様に暗号化およびタグ付けができます。データセット ARN の形式は以下のようになっています。

`arn:{{{partition}}}:cloudwatch:{{{region}}}:{{{account-id}}}:dataset/default`

データセットの現在の暗号化設定を表示するには、次のように `GetDataset` API を使用します。

```
aws cloudwatch get-dataset \
    --dataset-identifier default
```

カスタマー管理キーがデータセットに関連付けられている場合、レスポンスにはキー ARN が含まれます。カスタマー管理キーが関連付けられていない場合、データセットは AWS 所有キーで暗号化されます。

## 保管時の暗号化オプション
<a name="cmk-encryption-options"></a>

CloudWatch は常に保管中のデータセットデータを暗号化します。CloudWatch はデフォルトで、AWS 所有キーを使用してすべての保管中のデータを暗号化します。AWS 所有キーを使用してデータを保護するためのアクションを実行する必要はありません。詳細については、「AWS Key Management Service デベロッパーガイド」の「[AWS 所有キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)」を参照してください。

データセットデータの暗号化に使用されるキーを管理したい場合は、AWS Key Management Service (AWS KMS) でカスタマー管理キーを使用できます。詳細については、「AWS Key Management Service デベロッパーガイド」の「[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)」を参照してください。

カスタマー管理キーを使用する場合、AWS KMS 料金が適用されます。料金の詳細については、「[AWS Key Management Service の料金](https://aws.amazon.com/kms/pricing/)」を参照してください。

## CloudWatch がデータセット暗号化にカスタマー管理キーを使用する方法
<a name="cmk-encryption-how-it-works"></a>

**重要**  
カスタマー管理キー暗号化が `default` データセットに適用されます。`default` データセットはサポートされている唯一のデータセットです。追加のデータセットを作成することはできません。

カスタマー管理キーを `default` データセットに関連付けると、CloudWatch はそのキーを使用して、そのデータセットに保存されているすべての OTel メトリクスデータを暗号化します。

CloudWatch は、キーポリシーのアクセス許可で直接サービスプリンシパル (`cloudwatch.amazonaws.com`) を使用します。CloudWatch は、権限や IAM ロールを使用して AWS KMS キーにアクセスしません。

CloudWatch はデータキーをキャッシュしません。ただし、CloudWatch は `kms:Decrypt` レスポンスを最大 15 分間キャッシュします。キーポリシーの変更が有効になるまでに最大 15 分かかる場合があります。

CloudWatch は、すべての AWS KMS 暗号化オペレーションで次の暗号化コンテキストを使用します。
+ キー: `aws:cloudwatch:arn`
+ 値: `arn:{{{partition}}}:cloudwatch:{{{region}}}:{{{account-id}}}:dataset/default`

## データセットのカスタマー管理キーの設定
<a name="cmk-encryption-key-requirements"></a>

CloudWatch データセットで使用する AWS KMS キーは、次の要件を満たしている必要があります。
+ キーは、キー用途 ENCRYPT\_DECRYPT の対称暗号化キー (SYMMETRIC\_DEFAULT) である必要があります。非対称キーはサポートされていません。
+ マルチリージョンキーはサポートされていません。
+ キーはデータセットと同じ AWS リージョン にある必要があります。
+ キーを完全修飾キー ARN として指定する必要があります。キーエイリアスとキー ID はサポートされていません。

## キーポリシーのアクセス許可の設定
<a name="cmk-encryption-permissions"></a>

CloudWatch データセットでカスタマー管理キーを使用するには、キーポリシーがキーを使用するためのアクセス許可を CloudWatch に付与する必要があります。次のキーポリシーの例では、CloudWatch に必要なアクセス許可を付与し、混乱した代理の保護を含めます。

データセットを関連付ける、または使用する呼び出し元には、以下の `AllowCallerDecrypt` ステートメントに示すように、CloudWatch `ViaService` と暗号化コンテキストに限定された `kms:Decrypt` アクセス許可が必要です。{{YourApplicationRole}} を CloudWatch データセット API の呼び出しに使用される IAM ロールに置き換えます。

**Example CloudWatch データセット暗号化のキーポリシー**  

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudWatchDatasetDescribeKey",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudwatch.amazonaws.com"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "{{account-id}}"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:cloudwatch:{{region}}:{{account-id}}:dataset/default"
                }
            }
        },
        {
            "Sid": "AllowCloudWatchDatasetEncryption",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudwatch.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "{{account-id}}",
                    "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:{{region}}:{{account-id}}:dataset/default"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:cloudwatch:{{region}}:{{account-id}}:dataset/default"
                }
            }
        },
        {
            "Sid": "AllowCallerDecrypt",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{{account-id}}:role/{{YourApplicationRole}}"
            },
            "Action": "kms:Decrypt",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "cloudwatch.{{region}}.amazonaws.com",
                    "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:{{region}}:{{account-id}}:dataset/default"
                }
            }
        }
    ]
}
```

{{アカウント ID}} と{{リージョン}}を自分の値に置き換えます。

キーポリシーの詳細については、「AWS Key Management Service デベロッパーガイド」の「[AWS KMS のキーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)」を参照してください。

## カスタマー管理キーをデータセットに関連付けるには
<a name="cmk-encryption-associate"></a>

`AssociateDatasetKmsKey` API を使用して、カスタマー管理キーをデータセットに関連付けます。データセット識別子として `default` を指定する必要があります。

AWS CLI を使用してカスタマー管理キーを関連付けるには、次のコマンドを実行します。

```
aws cloudwatch associate-dataset-kms-key \
    --dataset-name default \
    --kms-key-arn arn:aws:kms:{{region}}:{{account-id}}:key/{{key-id}}
```

## 暗号化設定の変更または削除
<a name="cmk-encryption-change-disassociate"></a>

データセットデータを暗号化するカスタマー管理キーを変更または削除ができます。

### カスタマー管理キーを変更するには
<a name="cmk-encryption-change-key"></a>

カスタマー管理キーを置き換えるには、新しいキー ARN でもう一度 `AssociateDatasetKmsKey` を呼び出します。呼び出し元には、現在のキーと新しいキーの両方に対する `kms:Decrypt` アクセス許可が必要です。CloudWatch は、新しいキーの使用を開始し、以降の暗号化オペレーションに適用します。

### カスタマー管理キーを削除するには
<a name="cmk-encryption-disassociate"></a>

カスタマー管理キーを削除して AWS 所有キー暗号化に戻すには、`DisassociateDatasetKmsKey` を呼び出します。呼び出し元には、現在関連付けられているキーに対する `kms:Decrypt` アクセス許可が必要です。

```
aws cloudwatch disassociate-dataset-kms-key \
    --dataset-name default
```

**重要**  
カスタマー管理キーの関連付けを解除した後、3 時間の強制ウィンドウがあり、その間 CloudWatch は以前に関連付けられたキーに対する `kms:Decrypt` アクセス許可を引き続き要求します。このウィンドウ中はキーを無効化または削除しないでください。

キーが無効状態の場合は、データセットとの関連付けを解除する前に、キーを再度有効にする必要があります。

## キーポリシーアクセスのスコープダウン
<a name="cmk-encryption-scoping-access"></a>

キーポリシーで条件を使用して、AWS KMS キーへのアクセスを制限することもできます。

暗号化コンテキスト条件  
`kms:EncryptionContext:aws:cloudwatch:arn` 条件キーを使用して、キーの使用を `default` データセットに制限します。  

```
"Condition": {
    "StringEquals": {
        "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:{{region}}:{{account-id}}:dataset/default"
    }
}
```

混乱した代理の保護  
`aws:SourceArn` および `aws:SourceAccount` 条件を使用して、アカウント間の混乱した代理攻撃を防止します。  

```
"Condition": {
    "StringEquals": {
        "aws:SourceAccount": "{{account-id}}"
    },
    "ArnLike": {
        "aws:SourceArn": "arn:aws:cloudwatch:{{region}}:{{account-id}}:dataset/default"
    }
}
```

kms:ViaService 条件  
`kms:ViaService` 条件キーを使用して、CloudWatch からのリクエストにキーの使用を制限します。  

```
"Condition": {
    "StringEquals": {
        "kms:ViaService": "cloudwatch.{{region}}.amazonaws.com"
    }
}
```

## CloudWatch と AWS KMS とのインタラクションのモニタリング
<a name="cmk-encryption-monitoring"></a>

AWS CloudTrail を使用して、CloudWatch がユーザーに代わって AWS KMS に送信するリクエストを追跡できます。AWS CloudTrail ログエントリは、サービスプリンシパル `cloudwatch.amazonaws.com` と `ViaService` の値 `cloudwatch.{{{region}}}.amazonaws.com` を使用します。

CloudWatch データセット暗号化オペレーションのログエントリに、次の CloudTrail イベント名が表示されます。
+ `GenerateDataKey`
+ `Encrypt`
+ `Decrypt`
+ `DescribeKey`
+ `ReEncrypt`

各ログエントリには、オペレーションが適用される特定のデータセットを識別するために使用できる暗号化コンテキストが含まれています。

AWS KMS キー使用状況のモニタリングの詳細については、「AWS Key Management Service デベロッパーガイド」の「[AWS Key Management Service のモニタリング](https://docs.aws.amazon.com/kms/latest/developerguide/monitoring-overview.html)」を参照してください。