适用场景
本文适用于使用 Harbor 管理 Docker 与 Kubernetes 镜像的企业团队。当镜像仓库暴露在公网、多人共用管理员账号、镜像推送后无漏洞扫描、K8s 集群使用个人账号拉取镜像时,均存在镜像供应链投毒、未授权访问与恶意镜像入库风险。以下加固配置适用于 Harbor 2.x 及以上版本。
前置条件
- 已部署 Harbor 2.x(docker-compose 或 Helm 方式),具备管理员权限
- 可编辑
harbor.yml配置文件并重新执行安装脚本 - Kubernetes 集群可访问该镜像仓库,具备创建 Secret 权限
原理说明
Harbor 的安全能力由四部分组成:传输层(HTTPS 加密防流量窃听)、认证层(RBAC 角色与 Robot 账号最小权限)、检测层(内置 Trivy 漏洞扫描与 CVE 白名单)、完整性层(cosign/Notation 镜像签名校验)。供应链攻击的典型路径是:攻击者破解弱口令仓库 → 上传含后门的镜像 → 集群拉取执行。通过强制扫描阻断恶意镜像入库、签名校验防止镜像被篡改、Robot 账号隔离拉取凭据,可系统性收敛风险。
操作步骤
第一步:启用 HTTPS 加密传输
编辑 harbor.yml,配置证书与私钥:
hostname: harbor.example.com
https:
port: 443
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key
http:
port: 80
# 仅内网使用时可禁用 HTTP
# enabled: false
执行 ./install.sh 使配置生效。生产环境证书建议使用 Let’s Encrypt 或企业 CA,避免客户端证书信任问题。
第二步:开启 Trivy 漏洞扫描与阻断策略
在 Harbor 管理界面:项目 → 配置 → 安全,勾选以下选项:
- 自动扫描镜像(Automatically scan images on push):镜像推送后立即扫描
- 阻止存在高危/严重漏洞的镜像(Prevent images with vulnerabilities):按严重级别阈值阻断不可信镜像入库
- 设置 CVE 白名单:仅对确认无风险的历史 CVE 放行
第三步:配置 Robot 账号供 K8s 集群拉取
避免在集群中使用个人账号,为每个命名空间创建 Robot 账号,仅授予对应项目的 pull 权限:
# 在 Harbor UI:项目 → Robot Accounts → New Robot Account
# 权限仅勾选 push / pull,保存后复制生成的 token
# 集群侧创建拉取凭据 Secret
kubectl create secret docker-registry harbor-pull \
--docker-server=harbor.example.com \
--docker-username='robot$prod' \
--docker-password='' \
--namespace=prod
# Deployment 中引用
kubectl patch deployment app -n prod -p '{"spec":{"template":{"spec":{"imagePullSecrets":[{"name":"harbor-pull"}]}}}}'
第四步:启用镜像签名校验
使用 cosign 对镜像签名,并在 Harbor 项目配置中启用签名验证:
# 生成密钥对并签名
cosign generate-key-pair
cosign sign --key cosign.key harbor.example.com/prod/app:1.0.0
# 项目 → 配置 → 安全 → 开启 'Verify image signatures with cosign/Notation'
# 未签名的镜像将无法被拉取部署
第五步:配置保留策略与审计
清理未使用镜像并保留审计日志:
# 项目 → Configuration → Retention Policy
# 规则示例:保留最近 30 天、最近 10 个标签的镜像,其余清理
# 审计:检查未授权访问尝试
grep -i "401\|unauthorized" /var/log/harbor/core/*.log | tail -50
配置验证
# 1. 验证 HTTPS 访问
curl -k -u admin: https://harbor.example.com/api/v2.0/projects
# 2. 验证扫描阻断:推送含高危漏洞镜像应被拒绝或标记
docker push harbor.example.com/prod/bad-image:1.0
# 3. 验证 Robot 账号:仅 pull 权限,push 应返回 403
docker login harbor.example.com -u 'robot$prod' -p ''
docker push harbor.example.com/prod/app:test # 预期 403
常见问题
Q1:扫描发现高危漏洞但业务急需上线,如何处理?
在项目 CVE 白名单中临时放行并记录审批人、原因与时间,业务窗口后立即修复并重新推送。放行必须留痕,建议结合工单系统形成闭环。
Q2:Robot 账号与个人账号有什么区别?
Robot 账号只能访问指定项目、权限可精确到 push/pull、不可登录 Web UI、密钥可随时轮换,泄露影响面小。个人账号权限大且与人员绑定,不应出现在集群 Secret 中。
Q3:离线内网环境无法更新 Trivy 漏洞库怎么办?
可在能联网的机器上预下载漏洞库离线包,通过 trivy image --offline-scan 或 Harbor 的漏洞库导入机制更新;也可配置企业内网代理指向官方漏洞库镜像源。
总结
Harbor 安全加固的核心是 HTTPS 传输 + RBAC 最小权限 + 强制漏洞扫描 + 镜像签名。将镜像仓库纳入供应链安全管理体系,配合 CI/CD 流水线在构建阶段即执行扫描与签名,才能从源头阻断恶意镜像进入生产集群,构建完整的容器镜像信任链。