github编辑

18.6 容器镜像安全扫描与供应链安全

在 DevOps 流程中,容器镜像安全已经成为不容忽视的关键环节。从开发、构建、存储到部署,镜像的整个生命周期都需要安全防护。本节深入讨论镜像漏洞扫描、软件物料清单(SBOM)、镜像签名验证等供应链安全实践。

18.6.1 容器镜像漏洞扫描工具对比

Trivy - 轻量级通用扫描器

Trivy 是由 Aqua Security 开发的开源漏洞扫描器,以其轻量级、快速、准确而闻名,已成为业界标准。

优点:

  • 零依赖,单个二进制文件

  • 扫描速度快(秒级)

  • 支持镜像、文件系统、Git 仓库多种扫描源

  • 数据库每日自动更新

  • 支持多种输出格式(JSON、表格、SBOM 等)

安装与基本使用:

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

# 扫描本地镜像
trivy image nginx:latest

# 生成 JSON 格式报告
trivy image -f json -o report.json nginx:latest

# 扫描文件系统
trivy fs /path/to/project

# 扫描 Git 仓库
trivy repo https://github.com/aquasecurity/trivy

在 CI/CD 中集成:

Grype - 支持多种软件包的扫描器

Grype 由 Anchore 开发,支持更广泛的软件包管理器和语言。

优点:

  • 支持 Java、Python、Go、Ruby、JavaScript 等多种语言的依赖检测

  • 与 Syft(SBOM 生成器)配合效果好

  • 可自定义漏洞数据库源

  • 支持离线扫描模式

安装与使用:

Snyk - 完整的安全平台

Snyk 提供了商业级的安全扫描服务,特别适合企业环境。

特点:

  • 支持开源漏洞和许可证扫描

  • 与多个 Git 平台深度集成(GitHub、GitLab、Bitbucket)

  • 提供修复建议和自动化修复 PR

  • 支持 Kubernetes 部署后安全监控

基本使用:

工具对比表:

特性
Trivy
Grype
Snyk

零依赖

离线模式

许可证扫描

自动修复

开源免费

部分

IDE 集成

18.6.2 SBOM(软件物料清单)生成与管理

SBOM(Software Bill of Materials)是一份详细列表,记录了软件中使用的所有组件、依赖库及其版本信息。SBOM 在供应链安全中至关重要,特别是在发现新的安全漏洞时,能快速定位受影响的应用。

Syft - SBOM 生成工具

Syft 是 Anchore 推出的专业 SBOM 生成工具。

安装:

生成 SBOM:

CycloneDX 与 SPDX 格式

两种主流的 SBOM 格式:

CycloneDX 格式示例:

SPDX 格式示例:

SBOM 的应用场景

漏洞关联:

当新的 CVE 被发现时,可快速查询受影响的应用:

合规性报告:

将 SBOM 保存为构建产物,用于审计和合规性检查。

依赖升级决策:

通过分析 SBOM 中的依赖版本,制定安全升级计划。

18.6.3 镜像签名与验证(Cosign/Notary)

镜像签名确保镜像的来源可信且未被篡改。两种主流方案是 Cosign 和 Notary。

Cosign - 现代签名解决方案

Cosign 是 Sigstore 项目的核心工具,支持无密钥签名,适合现代 CI/CD 流程。

安装:

生成密钥对(传统方式):

签名镜像:

验证签名:

Keyless 签名(推荐用于 CI/CD):

Docker Content Trust(DCT)与 Notary

Docker Content Trust 使用 Notary 实现镜像签名,是 Docker 官方的签名解决方案。

启用 DCT:

签名密钥管理:

18.6.4 供应链安全最佳实践

1. 基础镜像安全

2. 构建时扫描

在 Dockerfile 中集成安全扫描:

3. 运行时镜像扫描策略

4. 镜像仓库安全配置

Harbor(私有镜像仓库)的安全扫描:

5. 政策执行(Admission Controller)

在 Kubernetes 环境中使用 Admission Webhook 强制镜像签名和扫描:

18.6.5 CI/CD 中集成安全扫描

GitHub Actions 工作流示例

GitLab CI 工作流示例

18.6.6 常见问题与最佳实践

Q: 扫描报告中有过时的 CVE,如何处理?

A: 某些 CVE 可能已经被修复但数据库未更新,可以:

  • 手动验证安全补丁是否已应用

  • 使用工具的忽略列表功能(如 Trivy 的 .trivyignore

  • 定期更新扫描工具和漏洞数据库

Q: 如何平衡镜像大小和安全性?

A:

  • 使用多阶段构建减少最终镜像大小

  • 使用精简基础镜像(Alpine、Distroless)

  • 定期更新依赖而不是一味求小

  • 优先安全性,体积次之

Q: 如何管理和轮换签名密钥?

A:

  • 在密钥管理系统(如 HashiCorp Vault)中存储密钥

  • 定期轮换密钥(建议每 90 天)

  • 使用 Keyless 签名消除密钥管理复杂性

  • 保留密钥轮换的审计日志

最后更新于