当前位置: 首页 > 知识库问答 >
问题:

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

孙嘉
2023-03-14

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

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

  1. 将外部帐户2的ID添加到帐户1的KMS密钥设置中

这种方法的问题是两个帐户都需要采取行动。如果只有帐户1的所有者需要做任何事情,而不需要打扰帐户2的所有者,是否有一种更简单的方法来实现相同的结果?

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

共有1个答案

颜楚青
2023-03-14

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

在账户A中:

  • 已创建用户-1

然后,我以用户-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):用户:arn:aws:iam::123456789012:User/User-1无权对资源执行:KMS:GeneratedTakey:arn:aws:KMS:ap-2:123456789012:key/xxx(服务:AWSKMS;状态代码:400;错误代码:AccessDeniedException;请求ID:xxx)

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

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

然后,在账户2中:

  • 已创建用户-2

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

调用SendMessage操作:访问资源时出错(AccessDenied)https://ap-southeast-2.queue.amazonaws.com/他被拒绝了。

这是意料之中的,因为用户2位于不同的帐户(帐户2)。

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

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

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

请注意,它在错误中提到了ASKMS

然后我更新了KMS密钥以允许arn: aws: iam::

那还是没用。结果我不得不向User-2添加一些kms:type权限。(太多权限了,但我越来越懒了!)

这个,然后起作用了。

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

因此,似乎:

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

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

 类似资料:
  • 我想授予服务帐户访问Google Secrets Manager中的秘密的权限。 我可以像这样获得这个秘密: 但是当我的服务号尝试相同的命令时,gCloud会发出以下错误: 错误:(gcloud.beta.secrets.versions.access)权限被拒绝:请求的身份验证范围不足。 主要问题是:我还需要做些什么来确保服务帐户可以访问该机密? 我已授予该服务帐户“roles/secretma

  • 我正在尝试像这样在客户端加密一个字符串 我试着在服务器端像这样解密。我正在使用jersey公开一个web服务。 AysmetricKeyCryptography类如下所示 当我在AsymetricKeyCryptograph类中运行main方法时,我得到了一个正确的结果,但是当我通过发送加密字符串调用Web服务时,它会抛出一个异常: 我不明白我哪里出错了

  • 我正在构建一个Java Web应用程序,当经理批准他们的请求时,它会自动授予用户对其Windows PC的管理权限。 为了实现这一点,我将编写一个脚本来自动远程访问用户的计算机,并将他们添加到计算机的管理组中。我想为了做到这一点,我需要一个管理服务帐户来访问所有的计算机。 我的问题是,我如何安全地存储管理服务帐户信息?应用程序每次需要访问并授予用户管理员权限时都需要凭据,那么我如何让应用程序在没有

  • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?

  • 我正在尝试使用服务帐户访问目录API(https://developers.google.com/admin-sdk/Directory/v1/reference/users/list)。最简单的任务是列出组织中的用户。通过OAuth2.0 PlayGorund测试,这在我的用户帐户中运行良好。但我需要使用服务帐户。我正在阅读关于双腿OAuth(https://developers.google.

  • 是否可以使用服务帐户访问Google Admin Report SDK? 我有一个非常基本的例子,我正在尝试运行,我总是得到一个400错误返回。我已经验证了密钥和服务ID是正确的,我甚至已经将权限委托给这个服务帐户。难道这就是不可能吗?有人有什么想法吗? 返回的错误如下: {“代码”:401,“错误”:[{“domain”:“global”,“location”:“authorization”,“