AWS Java SDK调用SimulatePrincipalPolicy返回隐式拒绝结果异常
SimulatePrincipalPolicy接口返回隐式拒绝与实际权限不符问题处理
问题场景
通过Java SDK调用IAM simulateprincipalpolicy接口做权限模拟时,返回结果和实际权限表现不一致。
- 已挂载到IAM角色
Myrole的权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "id", "Effect": "Allow", "Action": [ "ec2:DescribeTags" ], "Resource": "*" } ] }
- 调用接口使用的Java代码:
SimulatePrincipalPolicyRequest simulatePrincipalPolicyRequest = new SimulatePrincipalPolicyRequest() simulatePrincipalPolicyRequest.setPolicySourceArn("arn:aws:iam::123456789012:role/Myrole"); simulatePrincipalPolicyRequest.withActionNames("ec2:DescribeTags");
- 接口返回结果:
{ EvalActionName: ec2:DescribeTags, EvalResourceName: *, EvalDecision: implicitDeny, MatchedStatements: [], MissingContextValues: [], OrganizationsDecisionDetail: {AllowedByOrganizations: false}, EvalDecisionDetails: {}, ResourceSpecificResults: [] }
实际使用该角色执行ec2:DescribeTags操作可正常成功,无权限不足问题。
问题根因
返回结果中OrganizationsDecisionDetail.AllowedByOrganizations字段值为false是核心原因:
- 默认情况下SimulatePrincipalPolicy接口会同时校验AWS Organizations的服务控制策略(SCP)对请求的影响
- 如果调用SDK的身份没有Organizations服务的策略读取权限,接口无法拉取到目标账号绑定的SCP配置,会默认判定SCP拦截请求,返回
implicitDeny结果,且不会匹配到角色上挂载的身份策略 - 实际操作时角色本身的身份策略、SCP均已放行
ec2:DescribeTags操作,所以真实调用不会报错。
修复方案
根据模拟需求二选一即可:
- 不需要模拟SCP影响的场景:在请求中显式关闭SCP校验逻辑
SimulatePrincipalPolicyRequest simulatePrincipalPolicyRequest = new SimulatePrincipalPolicyRequest(); simulatePrincipalPolicyRequest.setPolicySourceArn("arn:aws:iam::123456789012:role/Myrole"); simulatePrincipalPolicyRequest.withActionNames("ec2:DescribeTags"); // 新增:关闭组织SCP策略模拟校验 simulatePrincipalPolicyRequest.setIncludeOrganizationsPolicyDecision(false);
- 需要同时模拟SCP影响的场景:给调用SDK使用的身份添加
organizations:DescribePolicy、organizations:ListPoliciesForTarget权限,保证接口可以正常拉取组织SCP配置,即可返回准确的模拟结果。
内容的提问来源于stack exchange,提问作者Susheel Harsoor
相关产品推荐
相关产品推荐

