如何授予用户仅导出数据到 Cloud Storage 的最小权限?

解读

在国内金融、政企类客户的面试中,考官往往把“最小权限原则”与“等保 2.0 对数据外泄的合规要求”放在一起追问。
本题的潜台词是:

  1. 只让指定身份能把 Cloud SQL 实例的数据导出到 Cloud Storage(GCS);
  2. 该身份不能登录实例、不能修改库表、不能删除备份、不能访问其他 Bucket
  3. 整个链路要满足国内跨区域访问合规(即不走公网、不暴露全局权限)。
    因此答案必须同时覆盖 IAM 权限SQL 实例级权限网络链路 三层,缺一不可。

知识点

  • IAM 最小角色:roles/storage.objectAdmin 只授予“写对象”权限,不含“删桶”“改 IAM”等高危动作;
  • IAM 条件属性:利用 resource.name 前缀 + request.time 窗口,实现“仅允许写入指定前缀的备份文件”;
  • Cloud SQL 内置服务账号:每个实例对应一个 Google 管理的服务账号(形如 service-PROJECT_NUMBER@gcp-sa-cloud-sql.iam.gserviceaccount.com),必须显式授予该账号对目标 Bucket 的 roles/storage.objectCreator
  • 用户身份分离
    数据操作者(开发者/DBA)仅持有 roles/cloudsql.editor,可触发导出作业;
    运行时身份(Cloud SQL 服务代理)负责真正写对象;
  • 国内合规加固
    – 开启 VPC-SC 服务边界,防止数据通过外网出口落到海外 Bucket;
    – 使用 Cloud SQL Auth Proxy + Private Service Connect,确保导出流量走内网;
  • 审计留痕:在 Bucket 上启用 Cloud Audit Logs 的 DATA_WRITE 日志,并绑定 Log Router 到国内 Project,满足等保 2.0 对“操作可回溯”的要求。

答案

  1. 创建专用存储分区
    gsutil mb -l asia-east1 -p myproject gs://myproject-sql-export/

  2. 授予 Cloud SQL 服务账号最小写权限
    gcloud projects add-iam-policy-binding myproject \
    --member="serviceAccount:service-123456789@gcp-sa-cloud-sql.iam.gserviceaccount.com" \
    --role="roles/storage.objectCreator" \
    --condition="expression=resource.name.startsWith('projects/_/buckets/myproject-sql-export/objects/backup/'),title=SQLExportOnly"

  3. 授予数据操作者触发权限
    gcloud projects add-iam-policy-binding myproject \
    --member="user:dev@example.com" \
    --role="roles/cloudsql.editor"

  4. 执行导出(以 MySQL 为例)
    gcloud sql export sql myinstance gs://myproject-sql-export/backup/20240613.dump \
    --database=mydb --table=orders \
    --offload=true

  5. 验证
    – 操作者无法登录实例、无法查看其他 Bucket;
    – 服务账号只能写入指定前缀,不能列出或删除对象;
    – 在 Cloud Logging 中可查看到 dev@example.com 触发了 export 作业,且目标对象写入成功。

拓展思考

  • 如果客户要求“只能导出到已加密的 Bucket,且密钥在中国境内 KMS”,应把 CMEK 密钥环创建在 asia-east1,并在 Bucket 的 IAM 条件里再加一句 resource.matchLabels.kms-key-ring=locations/asia-east1
  • 当实例开启 CMEK 加密时,Cloud SQL 服务账号还需 roles/cloudkms.cryptoKeyEncrypterDecrypter,否则导出会报 403 KmsAccessDenied;
  • 若使用 Terraform 统一治理,可把上述 IAM 绑定写成模块,通过变量 var.allowed_export_prefix 实现“一次封装,多环境复用”,避免人工误授权;
  • 多云容灾场景下,可进一步把 Bucket 配置为“双区域 asia-east1+asia-southeast1”,并通过 VPC-SC 跨边界策略限制仅中国内网 IP 可写入,既满足异地备份,又符合数据不出境的监管红线。