在 Harbor 2.11 中配置策略阻止未签名镜像
解读
国内金融、运营商、政务云等场景对镜像供应链安全有强合规要求,Harbor 作为 CNCF 毕业项目,被大量企业私有化部署。面试官问“如何阻止未签名镜像”,实质考察三点:
- 是否理解 Notary/Notation 两套签名机制在 Harbor 2.11 中的差异;
- 能否在 项目级策略 与 系统级策略 之间做权衡,兼顾存量业务;
- 是否具备灰度落地与故障回滚意识,避免“一刀切”导致生产 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 审计平台。
答案
-
前置准备
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 -
项目级灰度开启
登录 Harbor UI → 选择项目 prod → 策略 → 勾选 “阻止未签名镜像” → 仅对 latest 标签 生效,其余标签放行,先观察一周。 -
系统级强制
确认无业务异常后,由系统管理员进入 “配置管理 → 系统级部署安全” 打开 “强制签名” 并选择 “Notation” 作为验证引擎,保存即实时生效。 -
验证
本地未签名镜像推送测试:
docker push $REG/prod/app:unsigned
返回 412 signature verification failed 即策略生效。 -
回滚
若发现大量旧版本未签名镜像需要紧急回滚,可在项目策略里关闭开关,30 秒内恢复推送,无需重启 Harbor。
拓展思考
- 双引擎并存:Harbor 2.11 支持 Notary v1 与 Notation 同时验证,如何为存量 Notary 镜像写 “兼容策略” 避免重复签名?
- OCI 1.1 referrers API:Harbor 已默认开启,可让签名数据与镜像放在同一存储,显著降低国内跨机房复制带宽,如何评估其对 现有 CDN 缓存命中率 的影响?
- 供应链级别:国内监管正在试点 “镜像 SBOM + 签名” 双轨制,Harbor 后续版本计划把 SBOM 作为附件签名,如何提前在 CI 中集成 syft + cosign 生成并推送 SBOM,以便 Harbor 侧一键校验?