镜像仓库如何做安全扫描?

wen 网络安全 57

本文目录导读:

镜像仓库如何做安全扫描?

  1. 扫描的核心内容
  2. 主要实现模式
  3. 主流工具选择
  4. 实战配置步骤
  5. CI/CD 流水线集成示例(以 GitLab CI + Trivy 为例)
  6. 常见问题与最佳实践

镜像仓库的安全扫描是保障容器化应用安全的重要环节,主要目的是在镜像被部署到生产环境之前,发现并修复其中的已知漏洞、恶意软件、敏感信息泄露以及配置不当等问题。

以下是实现镜像仓库安全扫描的完整流程、主流工具和最佳实践:

扫描的核心内容

安全扫描通常包含以下几个方面:

  1. 操作系统级漏洞:扫描镜像基础层(如 Ubuntu, Alpine, CentOS)安装的软件包(apt, yum, apk)是否包含已知的 CVE(通用漏洞披露)。
  2. 应用依赖漏洞:扫描应用层(如 Python 的 pip, Node.js 的 npm, Java 的 Maven, Go 的 Go Modules)引入的依赖是否存在漏洞。
  3. 敏感信息泄露:检查镜像中是否意外包含了密码、密钥、Token 或 API 密钥。
  4. 恶意软件检测:检查镜像是否包含病毒、木马或挖矿程序。
  5. 配置合规性:检查 Dockerfile 配置是否安全(例如是否使用了 root 用户运行,是否开放了不必要的端口等)。

主要实现模式

扫描方式根据集成深度分为以下几种:

推送到仓库时自动扫描(最推荐)

这是云原生环境中最主流的模式,CI/CD 流程在构建镜像并推送到仓库后,仓库立即触发扫描任务。

  • 流程代码提交 -> CI构建镜像 -> 推送至仓库 -> 仓库自动扫描 -> 报告结果
  • 优点:自动化程度高,无需人为干预,能拦截有风险的镜像。
  • 案例:Harbor(企业级镜像仓库)在配置中开启“自动扫描”功能。

CI/CD 流水线中扫描(左移)

在构建阶段(推送仓库之前)进行扫描,将安全问题尽可能提前发现。

  • 流程代码提交 -> CI构建镜像 -> 在流水线中运行扫描工具 -> 扫描通过则推送至仓库,失败则阻断流水线
  • 优点:安全左移,修复成本最低。
  • 缺点:会增加构建时间(1-3 分钟)。

定期/定时扫描

对已存在于仓库中的镜像进行全量或增量扫描,以发现新披露的漏洞(例如镜像构建时是安全的,但过了一周后底层依赖暴露了新漏洞)。

  • 方式:设置 Cron 任务(例如每天凌晨 2 点),仓库自动扫描所有活跃的镜像。
  • 适用:应对 0-Day 或新 CVE。

主流工具选择

市面上的工具主要分为开源免费版和商业版:

工具名称 类型 特点 集成方式
Trivy 开源、免费 速度极快、漏洞库全(含 OS、语言依赖、IaC)、支持 SBOM(软件物料清单)生成 CLI, CI/CD, GitLab/GitHub
Clair 开源、免费 Red Hat 开源,是 CoreOS 的一部分,与 Harbor 原生集成 仓库后端(Harbor)
Anchore 开源(Engine免费) 策略引擎强大,支持复杂的合规性策略(如“不允许存在高危漏洞”) CLI, CI/CD, 仓库
Docker Scout 商业(免费版有限) Docker 官方出品,集成度高,提供修复建议 Docker Desktop, CLI
Snyk 商业(有免费额度) 漏洞库质量高,提供修复 PR,支持容器和代码 CLI, CI/CD, IDE
Harbor 内置扫描器 开源 原生支持 Clair 和 Trivy,在 Web UI 中一键扫描和管理 仓库 Web 界面
  • 建议:对于中小团队或追求性价比,Trivy 是目前社区最流行、速度最快、覆盖最广的开源选择,搭配 Harbor 仓库使用,可以实现开箱即用的自动扫描。

实战配置步骤

以下以 Harbor (v2.x) + Trivy 扫描器为例,演示如何配置自动安全扫描。

环境准备

  • 已经部署了 Harbor 镜像仓库。
  • 已经部署了 Trivy 扫描器(Harbor 2.x 支持集成外部扫描器)。

在 Harbor 中集成 Trivy

  • 进入 Harbor Web 管理界面 -> 管理 -> 系统设置
  • 安全扫描 部分,填写 Trivy 适配器的 URL(http://trivy-adapter:8080)。
  • 保存设置。

开启自动扫描

  • 进入目标 项目 -> 配置管理
  • 勾选 自动扫描图像 复选框。
  • 可选:勾选 自动扫描所有拉取的图像(当有人 docker pull 该仓库镜像时触发,用于避免拉取到不安全的基础镜像)。
  • 保存。

手动触发与结果查看

  • 上传一个镜像到该项目中(docker push)。
  • 上传完成后,在镜像列表里可以看到该标签旁边显示“扫描中”或“待扫描”。
  • 等待片刻,点击该镜像标签进入详情页,即可看到 漏洞列表
  • 漏洞按严重程度分级:Critical(危急)、High(高)、Medium(中)、Low(低)。
  • 点击漏洞 CVE 编号,可以查看详情、影响版本及修复建议。

CI/CD 流水线集成示例(以 GitLab CI + Trivy 为例)

# .gitlab-ci.yml
build-and-scan:
  stage: security
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  script:
    # 1. 构建镜像
    - docker build -t $DOCKER_IMAGE .
    # 2. 运行 Trivy 扫描(扫描镜像,输出 JSON 格式报告)
    - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock
        aquasec/trivy:latest
        image --severity HIGH,CRITICAL --exit-code 1 --format json $DOCKER_IMAGE
    # 3. 只有扫描通过(exit-code = 0)才推送镜像
    - docker push $DOCKER_IMAGE
  only:
    - main

关键点

  • --severity HIGH,CRITICAL:只关注高危和危急漏洞。
  • --exit-code 1:如果发现漏洞,让 CI 任务失败(阻断发布)。
  • --format json:可以用 jq 解析,生成告警或发送到 Slack。

常见问题与最佳实践

  1. 基础镜像为王:选择官方、小巧、更新及时的基础镜像(如 AlpineDistroless 或特定 Slim 版本),基础镜像的漏洞数通常决定了最终镜像的漏洞数。
  2. 定期扫描存量镜像:即使镜像过去是安全的,也要设置每周或每月扫描,因为新 CVE 会不断出现。
  3. 建立漏洞修复 SLA
    • Critical 漏洞:24 小时内修复并重建镜像。
    • High 漏洞:7 天内修复。
    • Medium/Low:在下个迭代中修复。
  4. 不要完全信任扫描结果:注意误报(FP,误报),一个漏洞影响 libcurl,但你的应用根本不使用 curl,可以标记为“已忽略”或“不影响”,建议在策略中允许“已忽略的漏洞”通过。
  5. 结合 SBOM(软件物料清单):生成镜像的 SBOM(trivy image --format cyclonedx --output bom.json <image>),方便后续跟踪和合规审计。
  6. 避免在镜像中存储敏感信息:扫描工具会标记出环境变量中的密码或文件中的密钥,务必使用 Docker 的 --secret 或 Kubernetes 的 Secrets 来管理。

实现镜像仓库安全扫描的最佳路径是:

在本地/CI 中集成 Trivy 进行快速扫描(左移) 推送到启用了自动扫描的 Harbor 仓库(阻断) 设置定期扫描任务(兜底) 结合 SBOM 建立漏洞修复流程(运维)

这样可以从构建、存储到部署的全生命周期,系统性地管控容器镜像安全风险。

抱歉,评论功能暂时关闭!