跨AWS账号跨区域能否调用其他账号的KMS密钥完成解密?
解决方案
问题根因
- 当前配置的KMS密钥策略缺少SNS投递加密SQS必需的
kms:Decrypt权限,现有动作列表中kms:Get*并不包含该动作 - 仅授权账号B的根主体权限不符合跨账号服务调用的权限校验逻辑,需要明确授予SNS服务委托人对应密钥访问权限
修正配置步骤
1. 调整KMS密钥资源策略
仅保留SNS服务必需的最小权限,同时添加服务委托人授权,可额外增加条件限制仅允许指定账号B的SNS主题调用,避免权限过度宽泛,CDK代码修改如下:
encryptionMasterKey.addToResourcePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: [ "kms:GenerateDataKey", "kms:Decrypt" ], resources: ["*"], principals: [ new iam.AccountPrincipal("<account B id>"), new iam.ServicePrincipal("sns.amazonaws.com") ], // 可选条件,收紧权限仅允许指定SNS主题调用,替换为实际SNS主题ARN即可 conditions: { ArnLike: { "aws:SourceArn": "arn:aws:sns:us-west-2:<account B id>:<你的SNS主题名称>" } } }));
2. 校验基础配置项
- 确认使用的KMS密钥为对称客户托管密钥,SQS SSE不支持非对称密钥、AWS托管的SQS默认密钥(aws/sqs)的跨账号访问
- 你当前未开启加密时可正常投递,说明SQS队列策略、SNS主题策略的跨账号访问权限已配置正确,无需额外修改
验证方法
配置部署完成后,向账号B的SNS主题发送测试消息,确认账号A的SQS队列可正常接收消息,CloudTrail中无KMS.AccessDeniedException日志即配置生效。
内容的提问来源于stack exchange,提问作者bappak
相关产品推荐
相关产品推荐

