为 CloudTrail 配置 Amazon KMS 密钥策略 - Amazon CloudTrail
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

为 CloudTrail 配置 Amazon KMS 密钥策略

您可以通过三种方式创建 Amazon KMS key:

  • CloudTrail 控制台

  • Amazon 管理控制台

  • 这些区域有:Amazon CLI

注意

如果您在 CloudTrail 控制台中创建 KMS 密钥,则 CloudTrail 会为您添加必需的 KMS 密钥策略。您无需手动添加策略声明。请参阅在 CloudTrail 控制台中创建的默认 KMS 密钥策略

如果您在 Amazon 管理或 Amazon CLI 中创建 KMS 密钥,则必须为密钥添加策略部分,以便将它用于 CloudTrail。该策略必须允许 CloudTrail 使用该密钥加密您的日志文件和事件数据存储,并允许您指定的用户读取未加密形式的日志文件。

请参阅以下资源:

  • 要使用 Amazon CLI 创建 KMS 密钥,请参阅 create-key

  • 要编辑 CloudTrail 的 KMS 密钥策略,请参阅 Amazon Key Management Service 开发人员指南中的编辑密钥策略

  • 有关 CloudTrail 如何使用 Amazon KMS 的技术细节,请参阅 Amazon Key Management Service开发人员指南中的 Amazon CloudTrail 如何使用 Amazon KMS

用于 CloudTrail 时必需的 KMS 密钥策略部分

如果您使用 Amazon 管理或 Amazon CLI 创建 KMS 密钥,则必须至少为 KMS 密钥策略添加以下语句,才能使其可用于 CloudTrail。

跟踪所需的 KMS 密钥策略元素

  1. 启用 CloudTrail 日志加密权限。请参阅授予加密权限

  2. 启用 CloudTrail 日志解密权限。请参阅授予解密权限。如果您通过 S3 存储桶密钥使用现有 S3 存储桶,则需要 kms:Decrypt 权限才能创建或更新启用了 SSE-KMS 加密的跟踪。

  3. 启用 CloudTrail 以描述 KMS 密钥属性。请参阅启用 CloudTrail 以描述 KMS 密钥属性

作为安全最佳实践,请将 aws:SourceArn 条件密钥添加到 KMS 密钥策略。IAM 全局条件密钥 aws:SourceArn 有助于确保 CloudTrail 仅将 KMS 密钥用于特定跟踪记录或多个跟踪记录。aws:SourceArn 的值始终是使用 KMS 密钥的跟踪记录 ARN(或跟踪记录 ARN 数组)。确保将 aws:SourceArn 条件密钥添加到现有跟踪记录的 KMS 密钥策略。

也支持 aws:SourceAccount 条件密钥,但不推荐使用。aws:SourceAccount 的值是跟踪记录拥有者的账户 ID,或用于企业跟踪记录的管理账户 ID。

重要

向 KMS 密钥策略添加新部分时,不要更改策略中任何已存在的部分。

如果对跟踪记录启用了加密但禁用了 KMS 密钥,或未针对 CloudTrail 正确地配置 KMS 密钥策略,则 CloudTrail 无法交付日志。

事件数据存储所需的 KMS 密钥策略元素

  1. 启用 CloudTrail 日志加密权限。请参阅授予加密权限

  2. 启用 CloudTrail 日志解密权限。请参阅授予解密权限

  3. 授予用户和角色使用 KMS 密钥对事件数据存储数据进行加密和解密的权限。

    在您创建事件数据存储并使用 KMS 密钥对其进行加密时,或者针对使用 KMS 密钥加密的事件数据存储运行查询时,您应该拥有对 KMS 密钥的写入权限。KMS 密钥策略必须有权访问 CloudTrail,并且 KMS 密钥应该可由针对事件数据存储运行操作(如查询)的用户管理。

  4. 启用 CloudTrail 以描述 KMS 密钥属性。请参阅启用 CloudTrail 以描述 KMS 密钥属性

在适用于事件数据存储的 KMS 密钥策略中,不支持 aws:SourceArnaws:SourceAccount 条件密钥。

重要

向 KMS 密钥策略添加新部分时,不要更改策略中任何已存在的部分。

如果针对事件数据存储启用了加密,并且禁用或删除了 KMS 密钥,或者没有为 CloudTrail 正确配置 KMS 密钥策略,则 CloudTrail 无法将事件传送到您的事件数据存储。

授予加密权限

例 允许 CloudTrail 代表特定账户加密日志

CloudTrail 需要显式的权限才能代表特定的账户使用 KMS 密钥加密日志。要指定账户,请将以下所需语句添加到您的 KMS 密钥策略,并将 account-idregiontrailName 替换为与您的配置相应的值。您可以向 EncryptionContext 部分添加额外的账户 ID,以使这些账户能够使用 CloudTrail 借助您的 KMS 密钥加密日志文件。

作为安全最佳实践,请将 aws:SourceArn 条件密钥添加到适用于跟踪的 KMS 密钥策略。IAM 全局条件密钥 aws:SourceArn 有助于确保 CloudTrail 仅将 KMS 密钥用于特定跟踪记录或多个跟踪记录。

{ "Sid": "Allow CloudTrail to encrypt logs", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:GenerateDataKey*", "Resource": "arn:aws:kms:region:account-id:key/key-id", "Condition": { "StringLike": { "kms:EncryptionContext:aws:cloudtrail:arn": [ "arn:aws:cloudtrail:*:account-id:trail/*" ] }, "StringEquals": { "aws:SourceArn": "arn:aws:cloudtrail:region:account-id:trail/trail-name" } } }

下面的示例策略语句演示了其他账户如何使用您的 KMS 密钥加密 CloudTrail 日志。

情况
  • 您的 KMS 密钥位于账户 111111111111 中。

  • 您和账户 222222222222 都将加密日志。

在此策略中,您向 CloudTrail EncryptionContext 添加了一个或多个使用您的密钥执行加密操作的账户。这会限制 CloudTrail 只能对您指定的账户使用您的密钥来加密日志。如果向账户 222222222222 的根账户授予加密日志的权限时,会将权限委托给账户管理员,以便加密该账户中其他用户所需的权限。账户管理员只需更改与这些 IAM 用户关联的策略,即可实现此目的。

作为安全最佳实践,请将 aws:SourceArn 条件密钥添加到 KMS 密钥策略。IAM 全局条件键 aws:SourceArn 有助于确保 CloudTrail 仅将 KMS 密钥用于特定跟踪。但事件数据存储的 KMS 密钥政策并不支持此条件。

KMS 密钥策略语句:

{ "Sid": "Enable CloudTrail encrypt permissions", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:GenerateDataKey*", "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:cloudtrail:arn": [ "arn:aws:cloudtrail:*:111111111111:trail/*", "arn:aws:cloudtrail:*:222222222222:trail/*" ] }, "StringEquals": { "aws:SourceArn": "arn:aws:cloudtrail:region:account-id:trail/trail-name" } } }

有关编辑 KMS 密钥政策以便与 CloudTrail 一起使用的更多信息,请参阅《Amazon Key Management Service Developer Guide》中的 Editing a key policy

授予解密权限

在将 KMS 密钥添加到您的 CloudTrail 配置之前,应向所有需要的用户提供解密权限。拥有加密权限但没有解密权限的用户无法读取加密日志。如果您通过 S3 存储桶密钥使用现有 S3 存储桶,则需要 kms:Decrypt 权限才能创建或更新启用了 SSE-KMS 加密的跟踪。

启用 CloudTrail 日志解密权限

必须为使用您的密钥的用户授予读取 CloudTrail 已加密的日志文件的显式权限。为使用户能够读取加密日志,请向您的 KMS 密钥政策添加下面的必需语句(修改 Principal 部分,从而为您希望能够利用您的 KMS 密钥执行解密操作的每个主体添加一行)。

{ "Sid": "Enable CloudTrail log decrypt permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:user/username" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "Null": { "kms:EncryptionContext:aws:cloudtrail:arn": "false" } } }

以下是允许 CloudTrail 服务主体解密跟踪日志所需的示例策略。

{ "Sid": "Allow CloudTrail to decrypt a trail", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:Decrypt", "Resource": "*" }

允许您账户中的用户使用您的 KMS 密钥解密跟踪日志

示例

此策略语句演示如何允许您账户中的用户或角色使用您的密钥读取您账户的 S3 存储桶中的加密日志。

例 情况
  • 您的 KMS 密钥、S3 存储桶以及 IAM 用户 Bob 均位于账户 111111111111 中。

  • 您授予 IAM 用户 Bob 解密此 S3 存储桶中的 CloudTrail 日志的权限。

在密钥策略中,您为 IAM 用户 Bob 启用了 CloudTrail 日志解密权限。

KMS 密钥策略语句:

{ "Sid": "Enable CloudTrail log decrypt permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:user/Bob" }, "Action": "kms:Decrypt", "Resource": "arn:aws:kms:region:account-id:key/key-id", "Condition": { "Null": { "kms:EncryptionContext:aws:cloudtrail:arn": "false" } } }
主题

    允许其他账户中的用户使用您的 KMS 密钥解密跟踪日志

    您可以允许其他账户中的用户使用您的 KMS 密钥解密跟踪日志,而非事件数据存储日志。需要对密钥策略执行的更改取决于 S3 存储桶位于您的账户还是其他账户中。

    允许其他账户中的存储桶用户解密日志

    示例

    此策略声明演示如何让其他账户中的 IAM 用户或角色使用您的密钥读取其他账户的 S3 存储桶中的加密日志。

    情况
    • 您的 KMS 密钥位于账户 111111111111 中。

    • IAM 用户 Alice 和 S3 存储桶均位于账户 222222222222 中。

    在这种情况下,您需要赋予 CloudTrail 解密账户 222222222222 下的日志的权限,且赋予 Alice 的 IAM 用户使用密钥 KeyA(位于账户 111111111111 中)的策略权限。

    KMS 密钥策略语句:

    { "Sid": "Enable encrypted CloudTrail log read access", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::222222222222:root" ] }, "Action": "kms:Decrypt", "Resource": "arn:aws:kms:region:account-id:key/key-id", "Condition": { "Null": { "kms:EncryptionContext:aws:cloudtrail:arn": "false" } } }

    Alice 的 IAM 用户策略声明:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:us-west-2:111111111111:key/KeyA" } ] }

    允许其他账户中的用户解密您的桶中的跟踪日志

    此策略演示其他账户如何使用您的密钥读取您的 S3 存储桶中的加密日志。

    例 情况
    • 您的 KMS 密钥和 S3 存储桶均位于账户 111111111111 中。

    • 从您的存储桶读取日志的用户位于账户 222222222222 中。

    要实现这一场景,您需要为您账户中的 IAM 角色 CloudTrailReadRole 启用解密权限,然后赋予对方账户担任此角色的权限。

    KMS 密钥策略语句:

    { "Sid": "Enable encrypted CloudTrail log read access", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::11111111111:role/CloudTrailReadRole" ] }, "Action": "kms:Decrypt", "Resource": "arn:aws:kms:region:account-id:key/key-id", "Condition": { "Null": { "kms:EncryptionContext:aws:cloudtrail:arn": "false" } } }

    CloudTrailReadRole 信任实体策略声明:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Allow CloudTrail access", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:root" }, "Action": "sts:AssumeRole" } ] }

    有关编辑 KMS 密钥策略以便与 CloudTrail 配合使用的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的编辑密钥策略

    启用 CloudTrail 以描述 KMS 密钥属性

    CloudTrail 需要描述 KMS 密钥属性的能力。要启用此功能,请将下面的必需语句原样添加到您的 KMS 密钥策略中。此声明不会授予 CloudTrail 任何超出您指定的其他权限的权限。

    作为安全最佳实践,请将 aws:SourceArn 条件密钥添加到 KMS 密钥策略。IAM 全局条件密钥 aws:SourceArn 有助于确保 CloudTrail 仅将 KMS 密钥用于特定跟踪记录或多个跟踪记录。

    { "Sid": "Allow CloudTrail access", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:DescribeKey", "Resource": "arn:aws:kms:region:account-id:key/key-id", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudtrail:region:account-id:trail/trail-name" } } }

    有关编辑 KMS 密钥策略的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的编辑密钥策略