启用服务器端加密的跨账户访问AWS SQS

Tof*_*nov 1 amazon-sqs amazon-web-services amazon-iam aws-kms

上下文:AWS账户2中存在一个API,它将SQS url作为其输入之一并将其发布输出。帐户1的所有者希望将此API与自己的SQS队列一起使用。

帐户1具有启用了SSE-KMS的SQS队列。帐户1的所有者希望帐户2中的特定IAM用户能够发布到此SQS队列。我知道的实现此目标的唯一方法是:

  1. 将外部帐户2的ID添加到帐户1的KMS密钥设置中
  2. 向帐户2的IAM用户添加策略,以允许访问给定的KMS密钥

这种方法的问题在于两个帐户都需要采取措施。是否只有一个帐户1的所有者需要做任何事情而无需打扰帐户2的所有者,是否有更简单的方法来达到相同的结果?

编辑1:当我们尝试在不启用SQS加密的情况下进行集成时,一切正常。这就是我们所知道的是KMS问题,而不是SQS政策。启用S​​QS加密后,由于AccessDeniedException,它开始失败

Joh*_*ein 6

为了测试这种情况,我做了以下工作:

在帐户A中:

  • 创建的用户1
  • 创建了一个KMS密钥
  • 授予我使用密钥的权限,但没有授予User-1使用权限
  • 在帐户A中创建队列,激活SSE并选择新密钥
  • 向用户1授予AmazonSQSFullAccess权限策略

然后,我以User-1身份运行命令以将消息发送到队列:

aws sqs send-message --queue-url https://sqs.ap-southeast-2.amazonaws.com/123456789012/my-queue --message-body foo --profile user-1
Run Code Online (Sandbox Code Playgroud)

响应是:

调用SendMessage操作时发生错误(KMS.AccessDeniedException):用户:arn:aws:iam :: 123456789012:user / user-1无权执行:kms:GenerateDataKey资源:arn:aws:kms:ap- southeast-2:123456789012:key / xxx(服务:AWSKMS;状态代码:400;错误代码:AccessDeniedException;请求ID:xxx)

因此,这表明在向队列发送消息(显然是)时,必须授予该用户使用KMS的权限kms:GenerateDataKey。我假设每个消息都是通过KMS生成的唯一密钥分别加密的。

然后,我授予了User-1使用KMS密钥的权限,并且命令成功完成。因此,它在同一帐户中运行

然后,在帐户2中:

  • 已创建用户2
  • 授予的AmazonSQSFullAccess权限

当我再次使用User-2的凭据运行命令时,收到以下消息:

调用SendMessage操作时发生错误(AccessDenied):拒绝访问资源https://ap-southeast-2.queue.amazonaws.com/

这是预期的,因为用户2在另一个帐户(帐户2)中。

然后,我进入了Account-1中的SQS队列,并通过提供User-2的ARN为User-2添加了权限。

我再次运行命令并熟悉了:

调用SendMessage操作时发生错误(KMS.AccessDeniedException):null(服务:AWSKMS;状态代码:400;错误代码:AccessDeniedException;请求ID:xxx)

请注意,它ASKMS在错误中提及。

然后,我更新了KMS密钥以允许arn:aws:iam::<Account-2>:root用作外部帐户

那仍然没有帮助。原来,我不得不kms:*向User-2 添加一些类型许可。(权限太大,但是我很懒!)

这,然后工作。

然后,我删除了KMS 外部帐户权限,该权限仍然有效。

因此,似乎:

  • 帐户2中的用户2需要权限才能调用SQS和KMS
  • 帐户1中的SQS队列需要权限,以允许用户2使用该队列

您可能要问他们是否真的想要使用KMS密钥!:)