容器漏洞扫描器-GrypeSkill container-grype

这是一个用于容器安全扫描的DevSecOps技能,专门使用Grype工具进行容器镜像、文件系统和SBOM(软件物料清单)的漏洞检测。核心功能包括:CVE漏洞扫描、CVSS严重性评级、EPSS利用概率分析、CISA KEV已知被利用漏洞识别。支持CI/CD流水线集成、多格式报告输出(JSON/SARIF/CycloneDX)和基于风险指标的修复优先级排序。适用于云原生安全、容器安全审计、软件供应链安全等场景。

DevOps 0 次安装 0 次浏览 更新于 3/1/2026

name: container-grype description: > 使用Grype进行容器漏洞扫描和依赖风险评估,包含CVSS严重性评级、EPSS利用概率和CISA KEV指标。适用于:(1) 扫描容器镜像和文件系统中的已知漏洞,(2) 在CI/CD流水线中集成漏洞扫描并设置严重性阈值,(3) 分析SBOM(Syft、SPDX、CycloneDX)的安全风险,(4) 基于威胁指标(CVSS、EPSS、KEV)确定修复优先级,(5) 生成多种格式(JSON、SARIF、CycloneDX)的漏洞报告以便集成到安全工具链中。 version: 0.1.0 maintainer: SirAppSec category: devsecops tags: [容器安全, 漏洞扫描, sca, sbom, cvss, cve, docker, grype] frameworks: [CWE, NIST] dependencies: tools: [grype, docker] references:


使用Grype进行容器漏洞扫描

概述

Grype是一款开源漏洞扫描器,用于识别容器镜像、文件系统和软件物料清单(SBOM)文档中的已知安全缺陷。它通过对比漏洞数据库,分析操作系统包(Alpine、Ubuntu、Red Hat、Debian)和特定语言依赖(Java、Python、JavaScript、Ruby、Go、PHP、Rust)来检测CVE。

Grype通过以下方式强调可操作的安全洞察:

  • CVSS严重性评级用于风险分类
  • EPSS利用概率评分用于威胁评估
  • CISA已知被利用漏洞(KEV)指标
  • 多种输出格式(表格、JSON、SARIF、CycloneDX)便于工具链集成

快速开始

扫描容器镜像:

grype <镜像名称>

示例:

# 扫描官方Docker镜像
grype alpine:latest

# 扫描本地Docker镜像
grype myapp:v1.2.3

# 扫描文件系统目录
grype dir:/path/to/project

# 扫描SBOM文件
grype sbom:/path/to/sbom.json

核心工作流

基本漏洞扫描

  1. 确定扫描目标:确定要扫描的内容(容器镜像、文件系统、SBOM)
  2. 运行Grype扫描:执行 grype <目标> 以分析漏洞
  3. 审查发现:检查CVE ID、严重性、CVSS分数、受影响的包
  4. 确定修复优先级:重点关注严重/高风险、CISA KEV、高EPSS分数
  5. 应用修复:更新易受攻击的包或基础镜像
  6. 重新扫描:验证漏洞是否已解决

带有失败阈值的CI/CD集成

用于自动化流水线安全门:

# 如果发现任何严重漏洞,则构建失败
grype <镜像> --fail-on critical

# 如果发现高或严重级别漏洞,则失败
grype <镜像> --fail-on high

# 输出JSON以便进一步处理
grype <镜像> -o json > results.json

流水线集成模式

  1. 构建容器镜像
  2. 使用 --fail-on 阈值运行Grype扫描
  3. 如果扫描失败:阻止部署,通知安全团队
  4. 如果扫描通过:继续部署工作流
  5. 将扫描结果存档为构建工件

基于SBOM的扫描

使用Grype与Syft生成的SBOM进行更快的重新扫描:

# 使用Syft生成SBOM(独立技能:sbom-syft)
syft <镜像> -o json > sbom.json

# 使用Grype扫描SBOM(比重新分析镜像更快)
grype sbom:sbom.json

# 将Syft输出直接管道传输到Grype
syft <镜像> -o json | grype

SBOM工作流的优势

  • 无需重新分析镜像层即可更快地重新扫描
  • 跨安全工具共享SBOM
  • 为合规性和审计存档SBOM

风险优先级工作流

进度: [ ] 1. 使用JSON输出运行完整的Grype扫描:grype <目标> -o json > results.json [ ] 2. 使用辅助脚本提取高风险CVE:./scripts/prioritize_cves.py results.json [ ] 3. 审查CISA KEV匹配项(主动利用的漏洞) [ ] 4. 检查非KEV发现的EPSS分数(利用概率) [ ] 5. 确定修复优先级:KEV > 高EPSS > CVSS严重 > CVSS高 [ ] 6. 使用CVE ID和受影响的包记录修复计划 [ ] 7. 应用修复并重新扫描以验证

系统地进行每一步。勾选已完成的项目。

输出格式

Grype支持多种输出格式以满足不同用例:

表格(默认):人类可读的控制台输出

grype <镜像>

JSON:机器可解析,用于自动化

grype <镜像> -o json

SARIF:静态分析结果交换格式,用于IDE集成

grype <镜像> -o sarif

CycloneDX:包含漏洞数据的SBOM格式

grype <镜像> -o cyclonedx-json

模板:使用Go模板的自定义输出

grype <镜像> -o template -t custom-template.tmpl

高级配置

过滤和排除

排除特定文件路径:

grype <镜像> --exclude '/usr/share/doc/**'

按严重性过滤:

grype <镜像> --only-fixed  # 仅显示有可用修复的漏洞

自定义忽略规则

创建 .grype.yaml 以抑制误报:

ignore:
  # 忽略特定CVE
  - vulnerability: CVE-YYYY-XXXXX
    reason: "误报 - 未使用该组件"

  # 忽略特定包的CVE
  - vulnerability: CVE-YYYY-ZZZZZ
    package:
      name: example-lib
      version: 1.2.3
    reason: "风险已接受 - 已部署缓解控制措施"

数据库管理

更新漏洞数据库:

grype db update

检查数据库状态:

grype db status

使用特定数据库位置:

grype <镜像> --db /path/to/database

安全注意事项

  • 敏感数据处理:扫描结果可能包含揭示应用程序架构的包名称和版本。安全存储结果,并限制授权安全人员访问。

  • 访问控制:扫描容器镜像时,Grype需要Docker套接字访问权限。限制权限以防止未经授权的镜像访问。

  • 审计日志记录:记录所有Grype扫描的时间戳、目标详情和操作员身份,以便合规和事件响应。存档扫描结果以进行历史漏洞跟踪。

  • 合规性:定期漏洞扫描支持SOC2、PCI-DSS、NIST 800-53和ISO 27001要求。记录扫描频率和修复SLA。

  • 安全默认设置:对生产部署至少使用 --fail-on critical 作为阈值。在CI/CD中配置自动扫描,以防止易受攻击的镜像进入生产环境。

捆绑资源

脚本 (scripts/)

  • prioritize_cves.py - 解析Grype JSON输出,并按威胁指标(KEV、EPSS、CVSS)确定CVE优先级
  • grype_scan.sh - 包装脚本,用于具有日志记录和阈值配置的一致Grype扫描

参考资料 (references/)

  • cvss_guide.md - CVSS严重性评级系统和分数解读
  • cisa_kev.md - CISA已知被利用漏洞目录和修复紧迫性
  • vulnerability_remediation.md - 依赖漏洞的常见修复模式

资产 (assets/)

  • grype-ci-config.yml - 用于Grype漏洞扫描的CI/CD流水线配置
  • grype-config.yaml - 具有常见忽略模式的Grype配置示例

常见模式

模式1:预生产扫描

在将镜像推送到注册表之前扫描:

# 构建镜像
docker build -t myapp:latest .

# 推送前本地扫描
grype myapp:latest --fail-on critical

# 如果扫描通过,推送到注册表
docker push myapp:latest

模式2:计划扫描

重新扫描现有镜像以发现新披露的漏洞:

# 每天扫描所有生产镜像
for image in $(docker images --format '{{.Repository}}:{{.Tag}}' | grep prod); do
  grype $image -o json >> daily-scan-$(date +%Y%m%d).json
done

模式3:基础镜像选择

比较基础镜像以选择漏洞最少的选项:

# 比较Alpine版本
grype alpine:3.18
grype alpine:3.19

# 比较发行版
grype ubuntu:22.04
grype debian:12-slim
grype alpine:3.19

集成点

  • CI/CD:使用 --fail-on 阈值与GitHub Actions、GitLab CI、Jenkins、CircleCI集成
  • 容器注册表:扫描来自Docker Hub、ECR、GCR、ACR、Harbor的镜像
  • 安全工具:导出SARIF用于GitHub Security,导出JSON用于SIEM摄取,导出CycloneDX用于DependencyTrack
  • SDLC:在构建期间扫描(左移)、部署前(质量门)和计划扫描(持续监控)

故障排除

问题:数据库更新失败

症状grype db update 因网络错误而失败

解决方案

  • 检查网络连接和代理设置
  • 验证防火墙是否允许访问Grype数据库源
  • 使用 grype db update --verbose 获取详细错误消息
  • 考虑使用离线数据库:grype db import /path/to/database.tar.gz

问题:误报

症状:Grype报告未使用代码或错误识别包中的漏洞

解决方案

  • 创建具有特定CVE抑制的 .grype.yaml 忽略文件
  • 记录每个被忽略漏洞的理由
  • 定期(每季度)审查被忽略的CVE以重新评估风险
  • 使用 --only-fixed 专注于可操作的发现

问题:扫描缓慢

症状:Grype扫描大型镜像耗时过长

解决方案

  • 使用SBOM工作流:使用Syft生成一次SBOM,然后使用Grype重新扫描SBOM
  • 排除不必要的路径:--exclude '/usr/share/doc/**'
  • 使用本地数据库缓存:批量扫描前运行 grype db update
  • 单独扫描基础镜像以识别继承的漏洞

参考资料