使用 OPA 策略禁止欧盟数据流入非 GDPR 区域

解读

在国内金融、电商、SaaS 等出海业务中,容器平台常把欧盟用户数据(EU Personal Data)通过微服务链路写入非 GDPR 合规区域(如北京、新加坡等可用区)。一旦数据落地到非合规区,企业将面临巨额罚款跨境传输审计风险。面试官想考察的是:

  1. 你能否在容器入口层(Ingress、Sidecar、Runtime)用OPA Gatekeeper实时策略拦截
  2. 你能否把策略与Docker 镜像元数据、K8s 标签、网络策略打通,实现可审计、可灰度、可回滚的闭环;
  3. 你能否在CI/CD 阶段提前扫描镜像,把不合规的GDPR 标签缺失镜像直接挡在仓库之外,避免“带病上线”。

知识点

  1. OPA/Rego 语法:package、import、deny[msg] 规则、default allow = false。
  2. Gatekeeper 架构:ConstraintTemplate → Constraint → Audit → Sync;Admission WebhookDocker 容器运行时的交互顺序。
  3. GDPR 数据识别
    • 镜像层 ENV 里出现 EU_DATA_CLASS=personal
    • 容器启动参数带 --region=eu-central-1
    • 网络出口 IP 属于 GEO-IP EU 网段。
  4. Docker 多阶段构建:在最后阶段non-root:65535 用户,并把 LABEL gdpr.data=true 写进镜像元数据,供 OPA 读取。
  5. Harbor 镜像策略:在 CI 阶段opa-docker-authz 插件做 docker push 预检,拒绝未打 GDPR 标签的镜像进入生产仓库。
  6. 灰度发布:用 K8s Namespace 标签 gdpr-zone=eu-only,结合 OPA 参数化约束,支持白名单账号临时放行,方便压测。
  7. 审计与证据:Gatekeeper 的 Audit Pod 每 60 秒同步一次集群状态,把违规记录写入 Elasticsearch,供等保/GDPR 审计出具报告。

答案

  1. 镜像侧:
    在 Dockerfile 末尾加入:

    LABEL gdpr.data="true"
    LABEL data.classification="eu-personal"
    USER 65535
    

    通过 docker buildx --label 强制校验,确保不带标签的镜像无法推入 Harbor 生产项目

  2. 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 字段做成参数化,方便国内多可用区复用。

  3. 部署:

    kubectl apply -f constraint-template.yaml
    kubectl apply -f block-eu-data-constraint.yaml   # 参数指定 region 列表
    

    启用 Gatekeeper 同步缓存,保证离线审计也能查到历史违规。

  4. 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 集群

  5. 运行时二次校验:
    在 Istio Sidecar 的 Envoy External Authorization 调用同一份 Rego,阻断 HTTP Header 带 X-EU-Data=true 的流量流向非 EU 区域 Pod,实现双保险

  6. 应急回滚:
    给 Constraint 加 namespaceSelector emergency.gdpr/override: true,值班账号在 PagerDuty 收到告警后,30 秒内通过 kubectl label ns prod emergency.gdpr/override=true 临时放行,事后必须补审计报告

拓展思考

  1. 多集群联邦场景:国内主集群与欧盟边缘集群通过 KubeFed 统一管理,OPA 策略需同步到边缘 Gatekeeper,防止 EU 数据通过 Cluster-API 迁移到北京可用区。
  2. 机密计算增强:把 EU 数据容器跑在 AMD SEV-ESIntel TDX 加密内存节点上,OPA 策略再加一条 annotation checkconfidential-computing=true非机密节点直接拒绝调度
  3. 服务网格级联:当 EU 数据通过 Kafka 跨区复制时,OPA 需与 Strimzi Topic Operator 集成,在 Topic CR 里加 gdpr.classification 字段,同步拦截非合规副本
  4. 国内合规对冲:若未来中国数据出境条例进一步收紧,同一套 OPA 框架可快速把 region 参数换成 cn-strict,实现一套代码,双向合规