gpt4 book ai didi

java - 如何与加密的 SQS 队列交互? KMS key 访问不起作用

转载 作者:行者123 更新时间:2023-12-03 07:32:07 25 4
gpt4 key购买 nike

我正在尝试通过 Java SDK 与加密的 SQS 队列交互。

应用程序正在发送响应:

AmazonSQSException:密文引用的客户主 key 不存在、不存在于该区域或不允许您访问。

但是,我可以看到该 key 确实存在,并且我正在尝试提供正确的访问权限。

我认为我这样做的方式存在一些错误。请参阅下文 -

SDK交互

意图:从一个队列读取并写入另一个队列。在第 4 行之后尝试接收消息时失败。

public void replayQueue(QueuePair queuePair) {
ReceiveMessageRequest messageRequest = new ReceiveMessageRequest()
.withQueueUrl(queuePair.getDlq());
log.info("Constructed receive request: " + messageRequest.toString());
sqs.receiveMessage(messageRequest).getMessages().stream()
.forEach(message -> {
log.info("Inside stream. Message: " + message.toString());
SendMessageRequest request = new SendMessageRequest()
.withQueueUrl(queuePair.getSource())
.withMessageBody(message.getBody());
log.info("Send request: " + request);
SendMessageResult result = sqs.sendMessage(request);
log.info("Sent messages to " + queuePair.getSource() + " with result of: " + result.toString());
}
);
}

key 创建

key 是在另一个微服务的模板中创建的,并且适用于该服务。

ApplicationKmsKeyForSqs:
Type: AWS::KMS::Key
Properties:
Description: Encrypts messages published to SQS from SNS
KeyPolicy:
Version: 2012-10-17
Id: !Sub ${DNSEndPoint}-application-${Environment}-sqs-kms-key
Statement:
- Sid: Enable IAM User Permission
Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action:
- kms:*
Resource: '*'
- Sid: Allow SQS to use the key
Effect: Allow
Principal:
Service: sqs.amazonaws.com
Action:
- kms:GenerateDataKey*
- kms:Decrypt
Resource: '*'

ApplicationKMSKeyAlias:
Type: AWS::KMS::Alias
Properties:
AliasName: !Sub 'alias/application-${Environment}-sqs-kms-key'
TargetKeyId: !Ref ApplicationKmsKeyForSqs

我可以看到该 key 存在于 AWS 控制台中并且具有正确的别名。

向应用程序授予权限

此策略应授予我的应用程序使用在其他微服务中创建的 key 的权限。

ApplicationPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: app-policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- sqs:*
Resource: !Sub arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:*${Environment}*
- Effect: Allow
Action:
- kms:Encrypt
- kms:Decrypt
- kms:GenerateDataKey*
- kms:*
Resource: !Sub arn:aws:kms:us-east-1:${AWS::AccountId}:alias/application-${Environment}-sqs-kms-key

鉴于此,我认为:

  1. key 显然存在
  2. 位于正确的区域
  3. 我正在授予其访问权限(或尝试授予其访问权限)

所以我想知道我是否还缺少其他东西。 key 是否应该作为请求的一部分发送?我授予它访问权限的方式是否有问题?

如有任何提示,我们将不胜感激。

最佳答案

在 KMS key 的实现中,您仅提供对 SQS 的访问权限以使用 KMS key 进行解密。由于 SQS 正在使用服务器端加密进行加密,因此需要进行扩展,以便 sqs 也可以加密。

- Sid: Allow SQS to use the key
Effect: Allow
Principal:
Service: sqs.amazonaws.com
Action:
- kms:GenerateDataKey*
- kms:Decrypt
- kms:Encrypt
Resource: '*'

然后,lambda 函数需要 KMS key 的权限才能进行 kms:Decrypt 和 kms:GenerateDataKey。

亚马逊文档: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html#send-to-encrypted-queue

关于java - 如何与加密的 SQS 队列交互? KMS key 访问不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55577515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com