Amazon SNS 中的数据保护策略操作
以下数据保护策略示例可用于审计和拒绝敏感数据。有关包含示例应用程序的完整教程,请参阅 Introducing message data protection for Amazon SNS
审计操作
Audit(审计)操作对主题入站消息采样,并将敏感数据发现结果记录在 Amazon 目标中。采样率可以是 0-99 之间的整数。此操作需要以下类型的日志记录目标之一:
-
FindingsDestination(发现结果目标)– Amazon SNS 主题在负载中发现敏感数据时使用的日志记录目标。
-
NoFindingsDestination(未发现结果目标)– Amazon SNS 主题在负载中未发现敏感数据时使用的日志记录目标。
您可以在各种日志目标类型中使用以下 Amazon Web Services 服务:
-
Amazon CloudWatch Logs(可选)–
LogGroup必须位于主题区域并且名称必须以 /aws/vendedlogs/ 开头。 -
(可选)–
DeliveryStream必须位于主题区域并且使用 Direct PUT 作为传输流的来源。有关其他详细信息,请参阅《Amazon Data Firehose 开发人员指南》中的来源、目标和名称。 -
Amazon S3(可选)– Amazon S3 存储桶名称。要使用启用了 SSE-KMS 加密的 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 |
与 SSE-KMS 结合使用时必需的密钥策略
如果您使用 Amazon S3 存储桶作为日志目标,您可以通过启用采用 Amazon S3 托管式密钥的服务器端加密 (SSE-S3) 或采用 Amazon KMS keys 的服务器端加密 (SSE-KMS) 来保护存储桶中的数据。有关详情,请参阅 Amazon S3 用户指南中的使用服务器端加密保护数据。
如果选择 SSE-S3,则不需要额外的配置。Amazon S3 处理加密密钥。
如果您选择 SSE-KMS,则必须使用客户托管密钥。您必须更新客户托管密钥的密钥策略,以便日志传输账户可以写入 S3 存储桶。有关与 SSE-KMS 结合使用时必需的密钥策略的更多信息,请参阅 Amazon CloudWatch Logs 用户指南中的 Amazon S3 存储桶服务器端加密。
审计目标日志示例
在下例中,使用 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 指标。
去身份识别操作
去身份识别操作会遮蔽或去除所发布或已送达消息中的敏感数据。此操作既适用于入站消息,又适用于出站消息,需要以下类型的配置之一:
-
MaskConfig – 使用下表中支持的字符进行遮蔽。例如,ssn:
123-45-6789变成 ssn:###########。{ "Operation": { "Deidentify": { "MaskConfig": { "MaskWithCharacter": "#" } } }支持的遮蔽字符 名称 * 星号 A-Z、a-z 和 0-9 字母数字 空间 ! 感叹号 $ 美元符号 % 百分号 & & 符号 () 括号
+ 加号 , 逗号 - 连字符 . 周期 /\ 斜杠、反斜杠
# 数字符号 : 冒号 ; 分号 =, <> 等于、小于或大于号
@ at 符号 [] 方括号 ^ 插入符号 _ 下划线 ` 反引号 | 竖线 ~ 波浪符号 -
RedactConfig – 通过完全删除数据来进行去除。例如,ssn:
123-45-6789变成 ssn:。{ "Operation": { "Deidentify": { "RedactConfig": {} } }
对于入站消息,在审计操作之后会对敏感数据进行去身份识别处理,当整条消息全部为敏感数据时,SNS:Publish API 调用方会收到以下无效参数错误。
Error code: AuthorizationError ...
拒绝操作
如果消息包含敏感数据,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" }