

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

# Amazon SNS 中的数据保护策略操作
<a name="sns-message-data-protection-operations"></a>

**重要**  
从 2026 年 4 月 30 日起，Amazon SNS 消息数据保护将不再向新客户提供。有关替代方案的更多信息和指导，请参阅 [Amazon SNS 消息数据保护可用性变更](https://docs.amazonaws.cn/sns/latest/dg/sns-message-data-protection-availability-change.html)。

以下数据保护策略示例可用于审计和拒绝敏感数据。有关包含示例应用程序的完整教程，请参阅 [Introducing message data protection for Amazon SNS](https://www.amazonaws.cn/blogs/compute/introducing-message-data-protection-for-amazon-sns/)（Amazon SNS 消息数据保护简介）博客文章。

## 审计操作
<a name="statement-operation-json-properties-audit"></a>

**审计操作对**主题入站消息进行采样，并记录 Amazon 目标中发现的敏感数据。采样率可以是 0-99 之间的整数。此操作需要以下类型的日志记录目标之一：

1. **FindingsDestination**— Amazon SNS 主题在有效负载中发现敏感数据时的记录目标。

1. **NoFindingsDestination**— 当 Amazon SNS 主题在有效负载中找不到敏感数据时的日志记录目标。

您可以在以下每种日志目标类型 Amazon Web Services 服务 中使用以下内容：
+ **Amaz CloudWatch on Logs**（可选）— `LogGroup` 必须位于主题区域中，并且名称必须以 **/aws/vendedlogs/** 开头。
+ ** **（可选）– `DeliveryStream` 必须位于主题区域并且使用 **Direct PUT** 作为传输流的来源。有关其他详细信息，请参阅《Amazon Data Firehose 开发人员指南》**中的[来源、目标和名称](https://docs.amazonaws.cn/firehose/latest/dev/create-name.html)。
+ **Amazon S3**（可选）– Amazon S3 存储桶名称。[要使用启用了 SSE-KMS 加密的 Amazon S3 桶，需要执行额外操作](#flow-logs-s3-cmk-policy)。

```
{
  "Operation": {
    "Audit": {
      "SampleRate": "99",
      "FindingsDestination": {
            "CloudWatchLogs": {
                "LogGroup": "/aws/vendedlogs/log-group-name"
            },
            "Firehose": {
                "DeliveryStream": "delivery-stream-name"
            },
            "S3": {
                "Bucket": "bucket-name"
            }
      },
      "NoFindingsDestination": {
            "CloudWatchLogs": {
                "LogGroup": "/aws/vendedlogs/log-group-name"
            },
            "Firehose": {
                "DeliveryStream": "delivery-stream-name"
            },
            "S3": {
                "Bucket": "bucket-name"
            }
      }
    }
  }
}
```

### 指定日志目标时所需的权限
<a name="required-permissions-log-operations"></a>

在数据保护策略中指定日志记录目标时，对于调用 Amazon SNS `PutDataProtectionPolicy` API 或者带有 `--data-protection-policy` 参数的 `CreateTopic` API 的 IAM 主体，您必须向 IAM 身份策略添加以下权限。


| 审计目标 | IAM 权限 | 
| --- | --- | 
| 默认 | logs:CreateLogDelivery logs:GetLogDelivery logs:UpdateLogDelivery logs:DeleteLogDelivery logs:ListLogDeliveries  | 
| CloudWatchLogs | logs:PutResourcePolicy logs:DescribeResourcePolicies logs:DescribeLogGroups  | 
| Firehose | iam:CreateServiceLinkedRole firehose:TagDeliveryStream  | 
| S3 | s3:PutBucketPolicy s3:GetBucketPolicy [要使用启用了 SSE-KMS 加密的 Amazon S3 桶，需要执行额外操作](#flow-logs-s3-cmk-policy)。  | 

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:GetLogDelivery",
                "logs:UpdateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:ListLogDeliveries"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutResourcePolicy",
                "logs:DescribeResourcePolicies",
                "logs:DescribeLogGroups"
            ],
            "Resource": [
                "arn:aws:logs:us-west-1:123456789012:SampleLogGroupName:*:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "firehose:TagDeliveryStream"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutBucketPolicy",
                "s3:GetBucketPolicy"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name"
            ]
        }
    ]
}
```

------

#### 与 SSE-KMS 结合使用时必需的密钥策略
<a name="flow-logs-s3-cmk-policy"></a>

如果您使用 Amazon S3 存储桶作为日志目标，则可以通过使用 Amazon S3 托管密钥启用服务器端加密 (SSE-S3) 或使用 (SSE-KMS) 启用服务器端加密 (SSE-KMS) 来保护存储桶中的数据。 Amazon KMS keys 有关详情，请参阅《Amazon S3 用户指南》中的[使用服务器端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/serv-side-encryption.html)。

如果选择 SSE-S3，则不需要额外的配置。Amazon S3 处理加密密钥。

如果您选择 SSE-KMS，则必须使用客户托管密钥。您必须更新客户托管密钥的密钥策略，以便日志传输账户可以写入 S3 存储桶。有关与 SSE-KMS 一起使用的所需密钥策略的更多信息，请参阅《[亚马逊* CloudWatch 日志*用户指南》中的 Amazon S3 存储桶服务器端加密](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-SSE-KMS-S3)。

### 审计目标日志示例
<a name="data-protection-policy-audit-destination-log"></a>

在下例中，使用 `callerPrincipal` 来识别敏感内容的来源，并使用 `messageID` 作为参考来根据 `Publish` API 响应进行检查。

```
{
  "messageId": "34d9b400-c6dd-5444-820d-fbeb0f1f54cf",
  "auditTimestamp": "2022-05-12T2:10:44Z",
  "callerPrincipal": "arn:aws:iam::123412341234:role/Publisher",
  "resourceArn": "arn:aws:sns:us-east-1:123412341234:PII-data-topic",
  "dataIdentifiers": [
    {
      "name": "Name",
      "count": 1,
      "detections": [
        {
          "start": 1,
          "end": 2
        }
      ]
    },
    {
      "name": "PhoneNumber",
      "count": 2,
      "detections": [
        {
          "start": 3,
          "end": 4
        },
        {
          "start": 5,
          "end": 6
        }
      ]
    }
  ]
}
```

### 审计操作指标
<a name="data-protection-policy-audit-metrics"></a>

当审计操作指定`FindingsDestination`或`NoFindingsDestination`属性时，主题所有者还会收到 CloudWatch`MessagesWithFindings`和`MessagesWithNoFindings`指标。

![\[显示指定时间段内数据的审计示例。\]](http://docs.amazonaws.cn/sns/latest/dg/images/audit-operations-metrics.png)


## 去身份识别操作
<a name="statement-operation-json-properties-deidentify"></a>

**去身份识别**操作会遮蔽或去除所发布或已送达消息中的敏感数据。此操作既适用于入站消息，又适用于出站消息，需要以下类型的配置之一：
+ **MaskConfig**— 使用下表中支持的字符进行掩码。例如，ssn: `123-45-6789` 变成 ssn: `###########`。

  ```
  {
  "Operation": {
      "Deidentify": {
          "MaskConfig": {
              "MaskWithCharacter": "#"
            }
      }
  }
  ```    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/sns/latest/dg/sns-message-data-protection-operations.html)
+ **RedactConfig**— 通过完全删除数据来进行编辑。例如，ssn: `123-45-6789` 变成 ssn: ` `。

  ```
  {
  "Operation": {
      "Deidentify": {
          "RedactConfig": {}
      }
  }
  ```

对于入站消息，在审计操作之后会对敏感数据进行去身份识别处理，当整条消息全部为敏感数据时，`SNS:Publish` API 调用方会收到以下无效参数错误。

`Error code: AuthorizationError ...`

## 拒绝操作
<a name="statement-operation-json-properties-deny"></a>

如果消息包含敏感数据，**Deny**（拒绝）操作会中断 `Publish` API 请求，或者中断消息的传输。拒绝操作对象为空，因为它不需要额外配置。

```
"Operation": {
    "Deny": {}
}
```

在入站消息上，`SNS:Publish` API 调用方收到授权错误。

`Error code: AuthorizationError ...`

在出站消息上，Amazon SNS 主题不将消息传输到订阅。要跟踪未经授权的传输，请启用主题的[传输状态日志记录](sns-topic-attributes.md)。下面是传输状态日志示例：

```
{
    "notification": {
        "messageMD5Sum": "29638742ffb68b32cf56f42a79bcf16b",
        "messageId": "34d9b400-c6dd-5444-820d-fbeb0f1f54cf",
        "topicArn": "arn:aws:sns:us-east-1:123412341234:PII-data-topic",
        "timestamp": "2022-05-12T2:12:44Z"
    },
    "delivery": {
        "deliveryId": "98236591c-56aa-51ee-a5ed-0c7d43493170",
        "destination": "arn:aws:sqs:us-east-1:123456789012:NoNameAccess",
        "providerResponse": "The topic's data protection policy prohibits this message from being delivered to <subscription-arn>",
        "dwellTimeMs":20,
        "attempts":1,
        "statusCode": 403
    },
    "status": "FAILURE"
}
```