使用 OPA 策略禁止欧盟数据流入非 GDPR 区域
解读
在国内金融、电商、SaaS 等出海业务中,容器平台常把欧盟用户数据(EU Personal Data)通过微服务链路写入非 GDPR 合规区域(如北京、新加坡等可用区)。一旦数据落地到非合规区,企业将面临巨额罚款与跨境传输审计风险。面试官想考察的是:
- 你能否在容器入口层(Ingress、Sidecar、Runtime)用OPA Gatekeeper做实时策略拦截;
- 你能否把策略与Docker 镜像元数据、K8s 标签、网络策略打通,实现可审计、可灰度、可回滚的闭环;
- 你能否在CI/CD 阶段提前扫描镜像,把不合规的GDPR 标签缺失镜像直接挡在仓库之外,避免“带病上线”。
知识点
- OPA/Rego 语法:package、import、deny[msg] 规则、default allow = false。
- Gatekeeper 架构:ConstraintTemplate → Constraint → Audit → Sync;Admission Webhook 与Docker 容器运行时的交互顺序。
- GDPR 数据识别:
- 镜像层 ENV 里出现 EU_DATA_CLASS=personal;
- 容器启动参数带 --region=eu-central-1;
- 网络出口 IP 属于 GEO-IP EU 网段。
- Docker 多阶段构建:在最后阶段用 non-root:65535 用户,并把 LABEL gdpr.data=true 写进镜像元数据,供 OPA 读取。
- Harbor 镜像策略:在 CI 阶段用 opa-docker-authz 插件做
docker push预检,拒绝未打 GDPR 标签的镜像进入生产仓库。 - 灰度发布:用 K8s Namespace 标签
gdpr-zone=eu-only,结合 OPA 参数化约束,支持白名单账号临时放行,方便压测。 - 审计与证据:Gatekeeper 的 Audit Pod 每 60 秒同步一次集群状态,把违规记录写入 Elasticsearch,供等保/GDPR 审计出具报告。
答案
-
镜像侧:
在 Dockerfile 末尾加入:LABEL gdpr.data="true" LABEL data.classification="eu-personal" USER 65535通过
docker buildx --label强制校验,确保不带标签的镜像无法推入 Harbor 生产项目。 -
OPA ConstraintTemplate(核心 Rego):
package k8sblock_eu_data import rego.v1 deny[msg] { input.request.kind.kind == "Pod" input.request.object.metadata.labels["gdpr-zone"] == "eu-only" input.request.object.spec.nodeSelector["topology.kubernetes.io/region"] != "eu-central-1" msg := "EU personal data Pod scheduled to non-GDPR region" }把 region 字段做成参数化,方便国内多可用区复用。
-
部署:
kubectl apply -f constraint-template.yaml kubectl apply -f block-eu-data-constraint.yaml # 参数指定 region 列表启用 Gatekeeper 同步缓存,保证离线审计也能查到历史违规。
-
CI/CD 集成:
在 GitLab-CI 的docker-push阶段,用 opa-docker-authz 插件做docker push预检:docker run --rm -v $(pwd)/policy:/policy openpolicyagent/opa:0.61 eval -d /policy -i input.json "data.docker.authz.allow"若返回 false,直接 fail pipeline,不进 K8s 集群。
-
运行时二次校验:
在 Istio Sidecar 的 Envoy External Authorization 调用同一份 Rego,阻断 HTTP Header 带 X-EU-Data=true 的流量流向非 EU 区域 Pod,实现双保险。 -
应急回滚:
给 Constraint 加 namespaceSelectoremergency.gdpr/override: true,值班账号在 PagerDuty 收到告警后,30 秒内通过kubectl label ns prod emergency.gdpr/override=true临时放行,事后必须补审计报告。
拓展思考
- 多集群联邦场景:国内主集群与欧盟边缘集群通过 KubeFed 统一管理,OPA 策略需同步到边缘 Gatekeeper,防止 EU 数据通过 Cluster-API 迁移到北京可用区。
- 机密计算增强:把 EU 数据容器跑在 AMD SEV-ES 或 Intel TDX 加密内存节点上,OPA 策略再加一条 annotation check:
confidential-computing=true,非机密节点直接拒绝调度。 - 服务网格级联:当 EU 数据通过 Kafka 跨区复制时,OPA 需与 Strimzi Topic Operator 集成,在 Topic CR 里加
gdpr.classification字段,同步拦截非合规副本。 - 国内合规对冲:若未来中国数据出境条例进一步收紧,同一套 OPA 框架可快速把 region 参数换成
cn-strict,实现一套代码,双向合规。