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
核心工作流
基本漏洞扫描
- 确定扫描目标:确定要扫描的内容(容器镜像、文件系统、SBOM)
- 运行Grype扫描:执行
grype <目标>以分析漏洞 - 审查发现:检查CVE ID、严重性、CVSS分数、受影响的包
- 确定修复优先级:重点关注严重/高风险、CISA KEV、高EPSS分数
- 应用修复:更新易受攻击的包或基础镜像
- 重新扫描:验证漏洞是否已解决
带有失败阈值的CI/CD集成
用于自动化流水线安全门:
# 如果发现任何严重漏洞,则构建失败
grype <镜像> --fail-on critical
# 如果发现高或严重级别漏洞,则失败
grype <镜像> --fail-on high
# 输出JSON以便进一步处理
grype <镜像> -o json > results.json
流水线集成模式:
- 构建容器镜像
- 使用
--fail-on阈值运行Grype扫描 - 如果扫描失败:阻止部署,通知安全团队
- 如果扫描通过:继续部署工作流
- 将扫描结果存档为构建工件
基于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 - 单独扫描基础镜像以识别继承的漏洞