如何审计沙箱中的查询并防止数据导出?

解读

面试官真正想考察的是:在国内等保2.0与关基条例合规背景下,如何对开发/分析沙箱环境(只读或半开放 Cloud SQL 实例)做细粒度审计数据防泄漏(DLP)。沙箱场景的特点是:权限低、数据真、人员杂、出口多,既要让使用者能跑 SQL,又要让安全团队看得见、拦得住、追得回

知识点

  1. Cloud SQL Audit Plugin:基于 MySQL Enterprise Audit / pgAudit 的托管插件,日志直送Cloud Logging,字段含 user、schema、query、timestamp、IP。
  2. Cloud IAM 条件角色:利用 resource.namerequest.time 给沙箱账号绑定只读 IAM 角色,并附加“拒绝导出”条件。
  3. Cloud SQL flags:开启 --local-infile=0--secure-file-priv=NULL 禁用 SELECT … INTO OUTFILE;SQL Server 则关闭 xp_cmdshell
  4. Private Service Connect + VPC-SC:把沙箱实例划入服务边界,禁止 cloudsql.instances.exportcloudsql.instances.connect 出边界,阻断 gcloud sql export csv
  5. Data Catalog + DLP:对沙箱实例做敏感数据分级,触发“发现即脱敏”或“发现即告警”。
  6. Cloud Functions 日志钩子:在 Logging Sink 中配置实时钩子,当正则匹配到 INTO OUTFILETO GCS\copy 等关键字时,立即调用 Cloud Functions 撤销该会话连接。
  7. Cloud SQL Auth Proxy 审计模式:开启 -enable_iam_login-structured_logs,把 JWT 身份与 SQL 语句一一绑定,方便后续溯源到员工工号。
  8. 国内合规:日志留存6 个月以上,通过日志路由器转存至中国区 Cloud Storage 并加 KMS-CMEK 加密,满足等保 2.0 三级“安全审计”控制点。

答案

分三步落地:
第一步,审计无死角。在 Cloud SQL 实例级开启 pgAudit 或 MySQL Enterprise Audit,设置 pgaudit.log='all';日志通过 Cloud Logging 统一收集,Sink 到 BigQuery 做离线分析,留存 180 天。

第二步,权限最小化。沙箱账号只授予 roles/cloudsql.clientroles/cloudsql.viewer,并绑定 IAM 条件策略
request.time < timestamp('2025-07-01T00:00:00Z') && resource.name.startsWith('projects/sandbox-project')
同时关闭实例级 flag local_infilesecure_file_priv,禁用 SELECT INTO OUTFILE

第三步,出口硬隔离。把沙箱项目加入 VPC Service Controls 边界,边界策略显式拒绝 cloudsql.instances.exportstorage.buckets.create,并只开放 Private IP 访问;配合 Cloud Armor WAF 规则,拦截外网探针。

最后,用 Cloud Functions 订阅 Logging Sink,当检测到 regex=("INTO\s+OUTFILE|TO\s+GCS|\\copy") 时,立即调用 sqladmin.instances.delete 把沙箱实例自动回收,实现“查询可审计、导出即销毁”。

拓展思考

  1. 如果业务方需要临时导出样本数据做模型训练,可引入 Cloud SQL 数据脱敏+Signed URL 方案:先用 DLP 去标识化→ 写入临时 GCS 桶 → 桶绑定 Just-in-time 访问审批(JIT),30 分钟后自动过期。
  2. 对于跨区域只读副本场景,可在 北京/上海双可用区部署只读实例,通过 Cloud IAM 的 region 条件限制分析师只能连上海副本,避免数据出境风险。
  3. 未来升级到 AlloyDB for PostgreSQL 后,可启用 Column-level ACLRow-level ACL,实现行列级脱敏,进一步降低沙箱泄露面。