容器安全扫描:Trivy+Harbor 镜像漏洞检测

容器安全扫描:Trivy+Harbor 镜像漏洞检测

容器安全扫描:Trivy+Harbor 镜像漏洞检测

容器安全扫描的重要性

在容器化部署普及的今天,容器安全已成为 DevOps 流程中的关键环节。2023 年 CVE 漏洞数据库新增漏洞超过 2 万个,其中容器镜像漏洞占比超过 30%。

容器安全面临的主要威胁:

  • 基础镜像包含已知漏洞(CVE)
  • 应用依赖库的安全风险
  • 配置错误导致的暴露风险
  • 镜像供应链攻击

安全扫描的价值:

  • 提前发现并修复漏洞
  • 满足合规要求(等保、PCI-DSS)
  • 降低生产环境安全风险
  • 提升镜像质量和可信度

Trivy 基本概念和安装配置

1. 什么是 Trivy?

Trivy 是由 Aqua Security 开发的开源安全扫描工具,支持:

  • 容器镜像扫描
  • 文件系统扫描
  • 代码仓库扫描
  • 配置即代码(IaC)扫描
  • 支持 70+ 种 CVE 数据库

2. 安装 Trivy

# Ubuntu/Debian
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

CentOS/RHEL

curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

使用 Homebrew(macOS)

brew install trivy

验证安装

trivy --version

3. 配置 Trivy

# 配置目录
mkdir -p ~/.config/trivy

配置示例 ~/.config/trivy/config.yaml

severity:
  • CRITICAL
  • HIGH
skip-dirs:
  • .git
  • node_modules
format: table

跳过已修复的漏洞

exit-code: 1

Harbor 镜像仓库的漏洞检测功能

1. Harbor 安全扫描架构

┌─────────────────────────────────────────────────────────────┐
│                    Harbor 安全扫描流程                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  镜像上传 → Trivy 扫描 → 生成报告 → 自动阻断 → 安全发布       │
│       ↓              ↓           ↓          ↓             │
│    Harbor         Trivy     漏洞数据库   质量规则      CI/CD  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2. Harbor 扫描器配置

“`yaml

Harbor 配置 harbor.yml

scanner:
scanner:
type: trivy
url: http://harbor-scanner-trivy:8080

trivy:
ignore_unfixed: true
insecure: false
severity: CRITICAL,HIGH
timeout: 300s
auto_update: true


3. 漏洞检测级别

| 级别 | 描述 | 建议处理方式 | |------|------|-------------| | CRITICAL | 严重漏洞 | 立即修复 | | HIGH | 高危漏洞 | 尽快修复 | | MEDIUM | 中等风险 | 计划修复 | | LOW | 低风险 | 可延后 | | UNKNOWN | 未分类 | 评估 | ---

Trivy 与 Harbor 集成方案

1. Harbor 集成方式

yaml

docker-compose.yml for Trivy + Harbor

version: ‘3.8’

services:
trivy:
image: aquasec/trivy:latest
volumes:

  • trivy-data:/root/.trivy

environment:

  • TRIVY_DB_REPOSITORY=ghcr.io/aquasecurity/trivy-db

command: server

harbor:
image: harbor/harbor-core:latest
environment:

  • SCANNER_URL=http://trivy:8080
  • SCANNER_API_VERSION=v1

2. Harbor 扫描器配置

yaml

开启镜像自动扫描

Harbor UI 配置路径:System > Configuration > Security

扫描策略

扫描策略配置:

  • 触发条件:镜像上传后自动扫描
  • 扫描器:Trivy
  • 报告存储:保留 30 天
  • 通知方式:邮件/Webhook

3. 安全扫描 API

bash

手动触发扫描

curl -X POST http://localhost:8080/api/v2.0/scan/requests \
-H “Content-Type: application/json” \
-H “Authorization: Bearer $TOKEN” \
-d ‘{
“scan_type”: “vulnerability”,
“artifact”: {
“repository”: “library/nginx”,
“reference”: “1.21”
}
}’

查看扫描结果

curl -X GET http://localhost:8080/api/v2.0/scan/requests \
-H “Authorization: Bearer $TOKEN”


---

实际扫描命令和漏洞报告解读

1. 基础扫描命令

bash

扫描容器镜像

trivy image nginx:latest
trivy image –severity CRITICAL,HIGH nginx:latest

扫描本地文件系统

trivy fs /path/to/project

扫描 Helm Chart

trivy helm my-chart-1.0.0.tgz

扫描 Dockerfile

trivy config Dockerfile


2. 生成报告

bash

JSON 格式报告

trivy image –format json –output trivy-report.json nginx:latest

模板报告

trivy image \
–format template \
–template “@contrib/remediation.tmpl” \
–output remediation.md \
nginx:latest

JUnit 格式(用于 CI/CD)

trivy image –format junit –output trivy-results.xml nginx:latest

SARIF 格式(用于 IDE)

trivy image –format sarif –output trivy-results.sarif nginx:latest


3. 漏洞报告解读

bash

详细扫描输出

trivy image –severity CRITICAL,HIGH,MEDIUM nginx:latest

输出示例:

nginx:latest (debian 11.6)

============================================================

Total: 123 (CRITICAL: 2, HIGH: 15, MEDIUM: 45, LOW: 61)

============================================================

# Library Version Fixed Type Vulnerability Severity

——— ——- —– —- ————— ——–

zlib 1.2.11 1.2.12 library CVE-2018-25032 HIGH

openssl 1.1.1k 1.1.1n library CVE-2021-3449 HIGH

libxml2 2.9.12 2.9.13 library CVE-2021-43082 CRITICAL


4. 忽略漏洞配置

yaml

trivy.yaml 配置

ignore-unfixed: true

项目级忽略 .trivyignore

CVE-2018-25032
CVE-2021-3449

按依赖忽略

文件路径:.trivyignore

node_modules/
vendor/


---

安全扫描在 CI/CD 流水线中的集成

1. Jenkins Pipeline 集成

groovy
pipeline {
agent any

stages {
stage(‘Build’) {
steps {
sh ‘docker build -t myapp:${BUILD_NUMBER} .’
sh ‘docker tag myapp:${BUILD_NUMBER} harbor.example.com/myapp:${BUILD_NUMBER}’
}
}

stage(‘Scan’) {
steps {
script {
sh ”’
trivy image –severity CRITICAL,HIGH \
–format json \
–output trivy-report.json \
myapp:${BUILD_NUMBER}
”’

sh ”’
if grep -q ‘”Severities”:{“CRITICAL”:0}’ trivy-report.json; then
echo “✅ 无严重漏洞”
else
echo “❌ 发现严重漏洞”
exit 1
fi
”’
}
}
}

stage(‘Push’) {
when {
expression { currentBuild.result != ‘FAILURE’ }
}
steps {
sh ‘docker push harbor.example.com/myapp:${BUILD_NUMBER}’
}
}
}

post {
always {
archiveArtifacts artifacts: ‘trivy-report.json’
}
failure {
emailext subject: “镜像扫描失败”, body: “${env.BUILD_URL}”
}
}
}


2. GitLab CI 集成

yaml

.gitlab-ci.yml

stages:

  • build
  • scan
  • deploy

build:
stage: build
script:

  • docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
  • docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

scan:
stage: scan
image: aquasec/trivy:latest
script:

  • trivy image –severity CRITICAL,HIGH –exit-code 1 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  • trivy image –format json –output trivy-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

artifacts:
reports:
vulnerability: trivy-report.json

deploy:
stage: deploy
script:

  • kubectl set image deployment/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

when: manual
only:

  • main

3. GitHub Actions 集成

yaml

.github/workflows/safety.yml

name: Container Security Scan

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
scan:
runs-on: ubuntu-latest
steps:

  • uses: actions/checkout@v3
  • name: Build Docker image

run: docker build -t myapp:${{ github.sha }} .

  • name: Run Trivy vulnerability scanner

uses: aquasecurity/trivy-action@master
with:
image-ref: ‘myapp:${{ github.sha }}’
format: ‘sarif’
output: ‘trivy-results.sarif’
severity: ‘CRITICAL,HIGH’

  • name: Upload Trivy scan results to GitHub Security tab

uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: ‘trivy-results.sarif’


---

最佳实践与建议

1. 扫描策略

yaml

扫描频率

扫描策略:

  • 每日扫描:所有生产镜像
  • 每次构建:新镜像扫描
  • 每周全量扫描:仓库所有镜像

质量门控

质量门控:

  • CRITICAL: 0 漏洞
  • HIGH: ≤ 3 漏洞
  • MEDIUM: 报告但不阻断
  • LOW: 仅记录

2. 基线配置

yaml

基线配置

基础镜像选择:

  • 使用官方安全基础镜像
  • 定期更新基础镜像
  • 最小化镜像体积

依赖管理:

  • 锁定依赖版本
  • 定期更新依赖
  • 使用 SCA 工具

3. 持续改进

yaml

安全文化建设

安全文化:

  • 定期培训
  • 漏洞修复 SLA
  • 安全评审流程
  • 持续监控告警

“`

总结

容器安全扫描是现代化软件开发中不可或缺的一环。通过 Trivy 与 Harbor 的集成,可以实现从镜像构建到部署的全流程安全管控。

关键要点:

  • 选择合适的安全扫描工具(Trivy、Grype 等)
  • 集成到 CI/CD 流程,实现自动化扫描
  • 制定质量门控策略,确保漏洞及时修复
  • 定期扫描和更新,保持镜像安全
  • 建立安全文化,持续提升安全水平

通过持续的安全扫描和漏洞管理,可以显著降低容器环境的安全风险,保障生产系统的安全稳定运行。

标签

发表评论