學習如何通過解析 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 平台,該平台允許您使用我們的掃描器或自帶掃描器,並構建左移工作流,使開發人員能夠在漏洞進入生產環境之前修復它們。