

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

# 使用加密查询结果 AWS Key Management Service
<a name="CloudWatchLogs-Insights-Query-Encrypt"></a>

默认情况下， CloudWatch Logs 使用默认 CloudWatch 的 Logs 服务器端加密方法对 CloudWatch Logs Insights 查询的存储结果进行加密。您可以选择使用 AWS KMS 密钥来加密这些结果。如果您将 AWS KMS 密钥与加密结果相关联，则 CloudWatch Logs 将使用该密钥对账户中所有查询的存储结果进行加密。

如果您稍后解除密钥与查询结果的关联，则 CloudWatch 日志会回到默认的加密方法以供日后查询使用。但是，在关联密钥时运行的查询仍使用该密钥进行加密。 CloudWatch 解除 KMS 密钥关联后，日志仍然可以返回这些结果，因为 CloudWatch 日志仍然可以继续引用该密钥。但是，如果密钥稍后被禁用，则 CloudWatch Logs 将无法读取使用该密钥加密的查询结果。

**重要**  
CloudWatch 日志仅支持对称 KMS 密钥。请勿使用非对称密钥来加密查询结果。有关更多信息，请参阅[使用对称和非对称密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)。

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

## 步骤 1：创建一个 AWS KMS key
<a name="create-cmk"></a>

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

```
aws kms create-key
```

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

```
{
    "KeyMetadata": {
        "Origin": "AWS_KMS",
        "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "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/6f815f63-e628-448c-8251-e40cb0d29f59",
        "AWSAccountId": "123456789012",
        "EncryptionAlgorithms": [
            "SYMMETRIC_DEFAULT"
        ]
    }
}
```

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

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

作为最佳实践，我们建议您将密钥的使用限制在您指定的 AWS 账户中。

首先，`policy.json`使用以下[get-key-policy](https://docs.aws.amazon.com/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`章节来增强 AWS KMS 密钥的安全性。有关更多信息，请参阅 [AWS KMS 密钥和加密上下文](encrypt-log-data-kms.md#encrypt-log-data-kms-policy)。

此示例中的`Condition`部分将 AWS KMS 密钥的使用限制为指定账户中的 CloudWatch Logs Insights 查询结果。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "key-default-1",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.region.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt*",
                "kms:Decrypt*",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:Describe*"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                "aws:SourceArn": "arn:aws:logs:us-east-1:111122223333:query-result:*"
                },
                "StringEquals": {
                "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

最后，使用以下[put-key-policy](https://docs.aws.amazon.com/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-query"></a>

**将 KMS 密钥与账户中的查询结果相关联**  
按以下方式使用 [disassociate-kms-key](https://docs.aws.amazon.com/cli/latest/reference/logs/disassociate-kms-key.html) 命令：

```
aws logs associate-kms-key --resource-identifier "arn:aws:logs:region:account-id:query-result:*" --kms-key-id "key-arn"
```

## 步骤 4：取消密钥与账户中查询结果的关联
<a name="disassociate-cmk-query"></a>

要取消与查询结果关联的 KMS 密钥的关联，请使用以下[disassociate-kms-key](https://docs.aws.amazon.com/cli/latest/reference/logs/disassociate-kms-key.html)命令：

```
aws logs disassociate-kms-key --resource-identifier "arn:aws:logs:region:account-id:query-result:*"
```