如何审计沙箱中的查询并防止数据导出?
解读
面试官真正想考察的是:在国内等保2.0与关基条例合规背景下,如何对开发/分析沙箱环境(只读或半开放 Cloud SQL 实例)做细粒度审计与数据防泄漏(DLP)。沙箱场景的特点是:权限低、数据真、人员杂、出口多,既要让使用者能跑 SQL,又要让安全团队看得见、拦得住、追得回。
知识点
- Cloud SQL Audit Plugin:基于 MySQL Enterprise Audit / pgAudit 的托管插件,日志直送Cloud Logging,字段含 user、schema、query、timestamp、IP。
- Cloud IAM 条件角色:利用
resource.name与request.time给沙箱账号绑定只读 IAM 角色,并附加“拒绝导出”条件。 - Cloud SQL flags:开启
--local-infile=0、--secure-file-priv=NULL禁用SELECT … INTO OUTFILE;SQL Server 则关闭xp_cmdshell。 - Private Service Connect + VPC-SC:把沙箱实例划入服务边界,禁止
cloudsql.instances.export与cloudsql.instances.connect出边界,阻断gcloud sql export csv。 - Data Catalog + DLP:对沙箱实例做敏感数据分级,触发“发现即脱敏”或“发现即告警”。
- Cloud Functions 日志钩子:在 Logging Sink 中配置实时钩子,当正则匹配到
INTO OUTFILE、TO GCS、\copy等关键字时,立即调用 Cloud Functions 撤销该会话连接。 - Cloud SQL Auth Proxy 审计模式:开启
-enable_iam_login与-structured_logs,把 JWT 身份与 SQL 语句一一绑定,方便后续溯源到员工工号。 - 国内合规:日志留存6 个月以上,通过日志路由器转存至中国区 Cloud Storage 并加 KMS-CMEK 加密,满足等保 2.0 三级“安全审计”控制点。
答案
分三步落地:
第一步,审计无死角。在 Cloud SQL 实例级开启 pgAudit 或 MySQL Enterprise Audit,设置 pgaudit.log='all';日志通过 Cloud Logging 统一收集,Sink 到 BigQuery 做离线分析,留存 180 天。
第二步,权限最小化。沙箱账号只授予 roles/cloudsql.client 与 roles/cloudsql.viewer,并绑定 IAM 条件策略:
request.time < timestamp('2025-07-01T00:00:00Z') && resource.name.startsWith('projects/sandbox-project')
同时关闭实例级 flag local_infile 与 secure_file_priv,禁用 SELECT INTO OUTFILE。
第三步,出口硬隔离。把沙箱项目加入 VPC Service Controls 边界,边界策略显式拒绝 cloudsql.instances.export 与 storage.buckets.create,并只开放 Private IP 访问;配合 Cloud Armor WAF 规则,拦截外网探针。
最后,用 Cloud Functions 订阅 Logging Sink,当检测到 regex=("INTO\s+OUTFILE|TO\s+GCS|\\copy") 时,立即调用 sqladmin.instances.delete 把沙箱实例自动回收,实现“查询可审计、导出即销毁”。
拓展思考
- 如果业务方需要临时导出样本数据做模型训练,可引入 Cloud SQL 数据脱敏+Signed URL 方案:先用 DLP 去标识化→ 写入临时 GCS 桶 → 桶绑定 Just-in-time 访问审批(JIT),30 分钟后自动过期。
- 对于跨区域只读副本场景,可在 北京/上海双可用区部署只读实例,通过 Cloud IAM 的 region 条件限制分析师只能连上海副本,避免数据出境风险。
- 未来升级到 AlloyDB for PostgreSQL 后,可启用 Column-level ACL 与 Row-level ACL,实现行列级脱敏,进一步降低沙箱泄露面。