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

Amazon SQS 密钥管理

Amazon SQS 与 Amazon Key Management Service (KMS) 集成,以管理用于服务器端加密 (SSE) 的 KMS 密钥。有关 SSE 信息和密钥管理定义,请参阅Amazon SQS 中的静态加密。Amazon SQS 使用 KMS 密钥来验证和保护用于加密和解密消息的数据密钥。以下部分提供有关在 Amazon SQS 服务中使用 KMS 密钥和数据密钥的信息。

配置 Amazon KMS 权限

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

Amazon SQS 根据调用方的 Amazon 凭证进行区分,无论它们使用的是不同的 Amazon 账户、IAM 用户还是 IAM 角色。此外,具有不同作用策略范围的相同 IAM 角色将被视为不同的请求方。但是,在使用 IAM 角色会话时,仅更改 RoleSessionName 而保持相同的 IAM 角色和策略范围不会创建不同的请求方。因此,在指定 Amazon KMS 密钥策略主体时,请避免仅依赖 RoleSessionName 的差异,因为这些会话将被视为同一请求方。

或者,您可以在分配给主体的 IAM 策略中指定所需的权限,而这些主体可以创建和使用加密消息。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的将 IAM 策略用于 Amazon KMS

注意

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

配置 Amazon 服务的 KMS 权限

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

警告

请注意,更改用于加密 Amazon SQS 消息的 KMS 密钥时,使用旧 KMS 密钥加密的现有消息仍将使用该密钥进行加密。要解密这些消息,您必须保留旧的 KMS 密钥,并确保其密钥政策授予 Amazon SQS 执行 kms:Decryptkms:GenerateDataKey 的权限。在将加密新消息的密钥更新为新的 KMS 密钥后,请确保处理所有使用旧的 KMS 密钥加密的现有消息并将其从队列中删除,然后再删除或禁用旧的 KMS 密钥。

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

  2. 要允许 Amazon 服务事件源使用 kms:Decryptkms:GenerateDataKey API 方法,请将以下语句添加到 KMS 密钥政策中。

    JSON
    { "Version":"2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "service.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }] }

    将上述示例中的“服务”替换为事件源的服务名称。事件源包括以下服务。

    事件源 服务名称
    Amazon CloudWatch Events () events.amazonaws.com
    Amazon S3 事件通知 s3.amazonaws.com
    Amazon SNS 主题订阅 sns.amazonaws.com
  3. 使用 KMS 密钥的 ARN 配置现有 SSE 队列

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

为创建者配置 Amazon KMS 权限

数据密钥重用周期过期时,创建者下次调用 SendMessageSendMessageBatch 时也会触发对 kms:Decryptkms:GenerateDataKey 的调用。对 kms:Decrypt 的调用是在使用新数据密钥之前验证它的完整性。因此,创建者必须具有 KMS 密钥的 kms:Decryptkms:GenerateDataKey 权限。

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

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/111112222233333" }, { "Effect": "Allow", "Action": [ "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:123456789012:MyQueue" } ] }

为使用者配置 Amazon KMS 权限

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

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/111112222233333" }, { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage" ], "Resource": "arn:aws:sqs:*:123456789012:MyQueue" } ] }

将 Amazon KMS 权限配置为混淆代理保护

当密钥政策语句中的主体为Amazon服务主体时,您可以使用 aws:SourceArnaws:SourceAccount 全局条件键以防止出现混淆代理问题。要使用这些条件键,请将值设置为要加密的资源的 Amazon 资源名称 (ARN)。如果您不知道资源的 ARN,请改用 aws:SourceAccount

在此 KMS 密钥政策中,允许账户 111122223333 拥有的服务中的特定资源调用 KMS 进行 DecryptGenerateDataKey 操作,这些操作在 Amazon SQS 使用 SSE 期间发生。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sqs.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "ArnEquals": { "aws:SourceArn": [ "arn:aws:sqs:us-west-1:111122223333:resource" ] } } } ] }

使用启用 SSE 的 Amazon SQS 队列时,以下服务支持 aws:SourceArn

  • Amazon SNS

  • Amazon S3

  • CloudWatch Events

  • Amazon Lambda

  • CodeBuild

  • Amazon Connect Customer Profiles

  • Amazon Auto Scaling

  • Amazon Chime

了解数据密钥重用周期

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

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

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

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

  • 主体(Amazon Web Services 账户或用户)不会共享数据密钥(唯一主体所发送的消息将始终获得唯一数据密钥)。因此,对 Amazon KMS 的调用次数是数据密钥重用周期内使用的唯一主体数量的倍数。

估算 Amazon KMS 成本

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

注意

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

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

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

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

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

P 是发送到 Amazon SQS 队列的生成主体的数量。

C 是从 Amazon SQS 队列接收的使用主体数量。

重要

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

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

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

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

此示例假定:

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

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

  • 有 1 个队列。

  • 有 1 个创建主体和 1 个使用主体。

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

示例 2:计算多个创建者和使用者以及 2 个队列的 Amazon KMS API 调用数

此示例假定:

  • 账单周期为 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

Amazon KMS 错误

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