使用AWS SDK通过Assumed-Role跨账号IAM访问报错排查
场景说明
在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

