AWS STS跨账号查询EC2/RDS调用AssumeRole报AccessDenied错误
问题描述
需求为跨多个AWS账号拉取每个账号下的EC2实例、RDS实例资源,当前仅可在单账号下调用describe_instances()、describe_db_instances()接口获取对应资源,尝试通过STS服务实现跨账号资源查询时,持续抛出AccessDenied异常。
执行环境为Ubuntu CLI,执行的命令如下:
aws sts assume-role --role-arn "arn:aws:iam::<custom_id>:role/sts:AssumeRole" --role-session-name "Custom-Session"
命令返回报错信息:
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::<custom_id>:user/<custom_user> is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::<custom_id>:role/sts:AssumeRole
排查解决步骤
按以下优先级逐一排查配置问题:
- 修正角色ARN格式错误
你当前传入的--role-arn参数不符合IAM角色ARN规范。标准IAM角色ARN格式为arn:aws:iam::<目标账号ID>:role/<实际创建的角色名称>,你当前填写的sts:AssumeRole是STS服务的操作名,不是角色名,属于无效ARN。先登录目标账号确认实际创建的跨账号访问角色名称,替换为正确的角色ARN后再重试。 - 校验目标账号跨账号角色的信任策略
登录需要访问的目标AWS账号,找到用于跨账号访问的IAM角色,打开信任关系配置页,确认配置满足两个要求:- 策略的
Principal字段明确包含你当前执行命令使用的IAM用户ARN:arn:aws:iam::<操作账号ID>:user/<custom_user>,如果使用同账号下其他角色的临时凭证执行命令,也需要将对应角色ARN加入Principal列表 - 策略的
Action字段明确配置为sts:AssumeRole,无拼写错误
可参考以下正确的信任策略配置:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<操作账号ID>:user/<custom_user>" }, "Action": "sts:AssumeRole" } ] } - 策略的
- 校验当前操作身份的权限配置
回到执行CLI命令所用的IAM用户(报错信息中的<custom_user>),确认该用户绑定的自定义或托管权限策略中,明确允许对目标跨账号角色执行sts:AssumeRole操作,可参考以下权限配置:
生产环境遵循最小权限原则,不要将{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<目标账号ID>:role/<跨账号访问角色名>" } ] }Resource设置为通配符*。 - 排查高阶策略拦截
如果上述配置均修正后仍报权限错误,依次排查两类高阶策略:- 检查当前操作用户、目标跨账号角色是否配置了权限边界(Permissions Boundary),确认边界策略没有拦截
sts:AssumeRole相关操作 - 如果账号归属于AWS Organization组织,检查账号所属OU、根节点绑定的服务控制策略(SCP),确认没有拒绝跨账号角色扮演的相关规则
- 检查当前操作用户、目标跨账号角色是否配置了权限边界(Permissions Boundary),确认边界策略没有拦截
- 配置资源访问权限
AssumeRole调用成功后,会返回临时访问密钥、私有访问密钥、会话令牌三类凭证,将这组凭证配置到CLI或SDK后,才能调用目标账号的资源接口。同时需要给目标跨账号角色附加EC2、RDS的只读权限(例如AmazonEC2ReadOnlyAccess、AmazonRDSReadOnlyAccess托管策略),否则即使角色扮演成功,也无法拉取实例资源。
内容的提问来源于stack exchange,提问作者connienix30
相关产品推荐
相关产品推荐

