亚马逊SQS与AWS密钥管理服务(KMS)集成,以管理服务器端加密(SSE)的KMS密钥。有关 SSE 信息和密钥管理定义,请参见休息时加密。Amazon SQS使用KMS密钥来验证和保护加密和解密消息的数据密钥。下面的章节提供了关于在Amazon SQS服务中使用KMS密钥和数据密钥的信息。
配置AWS KMS的权限
每个KMS密钥都必须有一个密钥策略。请注意,您不能修改Amazon SQS的AWS管理的KMS密钥的密钥策略。该KMS密钥的策略包括账户中所有负责人(被授权使用Amazon SQS)使用加密队列的权限。
对于客户管理的KMS密钥,您必须配置密钥策略,为每个队列生产者和消费者添加权限。要做到这一点,您在KMS密钥策略中把生产者和消费者命名为用户。有关AWS KMS权限的更多信息,请参阅AWS密钥管理服务开发者指南中的AWS KMS资源和操作或AWS KMS API权限参考。
或者,您可以在分配给产生和消费加密消息的委托人的 IAM 策略中指定所需的权限。欲了解更多信息,请参阅《AWS密钥管理服务开发者指南》中的《使用IAM策略与AWS KMS》。
为AWS服务配置KMS权限
一些AWS服务作为事件源,可以将事件发送到Amazon SQS队列中。为了允许这些事件源与加密队列一起工作,您必须创建一个客户管理的KMS密钥,并在密钥策略中添加权限,以便该服务使用所需的AWS KMS API方法。执行以下步骤来配置权限。
1.创建一个客户管理的KMS密钥。欲了解更多信息,请参阅《AWS密钥管理服务开发人员指南》中的创建密钥。
2.为了允许AWS服务事件源使用kms:GenerateDataKey和kms:Decrypt API方法,在KMS密钥策略中添加以下语句。
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": "service.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "*"
}]
}
3.使用KMS密钥的ARN配置一个现有的SSE队列。
4.向事件源提供加密队列的ARN。
为生产商配置KMS权限
当数据密钥重用期过后,生产者对SendMessage或SendMessageBatch的下次调用也会触发对kms:GenerateDataKey和kms:Decrypt的调用。对kms:Decrypt的调用是为了在使用新的数据密钥之前验证它的完整性。因此,生产者必须拥有KMS:GenerateDataKey和kms:Decrypt权限的KMS密钥。
在生产者的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权限
当数据密钥重用期过后,消费者对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权限与混乱的代理保护
当密钥策略声明中的委托人是 AWS 服务委托人时,您可以使用 aws:SourceArn 或 aws:SourceAccount 全局条件密钥来防止混淆的代理情况。要使用这些条件密钥,请将其值设置为正在加密的资源的亚马逊资源名称(ARN)。如果你不知道资源的ARN,请使用aws:SourceAccount代替。
在这个KMS密钥策略中,允许账户111122223333拥有的服务中的特定资源调用KMS进行解密和生成数据密钥的操作,这在亚马逊SQS的SSE使用过程中发生。
{
"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"
]
}
}
}]
}
了解数据关键的重复使用期
数据密钥重用期定义了Amazon SQS重用同一数据密钥的最长时间。当数据密钥重用期结束时,Amazon SQS会生成一个新的数据密钥。请注意以下关于重用期的准则。
较短的重用期可以提供更好的安全性,但会导致对AWS KMS的更多调用,这可能会产生超出免费级别的费用。
尽管数据密钥被分别缓存用于加密和解密,但重用期适用于数据密钥的两个副本。
当数据密钥重用期结束时,对SendMessage或SendMessageBatch的下一次调用通常会触发对AWS KMS GenerateDataKey方法的调用以获得新的数据密钥。另外,接下来对SendMessage和ReceiveMessage的调用将分别触发对AWS KMS Decrypt的调用,以在使用数据密钥之前验证其完整性。
委托人(AWS账户或IAM用户)不共享数据密钥(由独特委托人发送的消息总是得到独特的数据密钥)。因此,对AWS KMS的调用量是在数据密钥重用期间使用的唯一委托人数量的倍数。
估计AWS KMS的成本
为了预测成本并更好地了解您的AWS账单,您可能想知道Amazon SQS使用您的KMS密钥的频率。
要计算每个队列的API请求数(R),使用以下公式。
R = B / D * (2 * P + C)
B是计费期(单位:秒)。
D是数据密钥重用期(单位:秒)。
P是发送至Amazon SQS队列的生产委托人的数量。
C是指从Amazon SQS队列中接收的消费委托人的数量。