Amazon Simple Notification Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用服务器端加密 (SSE) 和 AWS KMS 保护 Amazon SNS 数据

借助服务器端加密 (SSE),您可以采用加密主题的方式传输敏感数据。SSE 使用 AWS Key Management Service (AWS KMS) 中托管的密钥保护 Amazon SNS 主题中消息的内容。

有关使用 AWS 管理控制台或 AWS SDK for Java 管理 SSE(通过使用 CreateTopicSetTopicAttributes API 操作设置 KmsMasterKeyId 属性)的信息,请参阅 为 Amazon SNS 主题启用服务器端加密 (SSE)。有关使用 AWS CloudFormation 创建加密主题(通过使用 AWS::SNS::Topic 资源设置 KmsMasterKeyId 属性)的信息,请参阅 AWS CloudFormation 用户指南

一旦 Amazon SNS 收到消息,SSE 就会对消息进行加密。这些消息以加密形式存储,并且仅当消息发送时,Amazon SNS 才会对消息进行解密。

重要

对启用了 SSE 的主题的所有请求都必须使用 HTTPS 和签名版本 4

有关其他服务与加密主题的兼容性的信息,请参阅您的服务文档。

AWS KMS 将安全、高度可用的硬件和软件结合起来,提供可扩展到云的密钥管理系统。将 Amazon SNS 与 AWS KMS 结合使用时,加密消息数据的数据密钥也将进行加密并且与其保护的数据存储在一起。

使用 AWS KMS 具有以下好处:

  • 您可以自行创建和管理客户主密钥 (CMK)

  • 还可以使用适用于 Amazon SNS 的 AWS 托管 CMK,它对于每个账户和区域都是唯一的。

  • AWS KMS 安全标准可帮助您满足与加密相关的合规性要求。

有关更多信息,请参阅 AWS Key Management Service Developer Guide中的什么是 AWS Key Management Service?AWS Key Management Service 加密详细信息白皮书。

加密范围

SSE 将对 Amazon SNS 主题中的消息正文进行加密。

SSE 不对以下各项进行加密:

  • 主题元数据(主题名称和属性)

  • 消息元数据(主题、消息 ID、时间戳和属性)

  • 每个主题的指标数

注意

  • 仅在启用主题加密后发送消息时对其进行加密。Amazon SNS 不对积压消息进行加密。

  • 任何加密的消息将保持加密状态,即使已禁用其主题的加密。

关键术语

以下关键术语有助于您更好地了解 SSE 的功能。有关详细说明,请参阅 Amazon Simple Notification Service API Reference

数据密钥

数据加密密钥 (DEK) 负责加密 Amazon SNS 消息的内容。

有关更多信息,请参阅 AWS Key Management Service Developer Guide中的数据键AWS 加密 SDK 开发人员指南中的信封加密

客户主密钥 ID

您的账户或另一账户中的 AWS 托管客户主密钥 (CMK) 或自定义 CMK— 的别名、别名 ARN、密钥 ID 或密钥 ARN。虽然适用于 Amazon SNS 的 AWS 托管 CMK 的别名始终为 alias/aws/sns,但自定义 CMK 的别名可以是,例如 alias/MyAlias。您可以利用这些 CMK 保护 Amazon SNS 主题中的消息。

注意

记住以下内容:

  • 在首次使用 AWS 管理控制台为主题的 Amazon SNS 指定 AWS 托管的 CMK 时,AWS KMS 将为 Amazon SNS 创建 AWS 托管的 CMK。

  • 或者,首次对启用 SSE 的主题使用 Publish 操作时,AWS KMS 将为 Amazon SNS 创建 AWS 托管的 CMK。

您可以利用 AWS KMS 控制台的客户托管密钥部分或利用 CreateKey AWS KMS 操作来创建 CMK、定义控制 CMK 的使用方式的策略和审核 CMK 使用情况。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的客户主密钥 (CMK)创建密钥。有关 CMK 标识符的更多示例,请参阅 AWS Key Management Service API Reference中的 KeyId。有关查找 CMK 标识符的信息,请参阅 AWS Key Management Service Developer Guide 中的查找密钥 ID 和 ARN

重要

使用 AWS KMS 无需支付额外费用。有关更多信息,请参阅估算 AWS KMS 成本AWS Key Management Service 定价

估算 AWS KMS 成本

要预测成本并更好地了解 AWS 账单,您可能需要知道 Amazon SNS 使用您的客户主密钥 (CMK) 的频率。

注意

尽管以下公式可让您很好地了解预计成本,但由于 Amazon SNS 的分布式特性,实际成本可能更高。

要计算每主题 的 API 请求数 (R),请使用以下公式:

R = B / D * (2 * P)

B 是账单周期 (以秒为单位)。

D 是数据密钥重用周期(以秒为单位—Amazon SNS 重用数据密钥长达 5 分钟)。

P 是发送到 Amazon SNS 主题的发布委托人的数目。

以下是一些示例计算。有关准确的定价信息,请参阅 AWS Key Management Service 定价

示例 1:计算 1 名发布者和 1 个主题的 AWS KMS API 调用数

此示例假定:

  • 账单周期为 1 月 1 日 - 31 日 (2678400 秒)。

  • 数据密钥重用周期为 5 分钟(300 秒)。

  • 提供了 1 个主题。

  • 提供了 1 个发布委托人。

2,678,400 / 300 * (2 * 1) = 17,856

示例 2:计算多名发布者和 2 个主题的 AWS KMS API 调用数

此示例假定:

  • 账单周期为 2 月 1 日 - 28 日 (2419200 秒)。

  • 数据密钥重用周期为 5 分钟(300 秒)。

  • 提供了 2 个主题。

  • 第一个主题具有 3 个发布委托人。

  • 第二个主题具有 5 个发布委托人。

(2,419,200 / 300 * (2 * 3)) + (2,419,200 / 300 * (2 * 5)) = 129,024

配置 AWS KMS 权限

必须先将 AWS KMS 密钥策略配置为允许进行主题加密以及消息加密和解密,然后才能使用 SSE。有关 AWS KMS 权限的示例和更多信息,请参阅 AWS Key Management Service Developer Guide 中的 AWS KMS API 权限:操作和资源参考

注意

您也可以使用 IAM 策略来管理 KMS 密钥的权限。有关更多信息,请参阅在 AWS KMS 中使用 IAM 策略

尽管您可以配置从 Amazon SNS 收发全局权限,AWS KMS 仍会要求在 IAM 策略的 Resource 部分中的特定区域内显式命名 CMK 的完整 ARN。

还必须确保客户主密钥 (CMK) 的密钥策略允许必要的权限。为此,请将在 Amazon SNS 中创建和使用加密消息的委托人指定为 CMK 密钥策略中的用户。

或者,您可以在分配给委托人的 IAM 策略中指定所需的 AWS KMS 操作和 CMK ARN,而这些委托人可以在 Amazon SNS 中发布和订阅以接收加密消息。有关更多信息,请参阅 AWS Key Management Service Developer Guide中的管理对 AWS KMS CMK 的管理

允许用户使用 SSE 将消息发送到主题

发布者必须具有客户主密钥 (CMK) 的 kms:GenerateDataKeykms:Decrypt 权限。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws-cn:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, { "Effect": "Allow", "Action": [ "sns:Publish" ], "Resource": "arn:aws-cn:sns:*:123456789012:MyTopic" }] }

实现 AWS 服务中的事件源与加密主题之间的兼容性

有些 AWS 服务将事件发布到 Amazon SNS 主题。要允许这些事件源使用加密主题,您必须执行以下步骤:

注意

目前,CloudWatch 警报未使用 Amazon SNS 加密主题。有关将警报发布到未加密主题的信息,请参阅 Amazon CloudWatch 用户指南 中的使用 Amazon CloudWatch 警报

  1. 创建客户主密钥 (CMK)。

  2. 要允许 AWS 服务功能具有 kms:GenerateDataKey*kms:Decrypt 权限,请使用正确的服务委托人将以下语句添加到 CMK 的策略。

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "service.amazonaws.com" }, "Action": [ "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" }] }
    事件源 服务委托人
    Amazon CloudWatch Events events.amazonaws.com
    Amazon DynamoDB dynamodb.amazonaws.com
    Amazon S3 Glacier glacier.amazonaws.com
    Amazon Redshift redshift.amazonaws.com
    Amazon Simple Email Service ses.amazonaws.com
    Amazon Simple Storage Service s3.amazonaws.com
    AWS CodeCommit codecommit.amazonaws.com
    AWS Database Migration Service dms.amazonaws.com
    AWS Directory Service ds.amazonaws.com
    AWS Snowball importexport.amazonaws.com

    注意

    一些 Amazon SNS 事件源要求您在 AWS KMS 密钥策略中提供一个 IAM 角色(而不是服务委托人):

  3. 使用 CMK 为您的主题启用 SSE

  4. 向事件源提供加密主题的 ARN。

错误

在使用 Amazon SNS 和 AWS KMS 时,可能会遇到错误。以下列表描述了这些错误和可能的故障排除解决方案。

KMSAccessDeniedException

密文引用了不存在的或您无权访问的密钥。

HTTP 状态代码:400

KMSDisabledException

由于指定的 CMK 未启用,请求被拒绝。

HTTP 状态代码:400

KMSInvalidStateException

由于指定资源的状态对此请求无效,请求被拒绝。有关更多信息,请参阅 AWS Key Management Service Developer Guide中的密钥状态对客户主密钥的使用有何影响

HTTP 状态代码:400

KMSNotFoundException

由于找不到指定的实体或资源,请求被拒绝。

HTTP 状态代码:400

KMSOptInRequired

AWS 访问密钥 ID 需要订阅服务。

HTTP 状态代码:403

KMSThrottlingException

由于请求限制而导致请求被拒绝。有关限制的更多信息,请参阅 AWS Key Management Service Developer Guide中的限制

HTTP 状态代码:400