如何限制仅指定子网可访问 Cloud SQL 实例?
解读
在国内政企、金融类面试中,考官真正想验证的是:
- 你是否理解中国境内合规要求(如等保 2.0 对数据库“网络边界隔离”条款);
- 你是否能把 Cloud SQL 的全球产品能力落地到国内实际网络拓扑(含 VPC、专线、CMEK、IAM 等);
- 你能否在零公网场景下给出可灰度、可审计、可回滚的完整方案。
因此,回答必须围绕“Private IP Only + 子网级 ACL + IAM 最小权限 + 审计”四件套展开,并主动提及北京/上海/深圳地域的 VPC 特性差异。
知识点
- Private Service Connect(PSC)与 RFC 1918 子网:Cloud SQL 在国内地域仅暴露内部负载均衡器,通过 PSC 把实例“挂载”到用户 VPC 的指定子网 CIDR。
- VPC 网络防火墙规则:优先级 1000 以内,拒绝所有 0.0.0.0/0,再按高优先级放行指定子网 CIDR(如 10.7.128.0/24)。
- Cloud SQL 授权网络白名单:即使开启 Private IP,也必须在控制台或 Terraform 里显式填入子网 CIDR,否则实例侧仍拒绝连接。
- Cloud SQL Auth Proxy 的 –private-ip 参数:在国内常用专线+CCAE 接入,强制代理只走内网 DNS 解析,避免 proxy 误走公网。
- IAM 条件属性:利用resource.service 和request.network 条件,把 sqladmin 权限限定在指定 VPC 子网的 VM 上。
- 等保审计:开启Cloud Audit Logs 的 DATA_WRITE 与 POLICY_DENIED,并配置Log Router 到国内 CMEK 加密的 BigQuery 数据集,满足 6 个月留存。
答案
分五步落地,全部可在北京/上海地域复现:
- 创建仅 Private IP 的 Cloud SQL 实例,禁用公网 IP;在“关联 VPC”步骤选择目标 VPC 网络(如 vpc-prod-beijing)。
- 在VPC 网络 -> 私有服务连接页面,为 Cloud SQL 分配已规划的子网(如 10.7.128.0/24),并记录内部 DNS 名称(格式为 project-id:region:instance-id)。
- 编写高优先级防火墙规则:
- 名称 allow-cloudsql-beijing-subnet
- 方向 Ingress
- 目标标签 cloudsql-client
- 源 CIDR 10.7.128.0/24
- 协议 TCP 3307(MySQL/PostgreSQL 统一端口)
- 优先级 990
随后追加默认拒绝 0.0.0.0/0 优先级 1000,确保白名单以外全部阻断。
- 在 Cloud SQL 控制台“连接 -> 授权网络”里,仅添加 10.7.128.0/24,不勾选“允许 Google 服务”;通过 Terraform 可写成
authorized_networks = [{ value = “10.7.128.0/24”, expiration_time = null }]
实现基础设施即代码与版本可追溯。 - 授予最小 IAM:
- 对运维组绑定 roles/cloudsql.client,并加条件
resource.service == “sqladmin.googleapis.com” &&
request.network == “//compute.googleapis.com/projects/proj/global/networks/vpc-prod-beijing/subnetworks/beijing-subnet-128” - 对 CI/CD 账号仅授予 roles/cloudsql.editor,移除 roles/owner,防止横向越权。
最终效果:只有 10.7.128.0/24 子网内的 VM 或容器,通过 Private IP + Auth Proxy 才能访问 Cloud SQL,公网侧 0 SYN 包可达,IAM 审计日志实时入湖,满足国内等保三级系统评审要求。
- 对运维组绑定 roles/cloudsql.client,并加条件
拓展思考
- 双地域冷备场景:若业务需北京主库 + 上海灾备,可在上海 VPC 再划独立子网 10.8.128.0/24,通过VPC Peering + Private Service Connect 跨地域转发,同样用子网级防火墙 + IAM 条件做隔离,实现合规容灾而不暴露公网。
- Serverless 接入:国内 Cloud Run 函数默认走公网出口,需挂载 VPC Connector 到 10.7.128.0/28 子网,并设置egress=private-ranges-only,才能继承同一套子网 ACL,否则会被防火墙丢弃。
- 灰度演练:利用Terraform workspace 先创建临时子网 10.7.129.0/24,授权后做混沌工程(如关闭主库 HA),验证子网级熔断与审计告警是否及时,演练完成一键销毁,避免脏 IP 残留。