针对 CloudTrail 的 Amazon SNS 主题策略 - AWS CloudTrail

针对 CloudTrail 的 Amazon SNS 主题策略

要将通知发送到 SNS 主题,CloudTrail 必须拥有必需的权限。在 CloudTrail 控制台中创建或更新跟踪的过程中创建 Amazon SNS 主题时,CloudTrail 会自动将所需权限附加到该主题。

重要

作为安全最佳实践,为了限制对 SNS 主题的访问,强烈建议您在创建或更新跟踪以发送 SNS 通知后,手动编辑附加到 SNS 主题的 IAM policy 以添加条件键。有关更多信息,请参阅本主题中的SNS 主题策略的安全最佳实践

CloudTrail 使用以下字段将以下语句添加到策略:

  • 允许的 SID。

  • CloudTrail 的服务委托方名称。

  • SNS 主题,包括区域、账户 ID 和主题名称。

以下策略允许 CloudTrail 从受支持的区域发送有关传输日志文件的通知。有关更多信息,请参阅 CloudTrail 支持的区域。这是在创建或更新跟踪并选择启用 SNS 通知时附加到新的或现有 SNS 主题策略的默认策略。

SNS 主题策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailSNSPolicy20131101", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:region:SNSTopicOwnerAccountId:SNSTopicName" } ] }

要使用 AWS KMS 加密的 Amazon SNS 主题发送通知,则还必须通过向 AWS KMS key 的策略添加以下语句,在事件源 (CloudTrail) 与加密主题之间启用兼容性。

KMS 密钥策略

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": [ "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" } ] }

有关更多信息,请参阅实现 AWS 服务中的事件源与加密主题之间的兼容性

SNS 主题策略的安全最佳实践

默认情况下,CloudTrail 附加到您的 Amazon SNS 主题的 IAM policy 语句允许 CloudTrail 服务委托方发布到 SNS 主题,并通过 ARN 标识。为了帮助防止攻击者访问您的 SNS 主题,并代表 CloudTrail 向主题收件人发送通知,请手动编辑您的 CloudTrail SNS 主题策略,以将 aws:SourceArn 条件密钥添加到 CloudTrail 附加的策略语句中。此密钥的值是跟踪记录的 ARN,或使用 SNS 主题的跟踪记录 ARN 数组。因为它既包括特定跟踪记录 ID,也包括拥有该跟踪记录的账户的 ID,所以它将 SNS 主题限制为仅可访问那些有权限管理该跟踪记录的账户。在将条件键添加到 SNS 主题策略之前,请从 CloudTrail 控制台的跟踪设置中获取 SNS 主题名称。

aws:SourceAccount 支持条件密钥,但不建议使用。

aws:SourceArn 条件键添加到您的 SNS 主题策略
  1. 通过 https://console.aws.amazon.com/sns/v3/home 打开 Amazon SNS 控制台。

  2. 在导航窗格中,选择 Topics(主题)

  3. 选择跟踪设置中显示的 SNS 主题,然后选择 Edit(编辑)。

  4. 展开 Access policy (访问策略)

  5. Access policy(访问策略)JSON 编辑器中,查找类似于以下示例的数据块。

    { "Sid": "AWSCloudTrailSNSPolicy20150319", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-west-2:111122223333:aws-cloudtrail-logs-111122223333-61bbe496" }
  6. 为条件添加新数据块 aws:SourceArn,如以下示例中所示。值 aws:SourceArn 是您要向 SNS 发送通知的跟踪的 ARN。

    { "Sid": "AWSCloudTrailSNSPolicy20150319", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-west-2:111122223333:aws-cloudtrail-logs-111122223333-61bbe496", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudtrail:us-west-2:123456789012:trail/Trail3" } } }
  7. 完成 SNS 主题策略的编辑后,选择 Save changes(保存更改)。

aws:SourceAccount 条件键添加到您的 SNS 主题策略
  1. 通过 https://console.aws.amazon.com/sns/v3/home 打开 Amazon SNS 控制台。

  2. 在导航窗格中,选择 Topics(主题)

  3. 选择跟踪设置中显示的 SNS 主题,然后选择 Edit(编辑)。

  4. 展开 Access policy (访问策略)

  5. Access policy(访问策略)JSON 编辑器中,查找类似于以下示例的数据块。

    { "Sid": "AWSCloudTrailSNSPolicy20150319", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-west-2:111122223333:aws-cloudtrail-logs-111122223333-61bbe496" }
  6. 为条件添加新数据块 aws:SourceAccount,如以下示例中所示。值 aws:SourceAccount 是拥有 CloudTrail 跟踪的账户的 ID。此示例可将对 SNS 主题的访问权限仅限于那些可以登录 AWS 账户 123456789012 的用户。

    { "Sid": "AWSCloudTrailSNSPolicy20150319", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-west-2:111122223333:aws-cloudtrail-logs-111122223333-61bbe496", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }
  7. 完成 SNS 主题策略的编辑后,选择 Save changes(保存更改)。

指定要发送通知的现有主题

您可以在 Amazon SNS 控制台中将 Amazon SNS 主题的权限手动添加到您的主题策略,然后在 CloudTrail 控制台中指定主题。

手动更新 SNS 主题策略
  1. 通过 https://console.aws.amazon.com/sns/v3/home 打开 Amazon SNS 控制台。

  2. 选择 Topics,然后选择主题。

  3. 选择编辑,然后向下滚动到访问策略

  4. 添加 SNS topic policy 中的语句,并为区域、账户 ID 和主题名称提供适当的值。

  5. 如果您的主题是加密主题,则必须允许 CloudTrail 具有 kms:GenerateDataKey*kms:Decrypt 权限。有关更多信息,请参阅 Encrypted SNS topic KMS key policy

  6. 选择 Save changes(保存更改)

  7. 返回 CloudTrail 控制台,指定跟踪的主题。

SNS 主题策略问题排查

以下部分说明如何对 SNS 主题策略进行问题排查。

CloudTrail 没有为某个区域发送通知

当您在创建或更新跟踪的过程中新建主题时,CloudTrail 会为您的主题附加必要的权限。主题策略使用名为 "cloudtrail.amazonaws.com" 的服务主体,其允许 CloudTrail 将通知发送到所有区域。

如果 CloudTrail 不能将通知发送到某一区域,可能是主题使用了较旧的策略,即针对每个区域指定了 CloudTrail 账户 ID。此策略只允许 CloudTrail 将通知发送到指定区域。

以下主题策略只允许 CloudTrail 将通知发送到指定的九个区域:

例 具有账户 ID 的主题策略
{ "Version": "2012-10-17", "Statement": [{ "Sid": "AWSCloudTrailSNSPolicy20131101", "Effect": "Allow", "Principal": {"AWS": [ "arn:aws:iam::903692715234:root", "arn:aws:iam::035351147821:root", "arn:aws:iam::859597730677:root", "arn:aws:iam::814480443879:root", "arn:aws:iam::216624486486:root", "arn:aws:iam::086441151436:root", "arn:aws:iam::388731089494:root", "arn:aws:iam::284668455005:root", "arn:aws:iam::113285607260:root" ]}, "Action": "SNS:Publish", "Resource": "aws:arn:sns:us-east-1:123456789012:myTopic" }] }

此策略根据单个 CloudTrail 账户 ID 来使用权限。要向新区域传输日志,您必须手动更新策略,以包含该区域的 CloudTrail 账户 ID。例如,由于 CloudTrail 新增了对美国东部(俄亥俄州)区域的支持,您必须更新策略,以添加该区域的账户 ID ARN:"arn:aws:iam::475085895292:root"

作为最佳实践,应更新策略以使用 CloudTrail 服务委托方的权限。为此,请用服务委托方的名称 ("cloudtrail.amazonaws.com") 替换账户 ID ARN。

这样 CloudTrail 就拥有了将通知发送到当前区域和新区域的权限。以下是前一策略的更新版本:

例 具有服务委托方名称的主题策略
{ "Version": "2012-10-17", "Statement": [{ "Sid": "AWSCloudTrailSNSPolicy20131101", "Effect": "Allow", "Principal": {"Service": "cloudtrail.amazonaws.com"}, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-west-2:123456789012:myTopic" }] }

验证策略具有正确的值:

  • Resource 字段中,指定主题所有者的账号。如果主题是由您创建的,请指定您的账号。

  • 为区域和 SNS 主题名称指定适当的值。

CloudTrail 未向组织中的成员账户发送通知

当具有 AWS Organizations 组织跟踪的成员账户未发送 Amazon SNS 通知时,SNS 主题策略的配置可能存在问题。即使资源验证失败,CloudTrail 也会在成员账户中创建组织跟踪,例如,组织跟踪的 SNS 主题不包含所有成员账户 ID。如果 SNS 主题策略不正确,则会导致授权失败。

要检查跟踪的 SNS 主题策略是否存在授权失败,请执行以下操作:

  • 在 CloudTrail 控制台中,查看跟踪的详细信息页面。如果授权失败,则详细信息页面会包含一条警告 SNS authorization failed,并指示修复 SNS 主题策略。

  • 从 AWS CLI 运行 get-trail-status 命令。如果授权失败,则命令输出将包括值为 AuthorizationErrorLastNotificationError 字段。

其他资源

有关 SNS 主题和订阅这些主题的更多信息,请参阅 Amazon Simple Notification Service 开发人员指南