如何记录并审计迁移过程中的所有 DDL?

解读

在国内金融、政企、互联网大厂做 Cloud SQL 迁移时,监管与内审往往要求“每一次结构变更都可追溯、可回放、可责任人定位”。问题表面问“记录 DDL”,实质考察三件事:

  1. 能否让 Cloud SQL 自身不丢日志
  2. 能否把 多方入口(控制台、CLI、Terraform、DMS、业务账号)统一收口
  3. 能否把 日志长期低成本留存并对接国内审计系统(如等保 2.0、银保监会检查)

知识点

  • Cloud SQL 审计模型:实例级 audit_log 由 Cloud Audit Logs 产生,包含 admin 与 data 两类;只有 admin 活动(create、patch、delete 实例)默认记录,data 活动(SELECT、DDL、DML)需显式开启 data access audit
  • data access audit 开启位置:在项目或组织层的 IAM & Admin → Audit Logs 中勾选 cloudsql.googleapis.com/data_access
  • 日志落地方案:审计日志可实时 写入 Cloud Logging 的 _Default 或自定义桶,再通过 Log Router 同步到 BigQuery、Pub/Sub、Cloud Storage 或第三方 SIEM(如阿里云日志服务、腾讯云 CLS)
  • DDL 识别技巧:在 BigQuery 中可用 proto_payload.method_name="cloudsql.instances.query"textPayload =~ r/(?i)\b(CREATE|ALTER|DROP|TRUNCATE|RENAME)\b/ 过滤;
  • 性能与成本:开启 data access audit 会显著增加日志量,国内项目需 提前评估 Log Storage 计费并设置 排除规则(如过滤掉只读账号的 SELECT);
  • 多云合规:若客户要求 6 个月以上不可篡改,需把 Cloud Storage 桶设置 Bucket Lock(保留策略 + 事件持有),并 每季度做 SHA-256 摘要存证
  • 责任分离:建议 DDL 统一走 CICD 账号,该账号仅拥有 cloudsql.editor + 日志查看角色,禁止个人账号直连;
  • Terraform 痕迹:所有 IaC 变更同样产生 audit log,methodName="cloudsql.instances.patch" 可追踪 schema 变更的调用者 IP 与授权账号。

答案

  1. 在组织级开启 data access audit(cloudsql.googleapis.com/data_access),确保 Cloud SQL 的每一次 DDL 都会生成 ADMIN_READ 或 DATA_WRITE 类型的 audit log
  2. 创建 Log Router Sink,过滤条件示例:
    resource.type="cloudsql_database"
    proto_payload.method_name="cloudsql.instances.query"
    severity!="INFO"
    proto_payload.request.sql =~ r/(?i)\b(CREATE|ALTER|DROP|TRUNCATE|RENAME)\b/
    
    把命中日志 实时写入 BigQuery 数据集(分区表按天),并 同时导出到 Cloud Storage 多区域冷线桶,设置 30 天转冷存储、365 天锁桶
  3. 在 BigQuery 内建立 DDL 审计视图,字段包括:timestamp、principalEmail、instance、database、ddlSql、clientIp、requestId,每日调度对比前一日哈希,确保链式完整性
  4. 把 BigQuery 视图通过 DataStudio/Superset 开放给审计部,支持按工单号、责任人、时间窗回滚任意 DDL
  5. 对生产项目关闭 public ip,强制 Cloud SQL Auth Proxy + IAM 鉴权,杜绝绕过审计的本地直连;
  6. 在 CICD 流水线(GitLab-CI 或云效)里,所有 DDL 以版本化 SQL 文件提交,合并请求触发 Terraform Cloud-Build,Build 日志与 audit log 通过统一 TraceId 串联,实现“代码-发布-日志”三位一体;
  7. 每季度运行 Cloud DLP 扫描审计桶敏感表结构(如身份证、银行卡字段)变更自动打标签,并触发 SecOps 工单,满足国内等保对“重要数据变更审批”要求。

拓展思考

  • 如果客户要求 跨云双活,可 把 Pub/Sub 日志实时转发到阿里云 SLS,利用 Logtail 插件做字段脱敏后再入湖,实现 多云日志格式统一
  • 高频在线 DDL(pt-osc、gh-ost),建议 在 Cloud SQL 外层的 Compute Engine 跳板机执行跳板机 OSLogin 日志 + Cloud Audit Logs 双写,避免 工具自身产生大量匿名连接导致审计缺口;
  • 未来 Cloud SQL 若支持 mysql.general_log 导出到 Cloud Logging,可 关闭 data access audit,改用 原生 general_log 减少 30% 日志费用,但需验证 general_log 是否包含 IAM 身份字段
  • 审计日志的 BigQuery 分区表可开启 CMEK(客户管理的密钥),满足 国密合规场景
  • 对于 PostgreSQL 引擎,可 额外打开 pgaudit 扩展pgaudit.log='ddl' 输出到 stderr,stderr 由 Cloud Logging Agent 自动收集,与 Cloud Audit Logs 做交叉校验,防止 单通道被篡改