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

为何google_storage_bucket_iam_policy未覆盖项目级存储权限?

问题原因及解决方案

核心原因

1. GCP IAM权限是累加生效的

GCP的权限规则遵循累加原则——只要用户在任意层级(组织、文件夹、项目、资源)被授予了允许的权限,就会拥有该权限,低层级的策略无法覆盖高层级的允许权限。你给email_2设置的是项目级storage.objects.create权限,这个权限会自动继承到项目下所有GCS存储桶,包括B1。

2. google_storage_bucket_iam_policy的作用范围有限

这个Terraform资源仅负责完全替换存储桶自身的IAM策略,它只能管理存储桶层级的IAM绑定,无法修改或覆盖项目、组织等更高层级的IAM设置。也就是说,它只会清空并替换B1自己的IAM规则,但项目级的权限规则依然独立存在,且会作用到B1上。

实现预期效果的方法

如果要让email_2无法在B1中创建对象,有两种可行方案:

  • 方案一:移除项目级权限(不推荐,可能影响项目内其他存储桶或资源)
    直接删除项目中给email_2授予的storage.objects.create权限,这样继承到B1的权限就会消失。

  • 方案二:添加存储桶级拒绝规则(推荐,精准控制)
    在B1的IAM策略中添加拒绝绑定,拒绝规则的优先级高于允许权限,即使项目级有允许权限,拒绝规则也会生效。用Terraform实现的示例代码如下:

# 给email_2添加存储桶级的创建权限拒绝规则
resource "google_storage_bucket_iam_binding" "deny_email2_b1_create" {
  bucket = "B1"
  role   = "roles/storage.objects.create"
  members = [
    "user:email_2@yourdomain.com",
  ]
  condition {
    title       = "DenyEmail2CreateInB1"
    description = "明确禁止email_2在B1存储桶创建对象"
    expression  = "true"
  }
}

或者使用GCP的Deny Policy资源更灵活地配置拒绝规则:

resource "google_storage_bucket_deny_policy" "deny_email2_b1" {
  bucket = "B1"
  name   = "deny-email2-create"
  rule {
    deny_rule {
      denied_principals = ["user:email_2@yourdomain.com"]
      denied_permissions = ["storage.objects.create"]
    }
    description = "禁止email_2在B1创建对象"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:25:08