适用于 Amazon SNS 的主题政策 CloudTrail - Amazon CloudTrail
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

适用于 Amazon SNS 的主题政策 CloudTrail

要向 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" } ] }

要使用 Amazon KMS加密的 Amazon SNS 主题发送通知,您还必须通过在的策略中添加以下声明来启用事件源 CloudTrail () 和加密主题之间的兼容性。 Amazon KMS key

KMS 密钥策略

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

有关更多信息,请参阅启用来自 Amazon 服务的事件源和加密主题之间的兼容性

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

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

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。此示例限制只有能够登录 Amazon 账户 123456789012 的用户才能访问 SNS 主题。

    { "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. 选择保存更改

  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 未为组织中的成员账户发送通知

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

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

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

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

其他 资源

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