如何审计哪些 Cloud SQL 实例使用了指定 CMEK?

解读

在国内金融、政企客户上云场景中,**“国密合规”与“密钥自主可控”**是硬性要求。面试官抛出此题,并非单纯考察命令拼写,而是验证候选人是否:

  1. 理解客户管理加密密钥(CMEK)与 Google 管理密钥的区别
  2. 能在多项目、多组织环境下快速定位密钥使用范围,满足内部审计与监管报备
  3. 熟悉最小权限原则,避免审计本身带来额外权限放大。

因此,回答必须体现“可落地、可复现、可审计”三大特征,并给出脚本级方案,而非控制台点击路径。

知识点

  • CMEK 链路:Cloud SQL 实例 → 磁盘加密 → Google 持续使用同一 KMS key version,即使后续轮换也不会改变已加密数据密钥。
  • 资源层级:organization > folder > project > instance;审计需递归遍历
  • IAM 权限cloudsql.instances.list(项目级)、cloudkms.cryptoKeys.get(KMS 级),缺一不可
  • 关键字段:instances.list 返回的diskEncryptionConfiguration.kmsKeyName;该字段为完整资源路径,格式:projects/{kms-project}/locations/{location}/keyRings/{ring}/cryptoKeys/{key}
  • 性能陷阱:国内跨域调用易超时,需分页拉取 + 并发过滤;建议在中国香港或新加坡 region 部署 Cloud Shell降低延迟。
  • 监管输出:必须生成CSV+SHA256 校验文件,上传至客户自有 GCS 存储桶,**Bucket 启用 UBLA(统一桶级审计日志)**以备后续银保监会抽查。

答案

步骤化脚本方案(可直接在 Cloud Shell 运行,无需额外安装组件):

#!/bin/bash
# audit-cmek.sh
# 用法:bash audit-cmek.sh "projects/kms-prod/locations/asia-east2/keyRings/prod-ring/cryptoKeys/customer-key" "org-id" > report.csv

CMEK_KEY=$1
ORG_ID=$2

# 1. 枚举所有项目(含 folder 递归)
gcloud asset search-all-resources \
  --asset-types="cloudresourcemanager.googleapis.com/Project" \
  --scope="organizations/${ORG_ID}" \
  --format="value(name)" | while read proj; do
    # 2. 并行拉取实例,过滤出匹配 CMEK 的条目
    gcloud sql instances list --project="${proj##*/}" \
      --format="csv[no-heading](name,region,diskEncryptionConfiguration.kmsKeyName)" \
      --filter="diskEncryptionConfiguration.kmsKeyName=${CMEK_KEY}"
done | awk -F, -v key="$CMEK_KEY" '$3==key {print $1","$2","$3}' | \
tee report.csv | sha256sum > report.csv.sha256

# 3. 上传并设置对象级别 retention
gsutil cp report.csv report.csv.sha256 gs://customer-audit-sql/
gsutil retention event-based set gs://customer-audit-sql/report.csv

执行后,report.csv 即包含所有使用该 CMEK 的实例名称与所在区域,sha256 文件确保监管侧可验真;整个过程只读权限,符合等保 2.0 最小化要求

拓展思考

  1. 密钥轮换≠实例重加密:CMEK 轮换后,旧实例仍用原数据密钥,审计报告需额外标注“key version”字段,防止合规误判。
  2. 跨云混合场景:若客户通过Private Service Connect将本地 HSM 密钥映射至 Google KMS,需在脚本中增加 PSC endpoint 可达性检测,避免审计空转。
  3. Terraform 基线:建议把“disk_encryption_configuration”块作为强制策略,通过Organization Policy Constraint constraints/sql.restrictNonCmek 阻断非 CMEK 实例创建,从源头消灭审计死角
  4. 实时告警:利用Log Analytics + Alerting Policy,对 protoPayload.request.diskEncryptionConfiguration.kmsKeyName 不等于指定 key 的 cloudsql.instances.create 事件实时推送飞书/钉钉,实现审计左移

掌握以上思路,即可在面试中由点及面展示对Google Cloud SQL 安全合规全生命周期的深刻理解,轻松拿到T4 及以上评级