密钥管理 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

密钥管理

以下部分提供了有关使用 Amazon Key Management Service (Amazon KMS) 中托管的密钥的信息。

估算 Amazon KMS 成本

要预测成本并更好地了解您的 Amazon 账单,您可能需要知道 Amazon SNS 使用您的 Amazon KMS 密钥的频率。

注意

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

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

R = B / D * (2 * P)

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

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

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

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

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

此示例假定:

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

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

  • 提供了 1 个主题。

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

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

示例 2:计算多名发布者和 2 个主题的 Amazon 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

配置 Amazon KMS 权限

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

注意

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

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

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

或者,您可以在分配给主体的 IAM 策略中指定所需的 Amazon KMS 操作和 KMS ARN,而这些主体可以在 Amazon SNS 中发布和订阅以接收加密消息。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的管理对 Amazon KMS 的访问

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

发布者必须具有 Amazon KMS 密钥的 kms:GenerateDataKeykms:Decrypt 权限。

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

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

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

  1. 使用客户托管式 KMS。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥

  2. 要允许 Amazon 服务具有 kms:GenerateDataKey*kms:Decrypt 权限,请将以下语句添加到 KMS 策略。

    { "Statement": [{ "Effect": "Allow", "Principal": { "Service": "service.amazonaws.com" }, "Action": [ "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*" }] }
    事件源 服务主体
    Amazon CloudWatch cloudwatch.amazonaws.com
    Amazon CloudWatch Events events.amazonaws.com
    Amazon CodeCommit codecommit.amazonaws.com
    AWS CodeStar codestar-notifications.amazonaws.com
    Amazon Database Migration Service dms.amazonaws.com
    Amazon Directory Service ds.amazonaws.com
    Amazon DynamoDB dynamodb.amazonaws.com
    Amazon Inspector inspector.amazonaws.com
    Amazon Redshift redshift.amazonaws.com
    Amazon RDS events.rds.amazonaws.com
    Amazon S3 Glacier glacier.amazonaws.com
    Amazon Simple Email Service ses.amazonaws.com
    Amazon Simple Storage Service s3.amazonaws.com
    Amazon Snowball importexport.amazonaws.com
    Amazon Systems Manager Incident Manager

    Amazon Systems Manager Incident Manager 包括两项服务原则:

    ssm-incidents.amazonaws.com; ssm-contacts.amazonaws.com
    注意

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

  3. aws:SourceAccountaws:SourceArn 条件键添加到 KMS 资源策略,以进一步保护 KMS 密钥免受混淆代理攻击。有关每种案例的具体详细信息,请参阅上述特定于服务的文档列表。

    { "Effect": "Allow", "Principal": { "Service": "service.amazonaws.com" }, "Action": [ "kms:GenerateDataKey*", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "customer-account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:service:region:customer-account-id:resource-type:customer-resource-id" } } }
  4. 使用 KMS 为您的主题启用 SSE

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

Amazon KMS 错误

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

KMSAccessDeniedException

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

HTTP 状态代码:400

KMSDisabledException

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

HTTP 状态代码:400

KMSInvalidStateException

由于指定资源的状态对此请求无效,请求被拒绝。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的密钥状态对 Amazon KMS 密钥的使用有何影响

HTTP 状态代码:400

KMSNotFoundException

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

HTTP 状态代码:400

KMSOptInRequired

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

HTTP 状态代码:403

KMSThrottlingException

由于请求限制而导致请求被拒绝。有关限制的更多信息,请参阅 Amazon Key Management Service 开发人员指南中的限制

HTTP 状态代码:400