本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
适用于 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主题策略中
在 https://console.aws.amazon.com/sns/v3/
hom SNS e 上打开亚马逊主机。 -
在导航窗格中,选择 Topics(主题)。
-
选择您的跟踪设置中显示SNS的主题,然后选择编辑。
-
展开 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" }
-
为条件添加新数据块
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" } } }
-
编辑完SNS主题策略后,选择保存更改。
将aws:SourceAccount
条件密钥添加到您的SNS主题策略中
在 https://console.aws.amazon.com/sns/v3/
hom SNS e 上打开亚马逊主机。 -
在导航窗格中,选择 Topics(主题)。
-
选择您的跟踪设置中显示SNS的主题,然后选择编辑。
-
展开 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" }
-
为条件添加新数据块
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" } } }
-
编辑完SNS主题策略后,选择保存更改。
指定要发送通知的现有主题
您可以在亚马逊控制台中手动将亚马逊SNS主题的权限添加到您的主题策略中,然后在SNS控制台中指定该 CloudTrail 主题。
手动更新SNS主题政策
在 https://console.aws.amazon.com/sns/v3/
hom SNS e 上打开亚马逊主机。 -
选择 Topics,然后选择主题。
-
选择 “编辑”,然后向下滚动到 “访问策略”。
-
添加SNS topic policy包含相应区域、账户 ID 和主题名称值的声明。
-
如果您的主题是加密主题,则必须 CloudTrail 允许拥有
kms:GenerateDataKey*
和kms:Decrypt
权限。有关更多信息,请参阅 Encrypted SNS topic KMS key policy。 -
选择保存更改。
-
返回 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 简单通知服务开发者指南》。