本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
密钥管理
Amazon SQS 与Amazon Key Management Service (KMS) 集成,用于管理用于服务器端加密 (SSE) 的 KMS 密钥。静态加密有关 SSE 信息和密钥管理定义,请参见。Amazon SQS 使用 KMS 密钥来验证和保护加密和解密消息的数据密钥。以下部分提供有关在 Amazon SQS 服务中使用 KMS 密钥和数据密钥的信息。
配置 Amazon KMS 权限
每个 KMS 密钥都必须有一个密钥策略。请注意,您无法修改 Amazon SQSAmazon 托管 KMS 密钥的密钥策略。此 KMS 密钥的策略包括账户中所有委托人(有权使用 Amazon SQS)使用加密队列的权限。
对于客户管理的 KMS 密钥,您必须配置密钥策略以为每个队列创建者和使用者添加权限。为此,请将创建者和使用者指定为 KMS 密钥策略中的用户。有关Amazon KMS权限的更多信息,请参阅Amazon Key Management Service开发者指南中的Amazon KMS资源和操作或 Amazon KMSAPI 权限参考。
或者,您可以在分配给创建和使用加密消息的委托人的 IAM 策略中指定所需权限。有关更多信息,请参阅Amazon Key Management Service开发者指南Amazon KMS中的使用 IAM 策略。
注意
尽管您可以配置从 Amazon SQARN S 收发全局权限,仍会Amazon KMS要求在 IAM 策略的Resource
部分中显式命名 KMS 密钥 ID。
配置 Amazon 服务的 KMS 权限
一些Amazon服务充当事件源,可以向 Amazon SQS 队列发送事件。要允许这些事件源与加密队列一起使用,您必须创建客户管理的 KMS 密钥并在密钥策略中添加权限以使服务使用所需的Amazon KMS API 方法。执行以下步骤来配置权限。
-
创建客户管理的 KMS 密钥。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建密钥。
-
要允许Amazon服务事件源使用
kms:GenerateDataKey
和kms:Decrypt
API 方法,请将以下语句添加到 KMS 密钥策略。{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "
service
.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" }] }将上述示例中的“服务”替换为事件源的服务名称。事件源包括以下服务。
事件源 服务名称 亚马逊 CloudWatch 活动 events.amazonaws.com
Amazon S3 事件通知 s3.amazonaws.com
Amazon SNS 主题订阅 sns.amazonaws.com
-
使用 KMS 密钥的 ARN 配置现有 SSE 队列。
-
向事件源提供加密队列的 ARN。
为创建者配置 KMS 权限
当数据密钥重用周期过期时,创建者下次调用 SendMessage
或 SendMessageBatch
时也会触发对 kms:GenerateDataKey
和 kms:Decrypt
的调用。对 kms:Decrypt
的调用是在使用新数据密钥之前验证它的完整性。因此,制作者必须拥有 KMS 密钥的kms:GenerateDataKey
和kms:Decrypt
权限。
将以下语句添加到创建者的 IAM 策略中。请记住,为密钥资源和队列资源使用正确的 ARN 值。
{ "Version": "2012-10-17", "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": [ "sqs:SendMessage" ], "Resource":"arn:aws:sqs:*:123456789012:MyQueue"
}] }
如果是跨账户访问,则需要执行以下操作:
"kms:DescribeKey", "kms:Decrypt", "kms:ReEncrypt", "kms:GenerateDataKey", "kms:DescribeKey",
为使用者配置 KMS 权限
当数据密钥重用周期过期时,使用者下一次调用 ReceiveMessage
时也会触发对 kms:Decrypt
的调用,以便在使用新数据密钥之前验证它的完整性。因此,使用者必须拥有用于加密指定队列中消息的任何 KMS 密钥的kms:Decrypt
权限。如果队列充当死信队列,则使用者还必须拥有用于加密源队列中消息的任何 KMS 密钥的kms:Decrypt
权限。将以下语句添加到使用者的 IAM 策略中。请记住,为密钥资源和队列资源使用正确的 ARN 值。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource":
"arn:aws:kms:us-east-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
}, { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage" ], "Resource":"arn:aws:sqs:*:123456789012:MyQueue"
}] }
使用混乱的副手保护配置 KMS 权限
当关键政策声明中的委托人是Amazon服务主体时,您可以使用aws:SourceArn
或aws:SourceAccount
全局条件密钥来防范混乱的副手情况。要使用这些条件密钥,请将值设置为要加密的资源的 Amazon Resource Name (ARN)。如果您不知道资源的 ARN,请改用 aws:SourceAccount
。
在此 KMS 密钥策略中,允许账户111122223333
拥有的服务中的特定资源调用 KMS 进行Decrypt
和GenerateDataKey
操作,这些操作在 SSE 使用 Amazon SQS 时发生。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service":
"<replaceable>service</replaceable>.amazonaws.com"
}, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "ArnEquals": { "aws:SourceArn": ["arn:aws:service::111122223333:resource"
] } } }] }
使用启用 SSE 的 Amazon SQS 队列时,以下服务支持aws:SourceArn
:
-
Amazon SNS
-
Amazon S3
-
CloudWatch 活动
-
Amazon Lambda
-
CodeBuild
-
Amazon Connect Customer Profiles
-
Amazon Auto Scaling
-
Amazon Chime
了解数据密钥重用周期
数据密钥重用期定义了 Amazon SQS 重复使用相同数据密钥的最大持续时间。当数据密钥重用期结束时,Amazon SQS 会生成一个新的数据密钥。请注意以下有关此重用周期的准则。
-
较短的重用周期可提供更高的安全性,但会导致对 Amazon KMS 进行多次调用,从而产生超出免费套餐的费用。
-
尽管用于加密和解密的数据密钥是单独缓存的,重用周期仍将应用于数据密钥的两个副本。
-
当数据密钥重用周期结束时,下一次调用
SendMessage
或SendMessageBatch
时通常会触发对 Amazon KMSGenerateDataKey
方法的调用以获取新数据密钥。此外,下一次调用SendMessage
和ReceiveMessage
时,每个调用都将触发调用 Amazon KMSDecrypt
,以便在使用数据密钥之前验证它的完整性。 -
委托人(Amazon Web Services 账户或用户)不共享数据密钥(唯一委托人发送的消息始终获得唯一的数据密钥)。因此,对 Amazon KMS 的调用数是数据密钥重用周期中正在使用的唯一委托人数的倍数:
估算 Amazon KMS 成本
要预测成本并更好地了解您的Amazon账单,您可能需要知道 Amazon SQS 使用您的 KMS 密钥 ID。
注意
尽管以下公式可让您很好地了解预计成本,但由于 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,可能会遇到错误。以下参考描述错误和可能的故障排除解决方案。