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 提供企业级的镜像存储、权限管理、漏洞扫描和跨集群复制能力
制品生命周期管理 确保镜像从构建到废弃的全流程可追溯、可管控