为何部分AWS SCP策略不生效?EC2标签校验SCP失效排查
SCP3失效原因及修复方案
失效原因
你的SCP3使用的ForAllValues:StringNotEquals条件逻辑和预期需求完全相反:
ForAllValues:StringNotEquals的生效逻辑是:仅当请求中所有标签键都不在指定列表(ENV、OwnerContact)内时,才触发Deny操作。- 换句话说,只要请求里带了任意一个属于列表内的标签键(比如只带了ENV),这个条件就不满足,不会执行Deny,所以即使缺少OwnerContact标签,也能成功创建EC2实例。
修复后的SCP3策略
要实现「必须同时包含ENV和OwnerContact两个标签键才能创建EC2」的需求,需要调整条件逻辑,只要请求缺少这两个标签中的任意一个,就拒绝创建操作。以下是两种可行的写法:
写法1:用Null条件检查标签是否存在
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireMandatoryTags", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "Null": { "aws:RequestTag/ENV": "true", "aws:RequestTag/OwnerContact": "true" } } } ] }
- 逻辑:只要ENV或OwnerContact标签不存在(值为Null),就拒绝实例创建请求。
写法2:用ForAnyValue:StringNotExists检查标签键
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireMandatoryTags", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "ForAnyValue:StringNotExists": { "aws:TagKeys": ["ENV", "OwnerContact"] } } } ] }
- 逻辑:只要指定的标签键列表(ENV、OwnerContact)中有任意一个不存在于请求的标签键中,就拒绝实例创建请求。
补充说明
SCP的核心评估逻辑:
- 所有SCP的Allow语句取并集,Deny语句取交集(只要有一条Deny规则匹配,操作就会被拦截)。
- 你在SCP1中设置
Allow *,再通过Deny语句限制违规操作的思路是正确的,只需修正SCP3的条件逻辑即可。
内容的提问来源于stack exchange,提问作者Frederick Scott Smith
相关产品推荐
相关产品推荐

