ECS Fargate任务无法发布到加密SNS主题的KMS权限疑问
权限缺失的根本原因
你对IAM权限评估逻辑的理解存在一个关键误区:KMS密钥策略中对账号根主体的授权,并不会直接将权限传递给账号内的所有IAM身份。
你当前配置的客户管理密钥策略如下:
{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXXXXXXXXX:root" }, "Action": "kms:*", "Resource": "*" }
这个配置的实际效力只有两点:
- 直接授予账号根用户对该密钥的完全操作权限
- 开放权限入口,允许账号内的其他IAM主体(用户、角色、服务角色)通过绑定身份策略的方式获取该密钥的操作权限,它本身不会给账号内的非根身份自动授予任何权限
你遇到的报错信息:
arn:aws:sts::XXXXXXXXX:assumed-role/ecs-task-role/XXXXX is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:eu-west-1:XXXXXXXXX:key/XXXXXXXX
本质就是这个逻辑的体现:ECS Fargate任务使用的ecs-task-role属于账号内的普通IAM角色,密钥策略中给根主体的授权没有直接覆盖到该角色。所谓「资源策略与身份策略权限取并集」的规则,前提是资源策略已经明确给目标身份(或目标身份可直接继承权限的主体)授予了对应权限;如果资源策略仅授权给根主体,没有直接指向目标角色,那么目标角色能否调用KMS接口,完全取决于自身绑定的身份策略是否包含对应权限。
这也是为什么你在任务角色的身份策略中添加kms:GenerateDataKey权限就能解决问题——密钥策略已经开放了账号内身份获取权限的入口,身份策略给角色附加对应权限后,两者共同生效,角色才获得了操作该KMS密钥的合法权限。
补充说明:不要混淆KMS和其他AWS服务的资源策略逻辑。S3、SNS等服务的资源策略在绑定账号根主体时,部分场景下会默认给账号内身份传递权限,但KMS密钥策略是独立的权限边界,没有这个默认传递逻辑,必须显式给目标身份授权(要么写在密钥策略的Principal列表里,要么通过身份策略附加)。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

