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

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

日志组数据始终在 CloudWatch Logs 中加密。默认情况下,CloudWatch Logs 会对静态日志数据进行服务器端加密。此外,您也可以使用 Amazon Key Management Service 进行这一加密。如果这样做,则使用 Amazon KMS 客户托管式密钥进行加密。在创建日志组时或者在日志组已存在的情况下,通过将密钥与日志组相关联,在日志组级别启用使用 Amazon KMS 加密。

重要

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

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

如果您之后取消了客户管理的密钥与日志组的关联,CloudWatch Logs 将使用 CloudWatch Logs 原定设置加密方法来加密新摄入的数据。所有之前摄入的使用客户管理的密钥进行加密的数据,将继续使用原定设置的 CloudWatch Logs 服务器端加密进行加密。

重要

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

Limits

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

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

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

  • 不能使用 CloudWatch 控制台关联客户托管式密钥与日志组。

步骤 1:创建 Amazon KMS 客户托管式密钥

如需创建 Amazon KMS 客户管理密钥,请使用以下创建密钥命令:

aws kms create-key

输出包含密钥的密钥 ID 和 Amazon Resource Name (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:设置客户托管式密钥的权限

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

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

首先,使用以下 get-key-policy 命令,将您的客户托管式密钥默认策略保存为 policy.json

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:将日志组与客户托管式密钥关联

可以在创建日志组时或之后将客户托管式密钥与日志组关联。

使用以下 describe-log-groups 命令,可以确定日志组是否已经关联了客户托管式密钥:

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

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

在创建日志组时将客户托管式密钥与它关联

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

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

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

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

步骤 4:解除日志组与 CMK 的关联

要解除客户托管式密钥与日志组的关联,请使用以下 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 策略元素:条件

我们建议您为每个加密的日志组使用不同的客户托管式密钥。

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

将加密的日志组转换为使用某个客户托管式密钥,而某个策略将此客户托管式密钥限制到该日志组
  1. 输入以下命令以查找该日志组的当前密钥的 ARN:

    aws logs describe-log-groups

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

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

    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. 输入以下命令以将更新的策略添加到新的客户托管式密钥:

    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