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

时间:2018-06-08 08:57:59

标签: amazon-web-services amazon-sqs 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密钥
  3. 这种方法的问题是两个帐户都需要采取行动。是否有更简单的方法来实现相同的结果,只有帐户1所有者需要做任何事情而不需要打扰帐户2的所有者?

    编辑1:当我们尝试集成而不在SQS上启用加密时,一切正常。这就是我们如何知道它是KMS问题,而不是SQS政策。一旦我们启用SQS加密,它就会因AccessDeniedException

    而开始失败

1 个答案:

答案 0 :(得分:5)

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

在帐户A中:

  • 创建了User-1
  • 创建了KMS密钥
  • 授予我使用密钥的权限,但不允许使用用户1
  • 在Account-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

回应是:

  

调用SendMessage操作时发生错误(KMS.AccessDeniedException):User: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密钥的权限,并且命令已成功完成。因此,它在同一帐户中

然后,在Account-2中:

  • 创建了User-2
  • 授予AmazonSQSFullAccess权限

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

  

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

这是预期的,因为User-2位于不同的帐户(Account-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作为外部帐户

那仍然没有帮助。原来我必须向User-2添加一些kms:*类型的权限。 (太任何权限,但我变得懒惰!)

这,然后工作。

然后,我删除了KMS 外部帐户权限,但仍然可以使用。

所以,似乎:

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

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