容器镜像安全扫描实战指南

David Ng | 2026-09-01T08:57:55 | DevOps, Security

对比 Trivy、Grype、Snyk 三大扫描工具,讲解 CVE 漏洞分析、CI/CD 集成、镜像瘦身与安全基线配置。

# 容器镜像安全扫描实战指南 ## 为什么扫描容器镜像 容器镜像中的基础操作系统、系统库、应用依赖都可能包含已知漏洞。据统计,Docker Hub 上超过 50% 的公开镜像包含高危漏洞。 ## Trivy 快速扫描 ```bash # 扫描镜像 trivy image --severity HIGH,CRITICAL myapp:latest # 输出 JSON 格式 trivy image --format json --output report.json myapp:latest # 扫描 Dockerfile trivy config --severity HIGH,CRITICAL . # 扫描文件系统(本地项目依赖) trivy fs --scanners vuln,secret,misconfig . ``` ## CI/CD 集成(GitHub Actions) ```yaml name: Security Scan on: [push, pull_request] jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image run: docker build -t myapp:ci . - name: Run Trivy scan uses: aquasecurity/trivy-action@master with: image-ref: 'myapp:ci' format: 'sarif' output: 'trivy-results.sarif' severity: 'CRITICAL,HIGH' exit-code: '1' # 发现高危漏洞时构建失败 - name: Upload scan results uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: 'trivy-results.sarif' ``` ## 安全镜像构建 ```dockerfile # 使用最小基础镜像 FROM gcr.io/distroless/java17-debian12:nonroot # 或者多阶段构建 FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests FROM eclipse-temurin:17-jre-alpine RUN addgroup -S app && adduser -S app -G app USER app COPY --from=builder --chown=app:app /build/target/app.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app/app.jar"] ``` ## 镜像瘦身对比 | 基础镜像 | 大小 | CVE 数量 | |---------|------|---------| | ubuntu:22.04 | 77MB | ~30 | | alpine:3.19 | 7MB | ~5 | | distroless/java17 | 230MB | ~3 | | scratch (Go 静态编译) | 0MB | 0 | 定期扫描加自动化阻断是容器安全的基础,建议将扫描作为 CI/CD 流水线的必经步骤。

← Back to Blog