

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

# 使用加密 CloudWatch 日志中的查找表 AWS Key Management Service
<a name="encrypt-lookup-tables-kms"></a>

Logs 中始终对查找表数据进行 CloudWatch 加密。默认情况下， CloudWatch Logs 使用具有 256 位高级加密标准 Galois/Counter 模式 (AES-GCM) 的服务器端加密来加密查询表的静态数据。此外，您也可以使用 AWS Key Management Service 进行这一加密。如果这样做，则使用密 AWS KMS 钥进行加密。在查找表级别启用加密，方法 AWS KMS 是在创建查找表时或更新查找表时将 KMS 密钥与查找表关联。

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

将 KMS 密钥与查找表关联后，存储在查找表中的所有数据都将使用此密钥进行加密。 CloudWatch 每当有人请求这些数据时，日志都会对其进行解密。 CloudWatch 每当请求加密数据时，日志都必须具有 KMS 密钥的权限。

如果您稍后解除 KMS 密钥与查找表的关联，Logs 将使用 CloudWatch CloudWatch 日志默认加密方法对数据进行加密。但是，如果在解除关联之前密钥被禁用或删除，则 CloudWatch Logs 将无法读取使用该密钥加密的数据。

有关 L CloudWatch ogs AWS KMS 如何使用加密日志数据的一般信息，请参阅[使用加密日志中的 CloudWatch 日志数据 AWS Key Management Service](encrypt-log-data-kms.md)。

## CloudWatch 日志如何 AWS KMS 用于查找表
<a name="encrypt-lookup-tables-how-it-works"></a>

CloudWatch 日志使用 AWS KMS 信封加密来保护查找表数据。当您将 KMS 密钥与查找表关联时，L CloudWatch ogs 会向发送`GenerateDataKey`请求 AWS KMS。 AWS KMS 生成唯一的数据加密密钥 (DEK) 并返回 DEK 的纯文本副本和加密副本。 CloudWatch 日志使用纯文本 DEK 对查找表数据进行加密，然后将加密的 DEK 与加密数据一起存储。纯文本 DEK 不存储，使用后会从内存中丢弃。

当 CloudWatch Logs 需要读取查找表数据时，它会 AWS KMS 使用加密的 DEK 向发送`Decrypt`请求。 AWS KMS 解密 DEK 并将纯文本 DEK 返回到 Logs，然后 CloudWatch 日志使用它来解密查找表数据。

CloudWatch 在向日志发出请求时，日志使用以下加密上下文 AWS KMS：

```
{
    "aws:logs:arn": "arn:aws:logs:region:account-id:lookup-table:lookup-table-name"
}
```

您可以在 IAM 策略和密 AWS KMS 钥策略中使用此加密上下文来控制对 KMS 密钥的访问。有关更多信息，请参阅 [AWS KMS 密钥和加密上下文](encrypt-log-data-kms.md#encrypt-log-data-kms-policy)。

## 所需的权限
<a name="encrypt-lookup-tables-permissions"></a>

要对查找表使用 AWS KMS 加密，IAM 委托人必须对 KMS 密钥 AWS KMS 具有以下权限：
+ `kms:Decrypt`
+ `kms:GenerateDataKey`

调用`GetLookupTable`使用 KMS 密钥加密的查找表时需要该`kms:Decrypt`权限，这样 L CloudWatch ogs 才能代表您解密数据。当使用对加密的查找表使用`lookup`命令的查询进行调`StartQuery`用时，还需要对密钥（用于加密查找表的 KMS 密钥）拥有`kms:Decrypt`权限。调`UpdateLookupTable`用`CreateLookupTable`或使用 KMS 密钥时需要该`kms:GenerateDataKey`权限，这样 L CloudWatch ogs 才能生成数据加密密钥来加密查找表数据。

此外， CloudWatch 日志服务必须有权使用 KMS 密钥。您可以通过向 KMS 密钥策略添加策略声明来授予这些权限，如下一节所述。

## 步骤 1：创建 AWS KMS 密钥
<a name="encrypt-lookup-tables-create-key"></a>

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

```
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"
        ]
    }
}
```

记录密钥 ARN。你需要在以下步骤中使用它。

## 步骤 2：设置 KMS 密钥的权限
<a name="encrypt-lookup-tables-key-policy"></a>

默认情况下，所有 AWS KMS 密钥都是私有的。只有资源所有者可以使用它来加密和解密数据。您必须向 CloudWatch 日志服务主体授予使用密钥的权限，还必须向调用角色授予使用密钥的权限。

首先，`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`文件并添加以下语句以授予 CloudWatch 日志服务主体使用密钥的权限。此示例使用与加密上下文匹配的`Condition`部分将密钥限制在特定的查找表中。

```
{
    "Effect": "Allow",
    "Principal": {
        "Service": "logs.region.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:lookup-table:lookup-table-name",
            "aws:SourceAccount": "account-id",
            "aws:SourceArn": "arn:aws:logs:region:account-id:lookup-table:lookup-table-name"
        }
    }
}
```

接下来，为将调用 CloudWatch 日志的角色添加权限`CreateLookupTable`或`UpdateLookupTable` APIs。 CloudWatch 记录`kms:ViaService`用户 AWS KMS 代表客户拨打电话。有关更多信息，请参阅 [kms: ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service)。

```
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::account-id:role/role-name"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": [
                "logs.region.amazonaws.com"
            ]
        }
    }
}
```

最后，使用以下[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="encrypt-lookup-tables-associate"></a>

在使用 `CreateLookupTable` API 创建 KMS 密钥时，您可以将其与查找表关联，也可以使用 `UpdateLookupTable` API 更新现有的查找表。两者 APIs 都是 AWSLogsConfigService.

**在创建 KMS 密钥时将其与查找表关联**  
使用 `CreateLookupTable` API 并使用您的 KMS 密钥的 ARN 指定`kmsKeyArn`参数：

```
aws logs create-lookup-table \
    --lookup-table-name my-lookup-table \
    --kms-key-arn "arn:aws:kms:region:account-id:key/key-id"
```

**将 KMS 密钥与现有查找表关联**  
使用 `UpdateLookupTable` API 并使用您的 KMS 密钥的 ARN 指定`kmsKeyArn`参数：

```
aws logs update-lookup-table \
    --lookup-table-name my-lookup-table \
    --kms-key-arn "arn:aws:kms:region:account-id:key/key-id"
```

## 注意事项
<a name="encrypt-lookup-tables-considerations"></a>
+ 将 KMS 密钥与查找表关联或取消关联后，该操作最多可能需要五分钟才能生效。
+ 如果您撤消 CloudWatch 日志对关联密钥的访问权限或删除关联的 KMS 密钥，则无法再检索 CloudWatch 日志中的加密查找表数据。
+ 要执行本主题中的步骤，您必须具有以下权限：`kms:CreateKey`、`kms:GetKeyPolicy``kms:PutKeyPolicy`、以及相应的 CloudWatch Logs 权限才能调用`CreateLookupTable`或`UpdateLookupTable`。