使用 Amazon Key Management Service 对 CloudWatch Logs 中的日志数据进行加密 - Amazon CloudWatch 日志
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon Key Management Service 对 CloudWatch Logs 中的日志数据进行加密

日志组数据始终在 CloudWatch Logs 中加密。默认情况下,CloudWatch Logs 使用具有 256 位高级加密标准 Galois/Counter 模式(AES-GCM)的服务器端加密来对静态日志数据进行加密。此外,您也可以使用 Amazon Key Management Service 进行这一加密。如果这样做,则使用 Amazon KMS 密钥进行加密。在创建日志组时或者在日志组已存在的情况下,通过将 KMS 密钥与日志组相关联,在日志组级别启用使用 Amazon KMS 加密。

重要

CloudWatch Logs 现在支持使用 kms:EncryptionContext:aws:logs:arn 作为密钥和使用日志组的 ARN 作为该密钥的值来加密上下文。如果您的日志组已使用 KMS 密钥加密,并且您希望将密钥限制在单个账户和日志组中使用,则应分配一个新的 KMS 密钥,该 KMS 密钥在 IAM policy 中包含一个条件。有关更多信息,请参阅 Amazon KMS 密钥和加密上下文

将 KMS 密钥与日志组关联后,该日志组所有新摄取的数据都将使用该密钥加密。此数据在其保留期内始终以加密格式存储。CloudWatch Logs 可随时根据请求解密该数据。无论何时请求加密数据,CloudWatch Logs 都必须拥有对 KMS 的权限。

如果您之后取消了 KMS 密钥与日志组的关联,CloudWatch Logs 将使用 CloudWatch Logs 默认加密方法来加密新摄入的数据。所有使用 KMS 加密的先前摄取的数据仍使用 KMS 加密。取消关联 KMS 密钥后,CloudWatch Logs 仍然可以返回该数据,这是因为 CloudWatch Logs 仍然可以继续引用该密钥。但如果该密钥之后被禁用,则 CloudWatch Logs 无法读取使用该密钥加密的日志。

重要

CloudWatch Logs 仅支持对称 KMS 密钥。请勿使用非对称密钥对日志组中的数据进行加密。有关更多信息,请参阅使用对称和非对称密钥

限制

  • 要执行下列步骤,您必须具有以下权限:kms:CreateKeykms:GetKeyPolicykms:PutKeyPolicy

  • 将密钥与日志组关联或解除关联后,最多可能需要五分钟时间,此操作才能生效。

  • 如果撤消 CloudWatch Logs 对关联密钥的访问权限或删除关联的 KMS 密钥,您将无法再检索 CloudWatch Logs 中的加密数据。

  • 不能使用 CloudWatch 控制台将 KMS 密钥与日志组关联。

步骤 1:创建 Amazon KMS 密钥

要创建 KMS 密钥,请使用以下 create-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" ] } }

步骤 2:设置 KMS 密钥的权限

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

作为最佳做法,我们建议您将 KMS 密钥的使用限制为仅限于您指定的 Amazon 账户或日志组。

首先,使用以下 policy.jsonget-key-policy 命令将您的 KMS 密钥默认策略保存为

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

在文本编辑器中打开 policy.json 文件,然后从以下语句之一中添加粗体的部分。使用逗号将现有语句与新语句分隔。这些语句使用 Condition 部分来增强 Amazon KMS 密钥的安全性。有关更多信息,请参阅 Amazon KMS 密钥和加密上下文

本示例中的 Condition 部分将密钥限制为单个日志组 ARN。

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID: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": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:log-group:log-group-name" } } } ] }

本示例中的 Condition 部分对 Amazon KMS 密钥的使用进行限制,只有指定账户才能使用该密钥,但该密钥可用于任何日志组。

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID: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": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:*" } } } ] }

最后,使用以下 put-key-policy 命令添加更新后的策略:

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

步骤 3:将日志组与 KMS 密钥关联

可以在创建日志组时或创建完成后将 KMS 密钥与它关联。

要确定日志组是否已经关联了 KMS 密钥,请使用以下 describe-log-groups 命令:

aws logs describe-log-groups --log-group-name-prefix "log-group-name-prefix"

如果输出包含 kmsKeyId 字段,则日志组将与该字段值所对应的键相关联。

在创建日志组时将 KMS 密钥与它关联

按如下方式使用 create-log-group 命令:

aws logs create-log-group --log-group-name my-log-group --kms-key-id "key-arn"
将 KMS 密钥与现有日志组关联

按如下方式使用 associate-kms-key 命令:

aws logs associate-kms-key --log-group-name my-log-group --kms-key-id "key-arn"

步骤 4:取消日志组与密钥的关联

要取消 KMS 密钥与日志组的关联,请使用以下 disassociate-kms-key 命令:

aws logs disassociate-kms-key --log-group-name my-log-group

Amazon KMS 密钥和加密上下文

为了增强 Amazon Key Management Service 密钥和加密日志组的安全性,CloudWatch Logs 现在将日志组 ARN 作为用于加密日志数据的加密上下文的一部分。加密上下文是一组用作附加的经身份验证的数据的键值对。通过加密上下文,您可以使用 IAM policy 条件按Amazon账户和日志组来限制对 Amazon KMS 密钥的访问权限。有关更多信息,请参阅加密上下文IAM JSON 策略元素:条件

我们建议您为每个加密的日志组使用不同的 KMS 密钥。

如果您有以前加密的日志组,但现在希望将日志组更改为使用仅适用于该日志组的新 KMS 密钥,请按照下列步骤操作。

将加密的日志组转换为使用某个 KMS 密钥,并且有策略将此 KMS 密钥设置为仅限于该日志组使用
  1. 输入以下命令以查找该日志组的当前密钥的 ARN:

    aws logs describe-log-groups

    输出包括以下行。记录 ARN。您需要在步骤 7 中使用它。

    ... "kmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/01234567-89ab-cdef-0123-456789abcdef" ...
  2. 输入以下命令以创建新的 KMS 密钥:

    aws kms create-key
  3. 输入以下命令以将新密钥的策略保存到 policy.json 文件中:

    aws kms get-key-policy --key-id new-key-id --policy-name default --output text > ./policy.json
  4. 使用文本编辑器打开 policy.json 并向策略添加 Condition 表达式:

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT-ID: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": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT-ID:log- group:LOG-GROUP-NAME" } } } ] }
  5. 输入以下命令以将更新的策略添加到新的 KMS 密钥:

    aws kms put-key-policy --key-id new-key-ARN --policy-name default --policy file://policy.json
  6. 输入以下命令以将策略与日志组关联:

    aws logs associate-kms-key --log-group-name my-log-group --kms-key-id new-key-ARN

    CloudWatch Logs 现在使用新的密钥加密所有新数据。

  7. 接下来,从旧的密钥撤销除 Decrypt 之外的所有其他权限。首先,输入以下命令以检索旧策略:

    aws kms get-key-policy --key-id old-key-ARN --policy-name default --output text > ./policy.json
  8. 使用文本编辑器打开 policy.json 并从 Action 列表中删除所有值,但 kms:Decrypt* 除外

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Decrypt*" ], "Resource": "*" } ] }
  9. 输入以下命令以将更新的策略添加到旧的密钥:

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