IAM基于Principal Tag的条件策略不生效问题排查求助
问题描述
使用AWS Amplify构建应用,通过Cognito用户池管理用户,关联的身份池采用默认访问控制属性映射:将用户池的username映射至IAM角色标签sub,client映射至aud。配置IAM条件策略如下:
"Condition": { "StringLike": { "aws:PrincipalTag/username": "users_sub_value" } }
执行DynamoDB PutItem操作时触发错误:
Error AccessDeniedException: User: <<ASSUMED_ROLE>> is not authorized to perform: dynamodb:PutItem on resource: <<DYNAMO_TABLE>> because no identity-based policy allows the dynamodb:PutItem action
尝试将条件值改为*或添加Null检查后,问题仍存在。
可能的原因
- 标签键名匹配错误:你提到的默认映射是「用户池属性→IAM标签键」,即把用户池的
username映射到标签键sub,而非标签键username。策略中使用aws:PrincipalTag/username会找不到对应的标签,自然无法匹配条件。 - 身份池标签映射未生效:即使配置了映射,若身份池未正确保存设置,或关联的经过身份验证角色未开启会话标签传递,临时凭证不会携带标签。
- 策略附加对象错误:条件策略必须附加到身份池关联的经过身份验证角色上,而非用户池的其他角色或IAM用户。如果策略挂错了对象,请求时不会触发条件判断。
- 临时凭证未关联标签:少数情况下,Cognito身份池生成临时凭证时可能未正确注入标签,导致PrincipalTag为空。
调试PrincipalTag实际内容的方法
- 查看CloudTrail日志:在CloudTrail控制台找到对应的DynamoDB PutItem请求,查看
userIdentity.sessionContext.attributes.principalTags字段,这里会显示请求实际携带的所有标签键值对。 - 通过SDK获取会话标签:在应用中调用AWS STS的
AssumeRoleWithWebIdentity接口(传入Cognito ID Token),查看响应中的Tags参数,即可获取临时凭证附带的所有标签。 - 简化策略测试:先移除条件,仅保留允许
dynamodb:PutItem的权限。如果能正常访问,说明问题出在条件配置;若仍报错,需检查策略是否附加到正确角色,或身份池是否正确关联用户池。 - 检查身份池配置:进入Cognito身份池控制台,确认「访问控制属性」的子标签映射已正确保存,且关联的经过身份验证角色配置无误。
内容的提问来源于stack exchange,提问作者RupturingFarms
相关产品推荐
相关产品推荐

