Harbor私有镜像仓库部署与Trivy镜像漏洞扫描配置实战

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/

(0)
小编小编
上一篇 10小时前
下一篇 10小时前

相关推荐