

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用对异常检测器及其结果进行加密 Amazon KMS
<a name="LogsAnomalyDetection-KMS"></a>

异常检测器数据始终在 CloudWatch 日志中加密。默认情况下， CloudWatch Logs 对静态数据使用服务器端加密。作为替代方案，你可以使用 Amazon Key Management Service 这种加密。如果这样做，则使用密 Amazon KMS 钥进行加密。通过将 KMS 密钥与异常检测器关联，可以在异常检测器级别启用使用 Amazon KMS 进行加密。

**重要**  
CloudWatch 日志仅支持对称 KMS 密钥。请勿使用非对称密钥对日志组中的数据进行加密。有关更多信息，请参阅[使用对称和非对称密钥](https://docs.amazonaws.cn/kms/latest/developerguide/symmetric-asymmetric.html)。

## 限制
<a name="encryption-limits-anomaly"></a>
+ 要执行下列步骤，您必须具有以下权限：`kms:CreateKey`、`kms:GetKeyPolicy` 和 `kms:PutKeyPolicy`。
+ 将密钥与异常检测器关联或取消关联后，该操作最多可能需要五分钟才能生效。
+ 如果您撤消 CloudWatch 日志对关联密钥的访问权限或删除关联的 KMS 密钥，则无法再检索 CloudWatch 日志中的加密数据。

### 步骤 1：创建 Amazon KMS 密钥
<a name="create-cmk-anomaly"></a>

要创建 KMS 密钥，请使用以下 [create-key](https://docs.amazonaws.cn/cli/latest/reference/kms/create-key.html) 命令：

```
aws kms create-key
```

输出包含密钥的密钥 ID 和 Amazon 资源名称（ARN）。下面是示例输出：

```
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "key-default-1",
        "Description": "",
        "KeyManager": "CUSTOMER",
        "Enabled": true,
        "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1478910250.94,
        "Arn": "arn:aws:kms:us-west-2:123456789012:key/key-default-1",
        "AWSAccountId": "123456789012",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ]
    }
}
```

### 步骤 2：设置 KMS 密钥的权限
<a name="cmk-permissions-ad"></a>

默认情况下，所有 Amazon KMS 密钥都是私有的。只有资源所有者可以使用它来加密和解密数据。但是，资源拥有者可以将 KMS 密钥的访问权限授予其他用户和资源。通过此步骤，您将授予 CloudWatch 日志服务主体使用密钥的权限。此服务主体必须位于存储 KMS 密钥的同一 Amazon 区域。

作为最佳实践，我们建议您将 KMS 密钥的使用仅限于您指定的 Amazon 账户或异常检测器。

首先，`policy.json`使用以下[get-key-policy](https://docs.amazonaws.cn/cli/latest/reference/kms/get-key-policy.html)命令保存 KMS 密钥的默认策略：

```
aws kms get-key-policy --key-id key-id --policy-name default --output text > ./policy.json
```

在文本编辑器中打开 `policy.json` 文件，然后从以下语句之一中添加粗体的部分。使用逗号将现有语句与新语句分隔。这些语句使用`Condition`章节来增强 Amazon KMS 密钥的安全性。有关更多信息，请参阅 [Amazon KMS 密钥和加密上下文](encrypt-log-data-kms.md#encrypt-log-data-kms-policy)。

此示例中的 `Condition` 部分将 Amazon KMS 密钥的使用限制于指定账户，但它可用于任何异常检测器。

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

****  

```
    {
    "Version":"2012-10-17",		 	 	 
    "Id": "key-default-1",
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "AllowCloudWatchLogsEncryption",
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:123456789012:anomaly-detector:*"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:anomaly-detector:*"
                }
            }
        },
        {
            "Sid": "AllowCloudWatchLogsDescribeKey",
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.us-east-1.amazonaws.com"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                }
            }
        },
        {
            "Sid": "AllowCloudWatchLogsReEncryption",
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                },
                "StringLike": {
                    "kms:EncryptionContext:aws-crypto-ec:aws:logs:arn": "arn:aws:logs:us-east-1:123456789012:anomaly-detector:*"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:anomaly-detector:*"
                }
            }
        },
        {
            "Sid": "AllowCloudWatchLogsDescribeKeyForReEncryption",
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.us-east-1.amazonaws.com"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                }
            }
        }
    ]
}
```

------

最后，使用以下[put-key-policy](https://docs.amazonaws.cn/cli/latest/reference/kms/put-key-policy.html)命令添加更新的策略：

```
aws kms put-key-policy --key-id key-id --policy-name default --policy file://policy.json
```

### 步骤 3：将 KMS 密钥与异常检测器关联
<a name="associate-cmk"></a>

在控制台或使用或创建 KMS 密钥时，可以将其与异常检测器关联。 Amazon CLI APIs

#### 步骤 4：取消密钥与异常检测器的关联
<a name="disassociate-cmk"></a>

当密钥与异常检测器关联后，您无法更新该密钥。移除密钥的唯一方法是删除异常检测器，然后重新创建它。