You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS SDK通过Assumed-Role跨账号IAM访问报错排查

跨AWS账号角色扮演权限问题

场景说明

在K8s Pod中,通过WebIdentityTokenFileCredentialsProvider获取账号1的account-1-role凭证,尝试扮演账号2中的my-query-role角色。

当前配置

账号1:account-1-role权限策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::<account_2_id>:role/my-query-role"
            ]
        }
    ]
}

账号2:my-query-role信任策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<account_1_id>:root"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Java实现代码

AwsCredentialsProvider awsCredentialsProvider = WebIdentityTokenFileCredentialsProvider.create();

StsClient stsClient = StsClient.builder()
        .credentialsProvider(awsCredentialsProvider)
        .region(Region.EU_WEST_1)
        .build();

AssumeRoleRequest assumeRoleRequest = AssumeRoleRequest.builder()
        .roleArn("arn:aws:iam::<account_2_id>:role/my-query-role")
        .roleSessionName(MANAGED_PROMETHEUS_ROLE_SESSION)
        .build();

AssumeRoleResponse assumeRoleResponse = stsClient.assumeRole(assumeRoleRequest);

问题现象

调用sts:AssumeRole时返回403权限错误:

software.amazon.awssdk.services.sts.model.StsException: User: arn:aws:sts::<account_1_id>:assumed-role/<account_1_role>/aws-sdk-java-1680536628314 
is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::<account_2_id>:role/my-query-role 
(Service: Sts, Status Code: 403, Request ID: 9aa79d21-344f-41b1-a251-8f81bb23af8c)

疑问

是否需要为StsClient单独配置权限策略?根据文档,已扮演的角色应该继承父角色的策略,且被账号2信任,但报错中的ARN格式是arn:aws:sts::<account_1_id>:assumed-role/...,而非父角色的arn:aws:iam::<account_1_id>:role/...。


解决方案

1. 修正账号2的信任策略

当前信任策略仅允许账号1的root用户扮演角色,但实际发起请求的是account-1-role的临时会话身份(即报错中的assumed-role),需调整Principal为账号1的目标角色ARN:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<account_1_id>:role/account-1-role"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

角色的临时会话身份会自动继承父角色的信任关系,只要父角色被账号2信任,临时身份就可以发起扮演请求。

2. 验证账号1权限策略的有效性

确认以下两点:

  • Pod确实正确获取了account-1-role的凭证,未使用其他身份
  • 权限策略已正确附加到account-1-role,且无SCP(服务控制策略)等全局规则限制sts:AssumeRole操作

3. StsClient无需单独配置权限

StsClient仅作为调用STS服务的客户端,它使用传入的awsCredentialsProvider提供的身份执行操作,只要该身份(account-1-role及其临时会话)拥有对应权限,且被目标角色信任即可,无需额外为客户端配置权限。

4. 关于ARN格式的说明

报错中的arn:aws:sts::<account_1_id>:assumed-role/...是角色的临时会话ARN,属于account-1-role的身份链,只要父角色拥有权限且被信任,该临时会话即可执行对应的STS操作。


内容的提问来源于stack exchange,提问作者Fatboyover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:12:39