配置IAM策略限制含特定标签才允许创建EC2安全组遇权限错误
问题原因分析
AWS控制台创建EC2安全组的默认流程是分两步执行:
- 先调用
ec2:CreateSecurityGroup接口创建一个无标签的安全组 - 再调用
ec2:CreateTags接口为刚创建的安全组添加标签
你的IAM策略中,给ec2:CreateSecurityGroup操作添加了aws:RequestTag/CreatedBy的条件检查,要求该请求必须携带指定标签。但控制台第一步的CreateSecurityGroup请求中根本没有包含任何标签参数,直接触发条件匹配失败,导致权限被拒绝。
解决办法
根据需求,分两种场景提供解决方案:
场景1:适配AWS控制台操作流程
如果需要让控制台能正常创建安全组,同时确保最终的安全组必须带有CreatedBy:a_value标签,可以修改策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:Describe*", "ec2:GetConsole*" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ec2:CreateSecurityGroup", "Resource": "*" }, { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*:*:security-group/${ec2:VpcSecurityGroupId}", "Condition": { "StringEquals": { "aws:RequestTag/CreatedBy": "a_value" } } } ] }
策略说明:
- 允许无标签创建安全组(适配控制台的两步流程)
- 限制
ec2:CreateTags只能作用于刚创建的安全组:${ec2:VpcSecurityGroupId}是AWS提供的上下文变量,仅在CreateSecurityGroup之后的CreateTags请求中会被自动填充为刚创建的安全组ID - 强制
CreateTags操作必须携带CreatedBy:a_value标签,确保最终的安全组一定会有该标签
场景2:强制所有创建方式(API/CLI)必须在创建时带标签
如果只需要支持API或CLI创建安全组,且要求必须在创建时就携带标签,可以保留原策略,但需要确保创建请求中明确包含标签参数:
- 使用CLI创建的示例命令:
aws ec2 create-security-group --group-name MySG --description "My security group" --vpc-id vpc-123456 --tags Key=CreatedBy,Value=a_value
这种情况下,AWS控制台无法直接使用,因为控制台的默认流程不支持在CreateSecurityGroup请求中携带标签(即使你在页面填写标签,控制台仍会分两步执行)。
验证方法
- 控制台测试:使用场景1的策略,在创建安全组页面填写
CreatedBy:a_value标签,完成创建后检查安全组标签是否存在 - CLI测试:使用场景2的策略,不带标签执行
create-security-group命令,应该返回权限拒绝;带标签执行则成功
内容的提问来源于stack exchange,提问作者Michele Amati
相关产品推荐
相关产品推荐

