第十章:镜像安全扫描与制品管理:Harbor、Trivy 与制品生命周期

CI 流水线构建出的 Docker 镜像,如果存在已知漏洞就直接部署到生产环境,相当于"带病上线"。据统计,约 30% 的公开镜像存在高危漏洞。因此,镜像安全扫描和制品管理是 CI/CD 流水线中不可或缺的环节。本章介绍如何使用 Trivy 进行镜像漏洞扫描,以及如何使用 Harbor 搭建企业级私有镜像仓库,实现制品的全生命周期管理。

一、镜像安全扫描:在 CI 流水线中集成 Trivy

Trivy 是 Aqua Security 开源的综合漏洞扫描工具,支持容器镜像、文件系统和 Git 仓库的安全扫描。它维护着实时更新的漏洞数据库,在 CI 环境中运行速度极快。

1.1 在 GitLab CI 中集成 Trivy

yaml 复制代码
# .gitlab-ci.yml
stages:
  - build
  - scan
  - deploy

variables:
  TRIVY_SEVERITY: "HIGH,CRITICAL"
  TRIVY_IGNORE_UNFIXED: "true"

build-image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

# 镜像安全扫描
scan-image:
  stage: scan
  image: aquasec/trivy:latest
  script:
    - trivy image --severity HIGH,CRITICAL --exit-code 1 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  only:
    - main
    - merge_requests

--severity HIGH,CRITICAL:只扫描高危和严重级别漏洞

--exit-code 1:发现漏洞时令 Job 失败,阻断流水线

--ignore-unfixed:忽略暂无修复方案的漏洞(可根据策略调整)

1.2 在 GitHub Actions 中集成 Trivy

使用官方 Trivy Action:

yaml 复制代码
# .github/workflows/security.yml
- name: Run Trivy vulnerability scanner
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: ghcr.io/${{ github.repository }}:${{ github.sha }}
    format: 'sarif'
    output: 'trivy-results.sarif'
    severity: 'HIGH,CRITICAL'
    exit-code: '1'

- name: Upload Trivy results to GitHub Security
  uses: github/codeql-action/upload-sarif@v3
  with:
    sarif_file: 'trivy-results.sarif'

将扫描结果上传到 GitHub Security 选项卡,可以在统一界面查看所有漏洞详情。

1.3 扫描策略最佳实践

二、制品管理:Harbor 企业级镜像仓库

Harbor 是 CNCF 毕业项目,是企业级容器镜像仓库的事实标准。它提供镜像存储、漏洞扫描、复制策略、权限管理等核心能力。

2.1 Harbor 的核心功能

2.2 在 CI 流水线中集成 Harbor

GitLab CI 推送镜像到 Harbor:

yaml 复制代码
push-to-harbor:
  stage: deploy
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $HARBOR_USER -p $HARBOR_PASSWORD $HARBOR_URL
    - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA $HARBOR_URL/$HARBOR_PROJECT/myapp:$CI_COMMIT_SHORT_SHA
    - docker push $HARBOR_URL/$HARBOR_PROJECT/myapp:$CI_COMMIT_SHORT_SHA
    - docker push $HARBOR_URL/$HARBOR_PROJECT/myapp:latest

GitHub Actions 推送镜像到 Harbor:

yaml 复制代码
- name: Login to Harbor
  uses: docker/login-action@v3
  with:
    registry: harbor.example.com
    username: ${{ secrets.HARBOR_USERNAME }}
    password: ${{ secrets.HARBOR_PASSWORD }}

- name: Build and push to Harbor
  uses: docker/build-push-action@v5
  with:
    push: true
    tags: |
      harbor.example.com/myproject/myapp:${{ github.sha }}
      harbor.example.com/myproject/myapp:latest

2.3 Harbor 的镜像复制策略

跨集群镜像复制是 Harbor 的企业级特性,适用于多地域部署场景:

json

{

"name": "prod-to-dr",

"src_registry": {

"url": "http://harbor-prod.example.com"

},

"dest_registry": {

"url": "http://harbor-dr.example.com"

},

"filters": [

{

"type": "tag",

"pattern": "prod-*"

}

],

"trigger": {

"type": "event-driven"

},

"enabled": true

}

三、制品生命周期管理

制品(Artifact)的管理不应止于"存起来",而应覆盖从构建到废弃的全生命周期。

3.1 制品生命周期阶段

text

构建 → 推送 → 扫描 → 测试部署 → 预发布 → 生产部署 → 归档/废弃

3.2 制品清理策略

Harbor 自动清理:Harbor 支持基于标签和时间的自动清理策略:

yaml 复制代码
# 在 Harbor 中配置清理策略
retention:
  rules:
    - scope: project
      tag_selectors:
        - kind: "doublestar"
          pattern: "*-dev-*"
          decoration: "matches"
      untagged_artifacts: true
      time_scale: days
      amount: 30   # 保留最近 30 天的开发版本

CI 流水线中清理旧镜像:

bash 复制代码
# 清理 30 天前构建的镜像(需安装 harbor-cli 或调用 API)
harbor-cli artifact delete --project myapp --tag-prefix "dev-" --older-than 30d

3.3 制品版本规范

四、完整的 DevSecOps 流水线

将以上所有环节串联成一条完整的 DevSecOps 流水线:

text

代码提交

代码质量检查(SonarQube)

单元测试(JUnit/覆盖率)

构建 Docker 镜像(多阶段构建)

镜像安全扫描(Trivy,阻断高危漏洞)

推送至 Harbor(带标签和元数据)

部署到测试环境

(人工审批)

部署到生产环境

质量门禁汇总:

五、小结

镜像安全扫描和制品管理是 CI/CD 流水线从"能用"走向"可靠"的关键环节:

Trivy 提供快速、全面的镜像漏洞扫描,可无缝集成到 CI 流水线中

Harbor 提供企业级的镜像存储、权限管理、漏洞扫描和跨集群复制能力

制品生命周期管理 确保镜像从构建到废弃的全流程可追溯、可管控