

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

# Amazon SNS 主题政策适用于 CloudTrail
<a name="cloudtrail-permissions-for-sns-notifications"></a>

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

**重要**  
作为安全最佳实践，为了限制对 SNS 主题的访问，强烈建议您在创建或更新跟踪以发送 SNS 通知后，手动编辑附加到 SNS 主题的 IAM policy 以添加条件键。有关更多信息，请参阅本主题中的[SNS 主题策略的安全最佳实践](#cloudtrail-sns-notifications-policy-security)。

CloudTrail 为您在策略中添加以下语句，其中包含以下字段：
+ 允许的 SIDs。
+ 的服务主体名称 CloudTrail。
+ SNS 主题，包括区域、账户 ID 和主题名称。

以下策略 CloudTrail 允许从支持的区域发送有关日志文件传输的通知。有关更多信息，请参阅 [CloudTrail 支持的区域](cloudtrail-supported-regions.md)。这是在创建或更新跟踪并选择启用 SNS 通知时附加到新的或现有 SNS 主题策略的默认策略。

**SNS 主题策略**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AWSCloudTrailSNSPolicy20131101",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "SNS:Publish",
            "Resource": "arn:aws:sns:us-east-1:111111111111:SNSTopicName"
        }
    ]
}
```

------<a name="kms-key-policy"></a>

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

**KMS 密钥策略**

------
#### [ JSON ]

****  

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

------

有关更多信息，请参阅[启用来自 Amazon 服务的事件源和加密主题之间的兼容性](https://docs.amazonaws.cn/sns/latest/dg/sns-key-management.html#compatibility-with-aws-services)。

**Contents**
+ [SNS 主题策略的安全最佳实践](#cloudtrail-sns-notifications-policy-security)
+ [指定要发送通知的现有主题](#specifying-an-existing-topic-for-sns-notifications)
+ [SNS 主题策略问题排查](#troubleshooting-sns-topic-policy)
  + [CloudTrail 未发送某个地区的通知](#sns-topic-policy-for-multiple-regions)
  + [CloudTrail 未为组织中的成员账户发送通知](#sns-topic-policy-authorization-failure)
+ [其他资源](#cloudtrail-notifications-more-info-5)

## SNS 主题策略的安全最佳实践
<a name="cloudtrail-sns-notifications-policy-security"></a>

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

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

**将 `aws:SourceArn` 条件键添加到您的 SNS 主题策略**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.amazonaws.cn/sns/v3/home)

1. 在导航窗格中，选择**主题**。

1. 选择跟踪设置中显示的 SNS 主题，然后选择**编辑**。

1. 展开**访问策略**。

1. 在**访问策略** 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"
       }
   ```

1. 为条件添加新数据块 `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"
           }
         }
       }
   ```

1. 完成 SNS 主题策略的编辑后，选择**保存更改**。

**将 `aws:SourceAccount` 条件键添加到您的 SNS 主题策略**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.amazonaws.cn/sns/v3/home)

1. 在导航窗格中，选择**主题**。

1. 选择跟踪设置中显示的 SNS 主题，然后选择**编辑**。

1. 展开**访问策略**。

1. 在**访问策略** 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"
       }
   ```

1. 为条件添加新数据块 `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"
           }
         }
       }
   ```

1. 完成 SNS 主题策略的编辑后，选择 **Save changes**（保存更改）。

## 指定要发送通知的现有主题
<a name="specifying-an-existing-topic-for-sns-notifications"></a>

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

**手动更新 SNS 主题策略**

1. [在 v3/home 上打开亚马逊 SNS 控制台。https://console.aws.amazon.com/sns/](https://console.amazonaws.cn/sns/v3/home)

1. 选择 **Topics**，然后选择主题。

1. 选择**编辑**，然后向下滚动到**访问策略**。

1. 添加 [SNS topic policy](#sns-topic-policy) 中的语句，并为区域、账户 ID 和主题名称提供适当的值。

1. 如果您的主题是加密主题，则必须 CloudTrail 允许拥有`kms:GenerateDataKey*`和`kms:Decrypt`权限。有关更多信息，请参阅 [Encrypted SNS topic KMS key policy](#kms-key-policy)。

1. 选择**保存更改**。

1. 返回 CloudTrail 控制台并指定跟踪的主题。

## SNS 主题策略问题排查
<a name="troubleshooting-sns-topic-policy"></a>

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

**Topics**
+ [CloudTrail 未发送某个地区的通知](#sns-topic-policy-for-multiple-regions)
+ [CloudTrail 未为组织中的成员账户发送通知](#sns-topic-policy-authorization-failure)

### CloudTrail 未发送某个地区的通知
<a name="sns-topic-policy-for-multiple-regions"></a>

在创建或更新跟踪的过程中创建新主题时，会将所需的权限 CloudTrail 附加到您的主题。主题策略使用服务主体名称`"cloudtrail.amazonaws.com"`，该名称允许 CloudTrail 向所有区域发送通知。

如果 CloudTrail 不是针对某个地区发送通知，则您的主题可能有一个较旧的政策，该政策 IDs 为每个区域指定了 CloudTrail 账户。此类策略仅 CloudTrail 允许向指定区域发送通知。

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

以下示例策略 CloudTrail 允许为当前和新区域发送通知：

**Example 具有服务主体名称的主题策略**    
****  

```
{
    "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 未为组织中的成员账户发送通知
<a name="sns-topic-policy-authorization-failure"></a>

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

要检查跟踪的 SNS 主题策略是否存在授权失败，请执行以下操作：
+ 在 CloudTrail 控制台中，查看跟踪的详细信息页面。如果授权失败，则详细信息页面会包含一条警告 `SNS authorization failed`，并指示修复 SNS 主题策略。
+ 从中 Amazon CLI，运行[https://docs.amazonaws.cn/cli/latest/reference/cloudtrail/get-trail-status.html](https://docs.amazonaws.cn/cli/latest/reference/cloudtrail/get-trail-status.html)命令。如果授权失败，则命令输出将包括值为 `AuthorizationError` 的 `LastNotificationError` 字段。

## 其他资源
<a name="cloudtrail-notifications-more-info-5"></a>

有关 SNS 主题和订阅这些主题的更多信息，请参阅 [Amazon Simple Notification Service 开发人员指南](https://docs.amazonaws.cn/sns/latest/dg/)。