针对 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 主题策略
通过 https://console.aws.amazon.com/sns/v3/home
打开 Amazon SNS 控制台。 -
在导航窗格中,选择 Topics(主题)。
-
选择跟踪设置中显示的 SNS 主题,然后选择 Edit(编辑)。
-
展开 Access policy (访问策略)。
-
在 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
是您要向 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" } } }
-
完成 SNS 主题策略的编辑后,选择 Save changes(保存更改)。
将 aws:SourceAccount
条件键添加到您的 SNS 主题策略
通过 https://console.aws.amazon.com/sns/v3/home
打开 Amazon SNS 控制台。 -
在导航窗格中,选择 Topics(主题)。
-
选择跟踪设置中显示的 SNS 主题,然后选择 Edit(编辑)。
-
展开 Access policy (访问策略)。
-
在 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。此示例可将对 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" } } }
-
完成 SNS 主题策略的编辑后,选择 Save changes(保存更改)。
指定要发送通知的现有主题
您可以在 Amazon SNS 控制台中将 Amazon SNS 主题的权限手动添加到您的主题策略,然后在 CloudTrail 控制台中指定主题。
手动更新 SNS 主题策略
通过 https://console.aws.amazon.com/sns/v3/home
打开 Amazon SNS 控制台。 -
选择 Topics,然后选择主题。
-
选择编辑,然后向下滚动到访问策略。
-
添加 SNS topic policy 中的语句,并为区域、账户 ID 和主题名称提供适当的值。
-
如果您的主题是加密主题,则必须允许 CloudTrail 具有
kms:GenerateDataKey*
和kms:Decrypt
权限。有关更多信息,请参阅 Encrypted SNS topic KMS key policy。 -
选择 Save changes(保存更改)。
-
返回 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 命令。如果授权失败,则命令输出将包括值为
AuthorizationError
的LastNotificationError
字段。
其他资源
有关 SNS 主题和订阅这些主题的更多信息,请参阅 Amazon Simple Notification Service 开发人员指南。