如何在IAM策略中使用通配符实现主体标签与S3对象标签的包含匹配?
问题根因
你当前的IAM策略匹配逻辑完全倒置,导致匹配失败:StringLike运算符的判断规则为左侧键对应的实际值,是否符合右侧的通配符表达式规则。你原有写法要求S3对象的custom:kypha标签值(值为hello)精确匹配用户PrincipalTag的custom:kypha值(值为hi-hello-welcome),二者本身不相等,自然返回访问拒绝。
修复方案
你需要的逻辑是「用户属性值包含S3对象的标签值」,所以要调换匹配双方的位置,同时给S3标签值前后增加多字符通配符*,修改后的策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:GetObject*", "Resource": "arn:aws:s3:::*", "Condition": { "StringLike": { "aws:PrincipalTag/custom:kypha": "*${s3:ExistingObjectTag/custom:kypha}*" } } } ] }
修改后匹配逻辑变为:检查用户的custom:kypha属性值是否符合*hello*的通配符规则,你的用户属性值为hi-hello-welcome,完全符合匹配要求,可正常放行。
额外校验点
- 确认Cognito身份池已完成属性映射配置,Cognito用户的
custom:kypha属性已正确映射为STS返回的PrincipalTag,否则${aws:PrincipalTag/custom:kypha}会解析为空,导致匹配失败。 - 确认S3桶无其他优先级更高的拒绝类桶策略,覆盖当前ABAC授权规则。
内容的提问来源于stack exchange,提问作者Manish Pal
相关产品推荐
相关产品推荐

