如何审计哪些 Cloud SQL 实例使用了指定 CMEK?
解读
在国内金融、政企客户上云场景中,**“国密合规”与“密钥自主可控”**是硬性要求。面试官抛出此题,并非单纯考察命令拼写,而是验证候选人是否:
- 理解客户管理加密密钥(CMEK)与 Google 管理密钥的区别;
- 能在多项目、多组织环境下快速定位密钥使用范围,满足内部审计与监管报备;
- 熟悉最小权限原则,避免审计本身带来额外权限放大。
因此,回答必须体现“可落地、可复现、可审计”三大特征,并给出脚本级方案,而非控制台点击路径。
知识点
- 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 最小化要求。
拓展思考
- 密钥轮换≠实例重加密:CMEK 轮换后,旧实例仍用原数据密钥,审计报告需额外标注“key version”字段,防止合规误判。
- 跨云混合场景:若客户通过Private Service Connect将本地 HSM 密钥映射至 Google KMS,需在脚本中增加 PSC endpoint 可达性检测,避免审计空转。
- Terraform 基线:建议把“disk_encryption_configuration”块作为强制策略,通过Organization Policy Constraint
constraints/sql.restrictNonCmek阻断非 CMEK 实例创建,从源头消灭审计死角。 - 实时告警:利用Log Analytics + Alerting Policy,对
protoPayload.request.diskEncryptionConfiguration.kmsKeyName不等于指定 key 的cloudsql.instances.create事件实时推送飞书/钉钉,实现审计左移。
掌握以上思路,即可在面试中由点及面展示对Google Cloud SQL 安全合规全生命周期的深刻理解,轻松拿到T4 及以上评级。