了解数据保护策略
主题
什么是数据保护策略?
Amazon SNS 使用数据保护策略选择要扫描的敏感数据,以及为了保护这些数据不被 Amazon SNS 主题交换而要采取的操作。要选择感兴趣的敏感数据,您可以使用数据标识符。Amazon SNS 消息数据保护功能随后使用机器学习和模式匹配来检测敏感数据。要对找到的数据标识符采取操作,您可以定义审计或拒绝操作。利用这些操作,您可以记录已找到(或未找到)的敏感数据,或者拒绝消息传送。

数据保护策略采用什么结构?
如下图所示,数据保护策略文档包含以下元素:
-
文档顶部的可选策略范围信息
-
一个或多个单独语句
每个语句都包含有关单个权限的信息。

每个 Amazon SNS 主题只能定义一个数据保护策略。数据保护策略可以有一个或多个拒绝语句,以及一个审计语句。
数据保护策略的 JSON 属性
数据保护策略需要以下基本策略信息用于识别:
-
Name(名称)– 策略名称。
-
Description(描述)(可选)– 策略描述。
-
Version(版本)– 策略语言版本。当前版本为 2021-06-01。
-
Statement(语句)– 指定数据保护策略操作的语句列表。
{ "Name": "basicPII-protection", "Description": "Protect basic types of sensitive data", "Version": "2021-06-01", "Statement": [ ... ] }
策略语句的 JSON 属性
策略语句设置数据保护操作的检测上下文。
-
Sid(可选)– 语句标识符。
-
DataDirection(数据方向)– 相对于 Amazon SNS 主题的入站(用于发布 API 请求)或出站(用于通知传送)方向。
-
DataIdentifier(数据标识符)– Amazon SNS 主题应扫描的敏感数据。例如,姓名、地址或电话号码。
-
Principal(主体)– 发布到该主题的 IAM 主体或订阅该主题的 IAM 主体。
-
Operation(操作)– Amazon SNS 主题在找到敏感数据后执行的后续操作,可以为 Deny(拒绝,也就是阻止)或者 Audit(审计)。
{ "Sid": "basicPII-inbound-protection", "DataDirection": "Inbound", "Principal": ["*"], "DataIdentifier": [ "arn:aws:dataprotection::aws:data-identifier/Name", "arn:aws:dataprotection::aws:data-identifier/PhoneNumber-US" ], "Operation": { ... } }
策略语句操作的 JSON 属性
策略语句设置以下数据保护操作之一。
-
Deny(拒绝)– 阻止 Amazon SNS 发布请求或者使消息传输失败。
-
Audit(审计)– 发布指标和发现结果日志,而不中断消息发布或传输。
拒绝操作
如果消息包含敏感数据,Deny(拒绝)操作会中断 Publish
API 请求,或者中断消息的传输。拒绝操作对象为空,因为它不需要额外配置。
"Operation": { "Deny": {} }
在入站消息上,SNS:Publish
API 调用方收到授权错误。
Error code: AuthorizationError ...
在出站消息上,Amazon SNS 主题不将消息传输到订阅。要跟踪未经授权的传输,请启用主题的传输状态日志记录。下面是传输状态日志示例:
{ "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" }
不支持移动端点。
审计操作
Audit(审计)操作对主题入站消息采样,并将敏感数据发现结果记录在 Amazon 目标中。采样率可以是 0-99 之间的整数。此操作需要以下类型的日志记录目标之一:
-
FindingsDestination(发现结果目标)– Amazon SNS 主题在负载中发现敏感数据时使用的日志记录目标。
-
NoFindingsDestination(未发现结果目标)– Amazon SNS 主题在负载中未发现敏感数据时使用的日志记录目标。
您可以在各种日志目标类型中使用以下 Amazon Web Services:
-
Amazon CloudWatch Logs(可选)–
LogGroup
必须位于主题区域并且名称必须以 /aws/vendedlogs/ 开头。 -
Amazon Kinesis Data Firehose(可选)–
DeliveryStream
必须位于主题区域并且使用 Direct PUT 作为传输流的来源。有关其他详细信息,请参阅《Amazon Kinesis Data Firehose 开发人员指南》中的来源、目标和名称。 -
Amazon S3(可选)– Amazon S3 存储桶名称。
{ "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" } } } } }
指定日志目标时所需的权限
在数据保护策略中指定日志记录目标时,对于调用 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 |
{ "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:region:account-id:SampleLogGroupName:*:*" ] }, { "Effect": "Allow", "Action": [ "iam:CreateServiceLinkedRole", "firehose:TagDeliveryStream" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:PutBucketPolicy", "s3:GetBucketPolicy" ], "Resource": [ "arn:aws:s3:::bucket-name" ] } ] }
审计目标日志示例
您可以使用 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 } ] } ] }
审计操作指标
当审计操作指定了 FindingsDestination
或者 NoFindingsDestination
属性时,主题所有者还将收到 CloudWatch MessagesWithFindings
和 MessagesWithNoFindings
指标。

如何确定我的数据保护策略的 IAM 主体?
消息数据保护功能使用两个与 Amazon SNS 交互的 IAM 主体。
-
Publish API Principal(发布 API 主体)(入站)– 调用 Amazon SNS
Publish
API 的经过身份验证的 IAM 主体。 -
Subscription Principal(订阅主体)(出站)– 在订阅创建期间调用
Subscribe
API 的经过身份验证的 IAM 主体。
SubscriptionPrincipal
是正式发布的 Amazon SNS 订阅属性,可以从 GetSubscriptionAttributes
API 检索。
{ "Attributes": { "SubscriptionPrincipal": "arn:aws:iam::123456789012:user/NoNameAccess", "Owner": "123412341234", "RawMessageDelivery": "true", "TopicArn": "arn:aws:sns:us-east-1:123412341234:PII-data-topic", "Endpoint": "arn:aws:sqs:us-east-1:123456789012:NoNameAccess", "Protocol": "sqs", "PendingConfirmation": "false", "ConfirmationWasAuthenticated": "true", "SubscriptionArn": "arn:aws:sns:us-east-1:123412341234:PII-data-topic:5d8634ef-67ef-49eb-a824-4042b28d6f55" } }