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

如何用Common Expression Language在Terraform拒绝策略中检查GCP IAM角色?

解决方案

你可以通过CEL表达式中的request.auth.roles数组检查当前请求主体拥有的角色,以此实现拒绝策略仅作用于特定角色(或排除特定角色)的需求。

1. 拒绝拥有指定自定义角色的用户

如果要让拒绝规则仅对拥有projects/project-id-12345/roles/account_admin_role角色的用户生效,使用以下CEL表达式:

request.auth.roles.exists(r => r == "projects/project-id-12345/roles/account_admin_role")

2. 排除拥有管理员角色的用户

如果要让拒绝规则作用于除管理员(比如拥有roles/owner预定义角色)之外的所有用户,表达式改为:

!request.auth.roles.exists(r => r == "roles/owner")

修改后的Terraform代码示例

resource "google_iam_deny_policy" "account-admin-explicit-deny-policy" {
  provider = google-beta
  parent   = urlencode("cloudresourcemanager.googleapis.com/projects/${var.project_id}")
  name     = "account-admin-explicit-deny-policy"
  display_name = "Account Admin Explicit Deny Policy"
  rules {
    description = "Prevent the activation of new GCP APIs - those service/api activations should be controlled by administrators."
    deny_rule {
      denied_principals = ["principalSet://goog/public:all",]
      denial_condition {
        title = "Apply only to Account Admin role holders"
        expression = "request.auth.roles.exists(r => r == \"projects/project-id-12345/roles/account_admin_role\")"
      }
      denied_permissions = [
        "serviceusage.googleapis.com/services.disable",
        "serviceusage.googleapis.com/services.enable",
      ]
      exception_principals = []
    }
  }
}

关键说明

  • request.auth.roles是CEL提供的内置变量,包含当前请求主体所拥有的所有角色ID的数组。
  • 自定义角色必须使用完整的项目级ID(如projects/[项目ID]/roles/[角色名]),预定义角色可以使用短格式(如roles/owner)。
  • 确保使用google-beta provider,因为IAM拒绝策略目前仍处于Beta阶段。

内容的提问来源于stack exchange,提问作者Cosmay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:47:45