如何通过AWS IAM SCP阻止owner标签值含空格?现有策略无效求指导
AWS IAM SCP阻止含空格的owner标签问题排查与修复
问题描述
需要通过AWS IAM服务控制策略(SCP)阻止owner标签(不区分大小写)的值包含空格,但当前配置的策略无法生效,仍允许创建含空格的owner标签。当前使用的策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Deny", "Action": [ "cloudformation:CreateStack" ], "Resource": [ "*" ], "Condition": { "ForAllValues:StringNotEquals": { "aws:TagKeys": [ "owner", "Owner" ] }, "ForAllValues:StringEquals": { "aws:RequestTag/Owner": "* *" } } } ] }
当前策略的问题
- 条件逻辑反向:
ForAllValues:StringNotEquals针对aws:TagKeys的配置,实际是要求所有标签键都不等于owner/Owner才触发拒绝,这和需求完全相反——我们需要的是当存在owner/Owner标签且值含空格时拒绝。 - 通配符使用错误:
StringEquals不支持*作为通配符匹配,要匹配包含空格的字符串,必须使用StringLike运算符。 - 标签大小写覆盖不全:当前仅检查了大写的
aws:RequestTag/Owner,没有处理小写的aws:RequestTag/owner,导致小写标签的空格值无法被拦截。 - 不必要的
ForAllValues:该运算符用于要求所有匹配的键都满足条件,但这里只需要检查存在的owner/Owner标签,用ForAnyValue更合适。
修改后的策略
以下是修正后的SCP,可实现阻止含空格的owner/Owner标签:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyOwnerTagWithSpace", "Effect": "Deny", "Action": "cloudformation:CreateStack", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": ["owner", "Owner"] }, "Or": [ { "StringLike": { "aws:RequestTag/owner": "* *" } }, { "StringLike": { "aws:RequestTag/Owner": "* *" } } ] } } ] }
策略说明
ForAnyValue:StringEquals:检查请求中是否存在owner或Owner标签,只要存在其中一个就进入后续条件判断。Or条件组:分别检查小写owner和大写Owner标签的值是否包含空格(通过StringLike和* *匹配),只要任意一个满足就触发拒绝。- 简化了
Action和Resource的写法,单值时无需用数组。
内容的提问来源于stack exchange,提问作者hysobee
相关产品推荐
相关产品推荐

