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

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

适用于 CloudTrail 的 Amazon SNS 主题策略

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

CloudTrail 将以下语句添加到策略:

  • 允许的 SID。

  • CloudTrail 的服务委托人名称。

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

以下策略允许 CloudTrail 从受支持的区域发送有关传送日志文件的通知。有关更多信息,请参阅CloudTrail 支持的区域

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 主题发送通知,则还必须在事件源 (CloudTrail) 与加密主题之间启用兼容性,方法是添加以下语句到客户主密钥 (CMK) 的策略。

CMK 策略

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

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

注意

如果您在中国(北京)区域创建策略,请使用服务委托人名称:"cloudtrail.amazonaws.com.cn"

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

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

手动更新 SNS 主题策略

  1. 通过以下网址打开 Amazon SNS 控制台:https://console.aws.amazon.com/sns/v3/home

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

  3. 选择 Other topic actions,然后选择 Edit topic policy

  4. 选择 Advanced view,并根据 SNS topic policy 添加语句,用适当的值替换区域、账户 ID 和主题名称。

  5. 选择 Update policy

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

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

SNS 主题策略问题排查

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

SNS 策略配置常见错误

当您在创建或更新跟踪的过程中新建主题时,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 主题名称指定适当的值。

其他资源

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