Terraform中配置IAM策略:如何用正则排除指定用户的删除权限?
问题
我在Terraform中编写了如下IAM策略语句:
statement { sid = "DenyDelete" effect = "Deny" actions = [ "iam:Delete*" ] resources = [ "arn:aws:iam::123456789012:user/(?!userA|userB)", ] }
我希望通过该策略拒绝除userA和userB之外所有IAM用户的iam:Delete*操作,也就是正则要匹配以arn:aws:iam::123456789012:user/开头、后续不是userA或userB的ARN。我测试过正则arn:aws:iam::123456789012:user\/(?!userA|userB),确认它能匹配除userA和userB外的用户ARN,但部署后没达到预期效果,推测是Terraform里的正则语法用错了。请问怎么写正确的正则表达式,让资源范围包含除userA和userB外的所有IAM用户?注:我不能用NotResource,因为它会包含非用户类的其他资源。
解决方案
AWS IAM资源ARN的正则匹配遵循ECMAScript规范,但在Terraform的IAM策略里,得注意两个核心点:
- 正则要结合通配符覆盖完整的ARN后缀,不能只写部分匹配规则
- AWS IAM本身支持专门的否定通配符语法,比纯正则负向预查更适配
推荐写法(用IAM原生否定通配符)
这种写法更简洁可靠,是AWS官方推荐的资源排除方式:
statement { sid = "DenyDelete" effect = "Deny" actions = [ "iam:Delete*" ] resources = [ "arn:aws:iam::123456789012:user/!(userA|userB)" ] }
正则负向预查的正确写法
如果一定要用正则,得确保匹配完整的用户名称,避免部分匹配漏洞:
statement { sid = "DenyDelete" effect = "Deny" actions = [ "iam:Delete*" ] resources = [ "arn:aws:iam::123456789012:user/(?!userA$|userB$).+" ] }
这里的$用来确保完全匹配userA/userB(避免误匹配userA-test这类用户),.+用来匹配用户名称的剩余部分。
原写法无效的原因
你之前写的(?!userA|userB)只是前置断言,没有覆盖后续的字符匹配逻辑,AWS IAM无法识别这种不完整的正则规则,必须明确匹配ARN的完整用户部分。
内容的提问来源于stack exchange,提问作者Sabo Boz
相关产品推荐
相关产品推荐

