备份导出到 Cloud Storage 时,如何启用客户提供的加密密钥 (CSEK)?
解读
在国内面试中,这道题考察的是“数据主权”与“合规”两大痛点:
- 金融、政企客户要求密钥自持,Google 托管密钥(CMEK)仍不满足监管;
- 备份文件落盘在海外 Region 的 Cloud Storage,必须用 CSEK 才能通过数据出境安全评估。
面试官想确认你是否理解:
- Cloud SQL 导出本质是临时实例→gcs_export→Cloud Storage 的流水线;
- CSEK 只在最终落盘那一刻生效,临时实例本身仍由 Google 内部密钥加密;
- 整个流程必须全 CLI 或 Terraform 完成,Console 界面无法直接填 CSEK。
知识点
- CSEK 与 CMEK 区别:CSEK 由客户自行生成并保管 RSA 密钥,Google 内存只保留密钥指纹,不落盘;CMEK 由 Cloud KMS 托管,仍属 Google 托管域。
- Cloud SQL 导出接口:底层调用 gcs_export 作业,支持在请求体里注入 encryptionOptions 字段。
- 密钥格式:必须是 256-bit 的 AES 密钥,用客户 RSA 公钥以 OAEP-SHA256 包裹后 base64 编码,再随请求上传。
- IAM 要求:
- 执行导出的服务账号需roles/cloudsql.admin;
- 对目标 Cloud Storage 桶需roles/storage.objectAdmin;
- 无需对 KMS 授权,因为 CSEK 不走 KMS。
- 国内网络补充:若使用Cloud SQL Auth Proxy 通过 VPC-SC 边界,需把导出流量放行至 storage.googleapis.com 的 CSEK 专用 endpoint,否则会上传成功但加密失败。
答案
步骤如下(以 PostgreSQL 为例,MySQL/SQL Server 完全一致):
- 本地生成 256-bit AES 密钥:
openssl rand -out aes256.key 32 - 用客户 RSA 公钥(假设为 customer_public.pem)包裹 AES 密钥:
openssl rsautl -encrypt -oaep -pubin -inkey customer_public.pem -in aes256.key -out aes256.key.enc
base64 -w0 aes256.key.enc > wrapped_key.txt - 准备导出请求 JSON:
{ "exportContext": { "kind": "sql#exportContext", "fileType": "SQL", "uri": "gs://<bucket>/backup-2025.sql.gz", "databases": ["mydb"], "encryptionOptions": { "encryptionKey": "$(cat wrapped_key.txt)", "encryptionType": "CUSTOMER_MANAGED" } } } - 调用 REST(或 gcloud 封装):
gcloud sql export sql <instance> gs://<bucket>/backup-2025.sql.gz
--database=mydb
--encryption-key=$(cat wrapped_key.txt)
--encryption-key-type=CUSTOMER_MANAGED
国内 Region 若走 VPC-SC,需加 --impersonate-service-account 指定国内服务账号,避免走默认 Google 全球账号被 VPC-SC 拦截。 - 验证:
gsutil stat gs://<bucket>/backup-2025.sql.gz
输出中 CustomerEncryption.KeySha256 字段存在且值等于本地 AES 密钥的 SHA256,即证明 CSEK 生效。
拓展思考
- 恢复时如何解密:
必须把同一个 AES 密钥用客户RSA 私钥解开,然后在 importContext.encryptionOptions 里原样传入,否则 Cloud SQL 无法读取备份。 - 密钥轮换策略:
CSEK 本身不支持轮换,每次导出都使用全新 AES 密钥,但 RSA 密钥对可定期轮换;老备份仍用老 AES 密钥,需独立归档对应私钥。 - 与国内多云混合场景结合:
若客户要求双备份(一份存 Google Cloud Storage+CSEK,一份回流至阿里云 OSS+KMS),可在导出完成后用 Cloud Storage Trigger→Cloud Functions→阿里云 OSS API 做二次上传,但需在中国境内完成跨境数据评估并保留 CSEK 解密能力,否则审计时会被认定为不可控数据出境。