Harbor是CNCF毕业级的容器镜像仓库项目,除了基础的镜像存储和分发功能外,还提供镜像漏洞扫描、签名验证、多租户访问控制等安全特性。在DevOps流水线中,私有镜像仓库是容器化部署的核心基础设施。本文围绕Harbor的部署配置、Trivy漏洞扫描集成以及镜像安全策略展开。
Harbor私有仓库架构与组件说明
Harbor采用微服务架构,核心组件包括:Portal(Web管理界面)、Core(API服务与元数据存储)、Registry(基于Docker Distribution的镜像存储后端)、JobService(异步任务处理,如镜像复制)、Trivy Adapter(漏洞扫描适配器)、ChartMuseum(Helm Chart存储)。
数据存储层面,Harbor使用PostgreSQL存储项目、用户、策略等元数据,Redis作为缓存和任务队列,对象存储(S3/MinIO/文件系统)存储镜像层数据。生产环境建议将PostgreSQL和Redis独立部署,镜像存储使用S3兼容对象存储而非本地文件系统。
Harbor部署配置与TLS证书设置
推荐使用官方Docker Compose方式部署。以下为生产环境配置示例:
# 下载Harbor离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz
tar xzf harbor-offline-installer-v2.9.0.tgz
cd harbor
# 生成自签名证书(生产环境建议使用正式CA证书)
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -subj "/CN=harbor.local" -days 3650 -out ca.crt
openssl genrsa -out harbor.key 4096
openssl req -new -key harbor.key -subj "/CN=harbor.local" -out harbor.csr
openssl x509 -req -in harbor.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.crt -days 3650
编辑harbor.yml配置文件:
# harbor.yml
hostname: harbor.yourdomain.com
http:
port: 80
https:
port: 443
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key
# 外部数据库配置(生产环境推荐)
external_database:
harbor:
host: pg-harbor.internal
port: 5432
db_name: harbor
username: harbor
password: YourStrongPassword
ssl_mode: disable
external_redis:
host: redis-harbor.internal
port: 6379
# 对象存储配置
storage_service:
s3:
accesskey: AKIAIOSFODNN7EXAMPLE
secretkey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
region: us-east-1
bucket: harbor-registry
encrypt: true
# 漏洞扫描配置
trivy:
ignore_unfixed: false
insecure: false
执行安装:
./install.sh --with-trivy --with-chartmuseum
Trivy镜像漏洞扫描原理与配置
Harbor集成的Trivy扫描器通过分析镜像层中的包管理元数据(如dpkg、rpm、apk、pip、npm等),将检测到的依赖包版本与CVE数据库比对,输出漏洞报告。Trivy的扫描流程为:拉取镜像manifest,遍历各层,提取包信息,匹配CVE数据库,生成报告。
在Harbor管理界面中,进入”配置” -> “漏洞扫描”可配置扫描策略:
- 自动扫描:新推送的镜像自动触发扫描。建议生产环境开启。
- 定时扫描:每天/每周对已有镜像重新扫描,因为CVE数据库会持续更新,新漏洞可能影响已存储的镜像。
- 阻止有严重漏洞的镜像被拉取:设置CVE严重级别阈值,高于阈值的镜像禁止pull操作。这是防止漏洞镜像进入生产环境的重要防线。
通过API触发扫描并获取结果:
# 触发镜像扫描
curl -X POST "https://harbor.yourdomain.com/api/v2.0/projects/myproject/repositories/myapp/artifacts/sha256:abc.../scan" \
-H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \
-H "Content-Type: application/json"
# 查询扫描结果
curl -s "https://harbor.yourdomain.com/api/v2.0/projects/myproject/repositories/myapp/artifacts/sha256:abc.../scan/findings" \
-H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" | python -m json.tool
# 结果示例
# {
# "vulnerabilities": [
# {
# "id": "CVE-2024-12345",
# "package": "openssl",
# "version": "3.0.2-0ubuntu1",
# "severity": "High",
# "fixed_version": "3.0.2-0ubuntu1.1"
# }
# ]
# }
镜像签名与Cosign验证集成
Harbor 2.4+支持Cosign镜像签名。签名后的镜像在Harbor界面显示验证徽章,配合策略可阻止未签名镜像在生产环境部署。
# 使用Cosign签名镜像
cosign sign --key cosign.key harbor.yourdomain.com/myproject/myapp:v1.2.3
# 验证签名
cosign verify --key cosign.pub harbor.yourdomain.com/myproject/myapp:v1.2.3
# 在CI流水线中集成签名步骤
# .gitlab-ci.yml片段
sign-image:
stage: sign
script:
- cosign sign --key $COSIGN_KEY $REGISTRY/$IMAGE:$TAG
only:
- main
在Harbor中启用签名验证策略后,部署系统(如Kubernetes的Admission Controller)可通过Harbor API验证镜像签名状态,拒绝未签名镜像的部署请求。
镜像复制策略与多数据中心同步
Harbor的镜像复制功能支持跨仓库同步镜像,适用于多数据中心或多云环境。复制策略支持基于filter的精确匹配:
# 创建复制规则(通过API)
curl -X POST "https://harbor.yourdomain.com/api/v2.0/replication/policies" \
-H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \
-H "Content-Type: application/json" \
-d '''{"name":"prod-sync",
"src_registry":{"id":1},
"dest_registry":{"id":2},
"trigger":{"type":"scheduled","trigger_settings":{"cron":"0 2 * * *"}},
"filters":[
{"type":"name","value":"myproject/*"},
{"type":"tag","value":"v*"},
{"type":"resource","value":"artifact"}
],
"deletion":false,
"override":true}'''
复制策略支持实时触发(push后立即同步)和定时触发两种模式。对于跨地域复制,建议使用定时模式避开高峰期。deletion选项控制是否同步删除操作,生产环境通常设为false以防止误删操作级联传播。
访问控制与机器人账户配置
Harbor的权限模型分为项目级和系统级。项目级权限包括项目管理员、开发人员、访客、受限访客四种角色。CI/CD流水线推荐使用机器人账户(Robot Account)而非真实用户凭证:
# 创建项目级机器人账户
curl -X POST "https://harbor.yourdomain.com/api/v2.0/projects/1/robots" \
-H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \
-H "Content-Type: application/json" \
-d '''{"name":"ci-pusher","description":"CI push robot","access":[{"resource":"repository","action":"push,pull"}]}'''
# 在Docker登录时使用机器人账户
docker login harbor.yourdomain.com -u robot$ci-pusher -p <token>
机器人账户的token可设置过期时间,建议生产环境token有效期不超过90天,并通过密钥管理服务(如HashiCorp Vault)统一分发和轮换。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/harbor-si-you-jing-xiang-cang-ku-bu-shu-yu-trivy-jing-xiang/