如何记录并审计迁移过程中的所有 DDL?
解读
在国内金融、政企、互联网大厂做 Cloud SQL 迁移时,监管与内审往往要求“每一次结构变更都可追溯、可回放、可责任人定位”。问题表面问“记录 DDL”,实质考察三件事:
- 能否让 Cloud SQL 自身不丢日志;
- 能否把 多方入口(控制台、CLI、Terraform、DMS、业务账号)统一收口;
- 能否把 日志长期低成本留存并对接国内审计系统(如等保 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 与授权账号。
答案
- 在组织级开启 data access audit(cloudsql.googleapis.com/data_access),确保 Cloud SQL 的每一次 DDL 都会生成 ADMIN_READ 或 DATA_WRITE 类型的 audit log;
- 创建 Log Router Sink,过滤条件示例:
把命中日志 实时写入 BigQuery 数据集(分区表按天),并 同时导出到 Cloud Storage 多区域冷线桶,设置 30 天转冷存储、365 天锁桶;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 内建立 DDL 审计视图,字段包括:timestamp、principalEmail、instance、database、ddlSql、clientIp、requestId,每日调度对比前一日哈希,确保链式完整性;
- 把 BigQuery 视图通过 DataStudio/Superset 开放给审计部,支持按工单号、责任人、时间窗回滚任意 DDL;
- 对生产项目关闭 public ip,强制 Cloud SQL Auth Proxy + IAM 鉴权,杜绝绕过审计的本地直连;
- 在 CICD 流水线(GitLab-CI 或云效)里,所有 DDL 以版本化 SQL 文件提交,合并请求触发 Terraform Cloud-Build,Build 日志与 audit log 通过统一 TraceId 串联,实现“代码-发布-日志”三位一体;
- 每季度运行 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 做交叉校验,防止 单通道被篡改。