使用 OPA 在镜像晋升时校验 CVE 评分与签名

解读

在国内金融、运营商、政务云等合规场景下,镜像从“测试仓库”晋升到“生产仓库”必须通过安全门禁。OPA(Open Policy Agent)作为 CNCF 毕业的通用策略引擎,天然适合在 CI/CD 流水线“卡点”处做可编程、可审计、可热更新的准入判断。题目本质考察三件事:

  1. 如何实时获取镜像的 CVE 评分(国内常用 Trivy、阿里云 ACR 漏洞扫描、腾讯云 TCSS 等);
  2. 如何验证镜像签名(Notary v2、Cosign、Harbor 签名复制、阿里云 ACR 签名服务);
  3. 如何把这两份证据以标准化格式喂给 OPA,并写出 Rego 策略,在晋升前强制阻断不合规镜像。

面试官期望听到端到端落地细节:数据流、策略热加载、性能、灰度、审计、回滚,以及国内网络隔离环境下的离线方案

知识点

  • OPA 架构:Rego 语法、Bundle 机制、Discovery 服务、Decision Log;
  • CVE 数据源:Trivy JSON / Alicloud ACR 扫描报告 / 自研 NVD 离线库;
  • 签名格式:Cosign 的 application/vnd.dev.cosign.simplesigning.v1+json 类型、Harbor Notary v1 的 JWS、Notary v2 的 JWS with TSA;
  • 准入钩子:Harbor webhook、Jenkins 插件、GitLab CI after_script、Argo CD PreSync Hook、Tekton OPA Task;
  • 国内加速:Trivy 离线 DB(trivy-offline.db.tgz)通过 MinIO 内网分发,Cosign 验签时 --insecure-ignore-tlog 仅在内网使用;
  • 合规要求:等保 2.0 要求“高风险漏洞(CVSS≥7.0)必须在 30 天内修复”,策略需硬编码阈值
  • 审计留痕:OPA Decision Log 写入 Loki/ELK,保留 180 天,满足央行《金融科技创新监管工具》检查。

答案

  1. 整体流程
    镜像构建 → 推送到开发仓库 → 触发扫描与签名 → CI 调用 OPA /v1/data/docker/promote 接口 → OPA 返回 allow=true → 镜像复制到生产仓库

  2. CVE 评分获取
    在 CI 中运行 trivy image --format json --output result.json $IMAGE。把 result.json 作为 input.vulnerabilities 传给 OPA。Rego 片段:

    import rego.v1
    default allow := false
    cvss_threshold := 7.0
    critical_exists {
        some vuln in input.vulnerabilities
        vuln.CVSS.Score >= cvss_threshold
    }
    allow {
        not critical_exists
    }
    
  3. 签名验证
    使用 Cosign 公钥验签:

    cosign verify --key /keys/cosign.pub $IMAGE 2>&1 | jq -r '.[0].critical.identity.docker-reference'
    

    把输出中的 digest 与当前晋升的 digest 比对,比对结果作为 input.signature.verified 布尔值传入 OPA:

    allow {
        input.signature.verified == true
    }
    
  4. 合并策略
    最终 Rego 只保留一条 allow 规则:

    allow {
        not critical_exists
        input.signature.verified == true
        input.image.repository == "prod-registry.cn-shanghai.cr.aliyuncs.com"
    }
    
  5. 热更新与灰度
    把策略打成 bundle.tar.gz 放在内网 Nginx;OPA 侧配置 discovery.service=nginx:8181/bundle;修改策略后 5 秒内生效,无需重启 CI。

  6. 性能与兜底

    • 镜像 1 GB 场景下,Trivy 扫描耗时 30 s,OPA 评估 < 50 ms;
    • 若扫描服务异常,CI 设置 OPA_FAIL_CLOSED=true,直接阻断,防止“漏网之鱼”。
  7. 审计
    OPA 开启 --decision-logging,每条决策写 Kafka,下游消费到央行监管沙箱数据库,字段包含 image_digest、violated_rules、timestamp、ci_job_id

拓展思考

  • 多集群签名链:在“两地三中心”场景,生产仓库在北京、上海、深圳各一套,如何确保签名公钥一致且轮换?可引入国密 SM2 签名与 KMS(阿里云 KMS、华为云 KGS),把公钥指纹写进 OPA 策略,自动轮换时只需更新 bundle,无需改 CI。
  • 白名单豁免:业务方申请临时上线,需走OA 审批流,审批单号写进镜像 label risk.oa.no,OPA 策略读取后动态豁免 72 小时,到期自动失效。
  • 供应链扩展:未来引入 SBOM(SPDX、CycloneDX),OPA 可扩展校验“许可证合规性”(禁止 GPL-3.0 进入生产),实现安全+合规一体化门禁。