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

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

适用于 Amazon 的SNS主题政策 CloudTrail

要向SNS主题发送通知, CloudTrail 必须具有所需的权限。 CloudTrail当您在 CloudTrail 控制台中创建或更新跟踪时创建 Amazon SNS 主题时,会自动为该主题附加所需的权限。

重要

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

CloudTrail 为您在策略中添加以下语句,其中包含以下字段:

  • 允许的SIDs。

  • 的服务主体名称 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 服务委托人向标识的SNS主题发布内容ARN。为帮助防止攻击者访问您的SNS主题并代表主题收件人发送通知, CloudTrail 请手动编辑您的 CloudTrail SNS主题策略,以便在所附的策略声明中添加aws:SourceArn条件密钥 CloudTrail。此键的值是跟踪ARN的值,或者是使用ARNs该SNS主题的跟踪数组。由于它同时包含特定的跟踪 ID 和拥有跟踪的账户 ID,因此仅允许有权管理跟踪的账户访问SNS主题。在向SNS主题策略添加条件密钥之前,请从 CloudTrail 控制台中的跟踪设置中获取SNS主题名称。

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

aws:SourceArn条件密钥添加到您的SNS主题策略中
  1. https://console.aws.amazon.com/sns/v3/ hom SNS e 上打开亚马逊主机。

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

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

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

  5. 访问策略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是您要向ARN其发送通知的跟踪的值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:SourceArn": "arn:aws:cloudtrail:us-west-2:123456789012:trail/Trail3" } } }
  7. 编辑完SNS主题策略后,选择保存更改

aws:SourceAccount条件密钥添加到您的SNS主题策略中
  1. https://console.aws.amazon.com/sns/v3/ hom SNS e 上打开亚马逊主机。

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

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

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

  5. 访问策略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主题策略后,选择保存更改

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

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

手动更新SNS主题政策
  1. https://console.aws.amazon.com/sns/v3/ hom SNS e 上打开亚马逊主机。

  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 不是针对某个地区发送通知,则您的主题可能有一个较旧的政策,该政策IDs为每个区域指定了 CloudTrail 账户。此政策仅 CloudTrail 允许向指定区域发送通知。

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

例 带有账号的话题政策 IDs
{ "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 账户的权限IDs。要为新区域传送日志,您必须手动更新策略以包含该地区的 CloudTrail账户 ID。例如,由于 CloudTrail 增加了对美国东部(俄亥俄州)地区的支持,因此您必须更新政策才能ARN为该地区添加账户 ID:"arn:aws:iam::475085895292:root"

作为最佳实践,请更新策略以使用 CloudTrail 服务主体的权限。为此,请将账户 ID ARNs 替换为服务主体名称:"cloudtrail.amazonaws.com"

这 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主题不包括所有成员账户IDs。如果SNS主题策略不正确,则会发生授权失败。

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

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

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

其他 资源

有关SNS主题和订阅主题的更多信息,请参阅《Amazon 简单通知服务开发者指南》