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

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

密钥管理

Amazon SQS 与 AWS Key Management Service 集成以管理用于服务器端加密 (SSE) 的客户主密钥 (CMK)。参见 静态加密 了解SSE信息和关键管理定义。 Amazon SQS 使用 CMKs 验证和保护加密和解密消息的数据密钥。以下部分提供了有关使用 CMKs 和数据键 Amazon SQS 服务。

配置 AWS KMS 权限

每个 CMK 都必须有一个密钥策略。请注意,您无法修改 Amazon SQS 的 AWS 托管 CMK 的密钥策略。此 CMK 的策略包括该账户(获授权可使用 Amazon SQS)中的所有委托人使用加密队列的权限。

对于客户托管的 CMK,您必须配置密钥策略,以便为每个队列创建者和使用者添加权限。为此,您将创建者和使用者指定为 CMK 密钥策略中的用户。有关 AWS KMS 权限,请参阅 AWS KMS 资源和运营 AWS KMS API权限参考AWS Key Management Service Developer Guide.

或者,您可以在分配给委托人的 IAM 策略中指定所需的权限,而这些委托人可以创建和使用加密消息。有关更多信息,请参阅 使用 IAM 政策 AWS KMSAWS Key Management Service Developer Guide.

注意

您可以配置全局权限,以将其发送至和接收 Amazon SQS, AWS KMS 需要明确命名 CMKs 特定地区 Resource 部分 IAM 政策。

配置 AWS 服务的 KMS 权限

多个 AWS 服务充当可以将事件发送到 Amazon SQS 队列的事件源。要允许这些事件源使用加密队列,您必须创建客户托管的 CMK 并在密钥策略中添加权限,以便服务使用所需的 AWS KMS API 方法。执行以下步骤来配置权限。

  1. 创建客户托管 CMK。有关更多信息,请参阅 创建密钥AWS Key Management Service Developer Guide.

  2. 要允许 AWS 服务事件源使用 kms:GenerateDataKeykms:Decrypt API 方法,请将以下语句添加到 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 S3 事件通知 s3.amazonaws.com
    Amazon SNS 主题订阅 sns.amazonaws.com
  3. 配置现有 SSE 队列 使用CMK的ARN。

  4. 向事件源提供加密队列的 ARN。

为创建者配置 KMS 权限

数据密钥重用期 过期,生产者下次致电 SendMessageSendMessageBatch 还会触发呼叫至 kms:GenerateDataKeykms:Decrypt。到的呼叫 kms:Decrypt 是在使用前验证新数据密钥的完整性。因此,创建者必须具有客户主密钥 (CMK) 的 kms:GenerateDataKeykms:Decrypt 权限。

将以下语句添加到创建者的 IAM 策略中。请记住,为密钥资源和队列资源使用正确的 ARN 值。

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

为使用者配置 KMS 权限

当数据密钥重用周期过期时,使用者下一次调用 ReceiveMesssage 时也会触发对 kms:Decrypt 的调用,以便在使用新数据密钥之前验证它的完整性。因此,使用者必须对用于加密指定队列中的消息的任何客户主密钥 (CMK) 拥有 kms:Decrypt 权限。如果队列充当死信队列,则使用器必须还具有用于加密源队列中的消息的任何 CMK 的 kms:Decrypt 权限。将以下语句添加到使用者的 IAM 策略中。请记住,为密钥资源和队列资源使用正确的 ARN 值。

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

了解数据密钥重用周期

数据密钥重用周期定义 Amazon SQS 重用相同数据密钥的最长持续时间。当数据密钥重用周期结束时,Amazon SQS 生成一个新的数据密钥。请注意以下有关此重用周期的准则。

  • 较短的重用周期可提供更高的安全性,但会导致对 AWS KMS 进行多次调用,从而产生超出免费套餐的费用。

  • 尽管用于加密和解密的数据密钥是单独缓存的,重用周期仍将应用于数据密钥的两个副本。

  • 当数据密钥重用周期结束时,下一次调用 SendMessageSendMessageBatch 时通常会触发对 AWS KMS GenerateDataKey 方法的调用以获取新数据密钥。此外,下一次调用 SendMessageReceiveMessage 时,每个调用都将触发调用 AWS KMS Decrypt,以便在使用数据密钥之前验证它的完整性。

  • 委托人(AWS 账户或 IAM 用户)不会共享数据密钥(唯一委托人所发送的消息将始终获得唯一数据密钥)。因此,对 AWS KMS 的调用数是数据密钥重用周期中正在使用的唯一委托人数的倍数:

估算 AWS KMS 成本

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

注意

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

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

R = B / D * (2 * P + C)

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

D数据密钥重用周期 (以秒为单位)。

P 是发送到 Amazon SQS 队列的创建委托人数

C 是从 Amazon SQS 队列接收的使用委托人数。

重要

通常,创建委托人产生的费用是使用委托人的两倍。有关更多信息,请参阅了解数据密钥重用周期

如果创建器和使用器具有不同的 IAM 用户,则费用会增加。

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

示例 1:计算 AWS KMS 2个主体和1个队列的API调用

此示例假定:

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

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

  • 有 1 个队列。

  • 有 1 个创建委托人和 1 个使用委托人。

2,678,400 / 300 * (2 * 1 + 1) = 26,784

示例 2:计算 AWS KMS 多个生产商和消费者的API需求以及2个队列

此示例假定:

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

  • 数据密钥重用周期设置为 24 小时 (86400 秒)。

  • 有 2 个队列。

  • 第一个队列有 3 个创建委托人和 1 个使用委托人。

  • 第二个队列有 5 个创建委托人和 2 个使用委托人。

(2,419,200 / 86,400 * (2 * 3 + 1)) + (2,419,200 / 86,400 * (2 * 5 + 2)) = 532

AWS KMS 错误

在使用 Amazon SQS 和 AWS KMS 时,可能会遇到错误。以下参考描述错误和可能的故障排除解决方案。