如何用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-betaprovider,因为IAM拒绝策略目前仍处于Beta阶段。
内容的提问来源于stack exchange,提问作者Cosmay
相关产品推荐
相关产品推荐

