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

Cross account access to AWS SQS with Server-side Encryption enabled

上下文: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 策略。一旦我们启用 SQS 加密,它就会因 AccessDeniedException

而开始失败

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

在帐户 A 中:

  • 已创建用户 1
  • 已创建 KMS 密钥
  • G运行允许我使用密钥,但不是 User-1
  • 在帐户 A 中创建队列,激活 SSE 并选择新密钥
  • G运行ted User-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

响应是:

An error occurred (KMS.AccessDeniedException) when calling the SendMessage operation: User: arn:aws:iam::123456789012:user/user-1 is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:ap-southeast-2:123456789012:key/xxx (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxx)

因此,这表明用户必须获得 运行 许可才能在向队列发送消息时使用 KMS,显然是 kms:GenerateDataKey。我假设每条消息都通过 KMS 生成的唯一密钥单独加密。

然后我获得了 User-1 使用 KMS 密钥的权限,命令成功完成。因此,它在同一帐户内工作

然后,在帐户 2 中:

  • 已创建用户 2
  • G运行ted AmazonSQSFullAccess 权限

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

An error occurred (AccessDenied) when calling the SendMessage operation: Access to the resource https://ap-southeast-2.queue.amazonaws.com/ is denied.

这是预料之中的,因为 User-2 在不同的帐户 (Account-2) 中。

然后我转到帐户 1 中的 SQS 队列,并通过提供用户 2 的 ARN 为用户 2 添加权限。

我再次运行命令,得到了熟悉的:

An error occurred (KMS.AccessDeniedException) when calling the SendMessage operation: null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxx)

注意它在错误中提到了 ASKMS

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

这仍然没有帮助。原来我必须向 User-2 添加一些 kms:* 类型的权限。 (权限太多了,我懒了!)

这个,然后就成功了。

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

所以,似乎是:

  • Account-2 中的 User-2 需要调用 SQS 和 KMS 的权限
  • 帐户 1 中的 SQS 队列需要允许用户 2 使用队列的权限

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