You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:22:40