如何通过AWS SDK查询IAM用户/角色的具体权限列表
问题背景
我们在基于JavaScript开发的静态网站中,使用AWS Cognito与AWS IAM管理用户身份及对应资源访问权限,需要在通过AWS SDK发起特定服务请求前,先获取用户通过其绑定角色所拥有的具体权限。
AWS控制台中可查看到如下示例权限策略配置:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "cognito-idp:GetUser", "iam:ListPoliciesGrantingServiceAccess", "cognito-idp:ListUsers" ], "Resource": "*" } ] }
我们尝试调用SDK提供的接口获取用户/角色关联的策略,实现代码如下:
const iam = new AWS.IAM(); iam.listPoliciesGrantingServiceAccess({ Arn: arn, ServiceNamespaces: [ "iam", "cognito-idp" ] }, (err, data) => { if (err) { console.log(err); } else { console.log(data); } })
现存问题
上述接口仅会返回关联的策略元信息,不会返回策略中包含的具体权限规则,接口返回示例如下:
[ { "ServiceNamespace":"iam", "Policies":[ { "PolicyName":"admin-policy", "PolicyType":"INLINE", "EntityType":"ROLE", "EntityName":"Cognito_Auth_Role" } ] }, { "ServiceNamespace":"cognito-idp", "Policies":[ { "PolicyName":"admin-policy", "PolicyType":"INLINE", "EntityType":"ROLE", "EntityName":"Cognito_Auth_Role" } ] } ]
目前未查询到可直接获取策略对应具体权限内容的SDK方法,需要明确获取指定用户/角色完整权限信息的操作方案。
解决方案
要获取角色/用户的完整权限内容,无法通过listPoliciesGrantingServiceAccess单接口完成,需要按策略类型分步调用对应接口:
- 先解析
listPoliciesGrantingServiceAccess返回的策略元数据,根据PolicyType字段区分策略类型,调用对应接口拉取策略详情:- 类型为
INLINE(内联策略):如果策略挂载对象是角色,调用getRolePolicy接口,传入EntityName对应的角色名、PolicyName对应的策略名,即可直接拿到内联策略的完整权限规则;如果挂载对象是用户,调用getUserPolicy接口传入对应用户名和策略名即可。 - 类型为
MANAGED(托管策略,含AWS官方托管、客户自定义托管):先调用getPolicy接口传入策略ARN,获取策略当前生效的默认版本ID,再调用getPolicyVersion接口传入策略ARN和版本ID,就能拿到托管策略的完整权限文档。
- 类型为
- 针对Cognito认证场景的特殊说明:Cognito用户获取的是角色的临时会话凭证,最终生效权限是角色基础策略、身份池配置的会话权限、角色信任策略三者的交集,自行拉取所有策略计算最终权限容易出现偏差。如果只是要判断用户是否有某个操作的权限,直接调用
simulatePrincipalPolicy接口,传入角色ARN、待校验的操作名和资源ARN,就能直接得到该身份对应操作的权限判定结果,比拉取全量策略自行解析更准确。 - 前端静态站点使用注意:前端持有的Cognito临时角色仅需授予上述策略查询、权限模拟接口的最小访问权限即可,不要配置过高的IAM操作权限,避免出现安全风险。
内容的提问来源于stack exchange,提问作者Cameron
相关产品推荐
相关产品推荐

