返回文章列表
DevSecOps | 2025-07-28

将外部安全扫描器集成到您的 DevSecOps 工作流中

极狐GitLab

学习如何通过解析 JSON 产物并利用 SARIF 文件格式,将 Snyk 扫描结果引入合并请求小部件。

 

每天构建软件时,安全漏洞都可能悄悄进入生产环境。因此,将安全左移并将安全测试及其检测到的漏洞置于软件开发生命周期的前沿变得比以往任何时候都更加重要。

 

虽然极狐GitLab 提供多种安全扫描器,但我们由 AI 驱动的 DevSecOps 平台可让您全面了解软件的安全性。我们致力于让您不仅能运行扫描,还能查看结果、通过合并请求策略构建审批流程,并在默认分支中显示当前漏洞,以便在我们的漏洞报告中进行后续分类。

 

安全扫描如何运行?

 

极狐GitLab 旗舰版直接在合并请求小部件中显示漏洞,并在每次提交时更新。这些扫描通常通过流水线中的作业运行,无论是在项目的 .gitlab-ci.yml 流水线中,还是在单独控制的合规性流水线、安全策略或来自独立 .yml 文件的包含流水线配置中。您可以运行极狐GitLab 的原生安全扫描器,也可以运行外部扫描器。在本篇博客中,我尝试运行 Snyk 扫描,探索如何将依赖项扫描结果作为漏洞记录反馈回极狐GitLab。此外,我使用了静态分析结果交换格式(SARIF)转换器直接从 Snyk 读取 SAST 结果,无需自定义脚本。

 

使用外部扫描器

 

极狐GitLab 具有高度可扩展性,该平台允许您集成多种工具。您可以使用我们内置的安全扫描器之一,或通过流水线或策略中的作业使用外部扫描器。极狐GitLab 作为治理和执行的单一平台,允许您自带扫描器并在 DevSecOps 生命周期的早期查看结果。

您只需运行安全作业即可开始,然后就可以在合并请求和漏洞报告中查看结果。

 

从极狐GitLab CI 运行外部扫描

 

在此示例流水线中,我在测试阶段覆盖了一个名为 gemnasium-maven-dependency_scanning 的作业,在其中外部运行 Snyk 扫描。首先,我安装所需的软件包(npm、Maven、Python3 和 Snyk),然后使用保存在项目变量部分的 SNYK_TOKEN 变量进行授权。最后,我使用 Snyk CLI 运行 snyk test 命令并将结果输出到 JSON。这将结果保存到 snyk_data_file.json 中,我将在下一节详细介绍的脚本中解析该文件,并将其保存到所需的产物文件 gl-dependency-scanning-report.json

stages:
  - test

variables:

include:
  - template: Jobs/Dependency-Scanning.gitlab-ci.yml  

gemnasium-maven-dependency_scanning:
  image: node:latest
  stage: test
  services:
  - openjdk:11-jre-slim-buster
  before_script:
    - apt-get update
    - apt-get install default-jdk -y
  script:
    # Install npm, snyk, and maven
    - npm install -g npm@latest
    - npm install -g snyk
    - npm install maven
    - npm install python3
    # Run snyk auth, snyk monitor, snyk test to break build and out report
    - snyk auth $SNYK_TOKEN
    - chmod +x mvnw
    - snyk test --all-projects --json-file-output=snyk_data_file.json || true
    - python3 convert-snyk-to-gitlab.py

  # Save report to artifacts
  artifacts:
    when: always
    paths: 
      - gl-dependency-scanning-report.json

 

 

解析 JSON

 

只要成功的安全作业产物命名正确(例如 gl-dependency-scanning-report.json),您就可以在合并请求小部件中查看来自任何外部扫描器的扫描结果。

以下是将 Snyk JSON 输出转换为极狐GitLab JSON 输出的示例脚本。在此示例中,我打开 Snyk 数据文件并加载漏洞数据。我创建了一个新的依赖文件列表和一个新的漏洞列表,其中包含极狐GitLab 在漏洞记录中显示所需的数据,例如标识符、严重性、类别、描述和位置。我为不需要在记录中显示的必填字段添加了一些占位符部分。最后,我将解析出的内容保存到名为 gl-dependency-scanning-report.json 的新 JSON 文件中,这是极狐GitLab 读取文件内容并在小部件中显示所需的标准文件名。

现在,漏洞发现结果在合并请求小部件中可见。

 

什么是 SARIF 和 SARIF 转换器?

 

SARIF 是静态分析工具输出的文件格式。在利用不同的安全扫描器时,它非常有用,因为所有扫描器的输出格式都相同。这为应用安全提供了一种通用、可重复且可扩展的方法。

有一个社区维护的 SARIF 转换器,它获取 SARIF 文件并将其转换为可摄取的报告。它支持多种扫描器,包括 Snyk。该转换器适用于 SAST 和代码质量发现。本篇博客我们将重点讨论 SAST。

 

使用 SARIF 转换器获取 SAST 结果

 

要利用 SARIF 结果,首先我像上一个示例一样触发 Snyk 扫描,但将输出保存为 SARIF 文件。之后,我使用上述转换器创建一个新的 JSON 文件,并将其保存为报告。

snyk:
  image: node:latest
  stage: test
  services:
  - openjdk:11-jre-slim-buster
  before_script:
    - apt-get update
    - apt-get install default-jdk -y
    - wget -O sarif-converter https://gitlab.com/ignis-build/sarif-converter/-/releases/permalink/latest/downloads/bin/sarif-converter-linux
    - chmod +x sarif-converter
  script:
    # Install npm, snyk, and maven
    - npm install -g npm@latest
    - npm install -g snyk
    - npm install maven
    # Run snyk auth, snyk monitor, snyk test to break build and out report
    - snyk auth $SNYK_TOKEN
    - chmod +x mvnw
    - snyk test --all-projects --sarif-file-output=snyk.sarif  || true
    - ./sarif-converter --type sast snyk.sarif snyk.json

  artifacts:
    reports:
      sast: snyk.json

将 JSON 保存为产物后,结果在合并请求小部件中可见。

 

开始使用

在本篇博客中,您学习了如何使用自定义脚本和 SARIF 转换器在极狐GitLab 合并请求小部件中查看外部扫描器漏洞。这些操作可以从所示的流水线中完成,也可以从合规性流水线和流水线执行策略中完成,这些策略允许强制执行外部扫描器。通过极狐GitLab 旗舰版,您可以访问完整的 DevSecOps 平台,该平台允许您使用我们的扫描器或自带扫描器,并构建左移工作流,使开发人员能够在漏洞进入生产环境之前修复它们。

极狐GitLab 一体化DevOps平台 专为中国用户研发,免费试用60天专业版高级功能
售前咨询
联系电话
在线支持
预约演示