AWS IAM角色链为何无法获取子角色的CloudFormation权限?
问题分析与原因说明
问题背景
用户拥有附加的策略FooPol:
{ "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::000000000000:role/fooRole", "Effect": "Allow" } ] }
fooRole附加了策略BarPol:
{ "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::000000000000:role/barRole", "Effect": "Allow" } ] }
barRole具备cloudformation:DescribeStacks权限,但通过「用户→fooRole→barRole」的角色链无法执行该操作,直接将BarPol附加到用户则可正常授权。
核心原因
1. barRole的信任策略未授权fooRole作为可信实体
当用户直接通过自身的BarPol执行sts:AssumeRole访问barRole时,barRole的信任策略必然包含了该用户(或用户所属AWS账户)作为可信主体,因此操作能成功。但通过角色链访问时,是fooRole发起Assume barRole的请求,此时barRole的信任策略需要明确允许fooRole的ARN作为可信实体,否则这个请求会被拒绝,无法获取barRole的权限。
2. 角色链的权限传递需满足双向授权规则
AWS角色链的每一步都必须同时满足两个条件:
- 上层实体(用户/前序角色)拥有允许Assume目标角色的权限策略;
- 目标角色的信任策略明确允许上层实体作为可信来源。
你的场景中,fooRole虽然有BarPol允许它Assume barRole,但barRole的信任策略未对fooRole开放权限,导致角色链在第二步中断,无法获取barRole的权限执行cloudformation:DescribeStacks操作。
解决方法
更新barRole的信任策略,添加允许fooRole Assume它的规则,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::000000000000:role/fooRole" }, "Action": "sts:AssumeRole" } ] }
内容的提问来源于stack exchange,提问作者Varid Vaya
相关产品推荐
相关产品推荐

