为了测试这种情况,我执行了以下操作:
在账户 A 中:
- 创建用户1
- 创建了 KMS 密钥
- 授予我使用密钥的权限,但不授予 User-1
- 在帐户 A 中创建队列,激活 SSE 并选择新密钥
- 授予 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
回应是:
调用 SendMessage 操作时发生错误 (KMS.AccessDeniedException):用户:arn:aws:iam::123456789012:user/user-1 无权对资源执行:kms:GenerateDataKey:arn:aws:kms:ap- east-2:123456789012:key/xxx(服务:AWSKMS;状态代码:400;错误代码:AccessDeniedException;请求 ID:xxx)
因此,这表明用户在向队列发送消息时必须被授予使用 KMS 的权限,显然是为了kms:GenerateDataKey
。我假设每条消息都通过 KMS 生成的唯一密钥单独加密。
然后,我授予 User-1 使用 KMS 密钥的权限,命令成功完成。所以,它正在工作在同一帐户内.
然后,在 Account-2 中:
- 创建用户2
- Granted
AmazonSQSFullAccess
权限
当我使用 User-2 的凭据再次运行该命令时,我收到:
调用SendMessage操作时发生错误(AccessDenied):访问资源https://ap-southeast-2.queue.amazonaws.com/ 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
as an 外部账户.
那仍然没有帮助。事实证明我必须添加一些kms:*
键入 User-2 的权限。 (太多权限了,但我太懒了!)
这然后就起作用了。
然后我删除了KMS外部账户许可,它仍然有效。
所以,看来:
- Account-2 中的 User-2 需要调用 SQS 和 KMS 的权限
- Account-1 中的 SQS 队列需要权限以允许 User-2 使用该队列
您可能想问他们是否真的真的想要使用 KMS 密钥! :)