在 Harbor 2.11 中配置策略阻止未签名镜像

解读

国内金融、运营商、政务云等场景对镜像供应链安全有强合规要求,Harbor 作为 CNCF 毕业项目,被大量企业私有化部署。面试官问“如何阻止未签名镜像”,实质考察三点:

  1. 是否理解 Notary/Notation 两套签名机制在 Harbor 2.11 中的差异;
  2. 能否在 项目级策略系统级策略 之间做权衡,兼顾存量业务;
  3. 是否具备灰度落地与故障回滚意识,避免“一刀切”导致生产 CI/CD 中断。
    回答时要体现“先验证、后强制”的国内合规落地节奏,并给出可回滚方案。

知识点

  • Harbor 2.11 默认集成 Notation (CNCF 新一代签名规范),兼容 Notary v1 但不再主动维护;
  • “项目配置 → 策略 → 部署安全”三级开关:项目可单独开启“阻止未签名镜像”,也可由系统管理员在 配置管理 → 系统策略 里统一强制;
  • 签名验证触发点:core 组件在收到 docker push 后的 v2/validate 钩子中调用 notation-verify,返回 412 Precondition Failed 即拒绝;
  • 证书链信任锚:需把公司根证书写入 /etc/harbor/notation/truststore/x509/ca/,否则验证失败会被误判为“未签名”;
  • 灰度方案:利用 Harbor 的“复制策略 + 标签过滤器”先把未签名镜像同步到测试仓库,生产仓库开启强制签名,实现“双库分流”;
  • 回滚手段:关闭项目级“阻止未签名镜像”开关即可秒级回滚,无需重启容器;
  • 审计留痕:所有拒绝事件写入 core.log 并可通过 harbor-exporter 暴露为 Prometheus 指标,方便对接国内等保 2.0 审计平台。

答案

  1. 前置准备
    a) 在运维侧把公司根证书导入 Harbor 所有节点:
    notation cert add --type ca --store company-ca company-root.crt
    b) 给 CI 服务器签发一对“CI 签名证书”,并导入 notation 私钥:
    notation key add --name cicd --plugin akv --id ...
    c) 在 CI 阶段对镜像签名并推送:
    notation sign --key cicd $REG/$PROJECT/$IMAGE:$TAG

  2. 项目级灰度开启
    登录 Harbor UI → 选择项目 prod → 策略 → 勾选 “阻止未签名镜像” → 仅对 latest 标签 生效,其余标签放行,先观察一周。

  3. 系统级强制
    确认无业务异常后,由系统管理员进入 “配置管理 → 系统级部署安全” 打开 “强制签名” 并选择 “Notation” 作为验证引擎,保存即实时生效。

  4. 验证
    本地未签名镜像推送测试:
    docker push $REG/prod/app:unsigned
    返回 412 signature verification failed 即策略生效。

  5. 回滚
    若发现大量旧版本未签名镜像需要紧急回滚,可在项目策略里关闭开关,30 秒内恢复推送,无需重启 Harbor。

拓展思考

  • 双引擎并存:Harbor 2.11 支持 Notary v1 与 Notation 同时验证,如何为存量 Notary 镜像写 “兼容策略” 避免重复签名?
  • OCI 1.1 referrers API:Harbor 已默认开启,可让签名数据与镜像放在同一存储,显著降低国内跨机房复制带宽,如何评估其对 现有 CDN 缓存命中率 的影响?
  • 供应链级别:国内监管正在试点 “镜像 SBOM + 签名” 双轨制,Harbor 后续版本计划把 SBOM 作为附件签名,如何提前在 CI 中集成 syft + cosign 生成并推送 SBOM,以便 Harbor 侧一键校验?