更新日:2026年2月12日

11分で読めます

外部セキュリティスキャナーをDevSecOpsワークフローに統合する

SnykスキャンのJSON結果をマージリクエストウィジェットに統合し、SARIFファイル形式を活用する方法を紹介します。

ソフトウェアを開発する毎日において、セキュリティ脆弱性が本番環境に混入する機会は常に存在します。そのため、セキュリティをシフトレフトし、セキュリティテストとそれによって検出される脆弱性をソフトウェア開発ライフサイクルの最前線に配置することが、これまで以上に重要になっています。

GitLabは幅広い種類のセキュリティスキャナーを提供しており、AI搭載DevSecOpsプラットフォームによって、ソフトウェアのセキュリティを完全に可視化します。GitLabでは、スキャンの実行だけでなく、結果の表示、マージリクエストポリシーによる承認プロセスの組み込み、デフォルトブランチにおける現在の脆弱性の表示を通じて、脆弱性レポートで今後のトリアージに活用できます。

セキュリティスキャンの実行方法

GitLab Ultimateでは、マージリクエストウィジェットに脆弱性が直接表示され、コミットごとに更新されます。これらのスキャンは通常、プロジェクトの.gitlab-ci.ymlパイプラインであれ、別途管理されるコンプライアンスパイプライン、セキュリティポリシー、または別の.ymlファイルからのインクルードされたパイプライン設定であれ、パイプライン内のジョブを通じて実行されます。GitLabのネイティブセキュリティスキャナーを実行することも、外部スキャナーを実行することもできます。この記事では、Snykスキャンを実行し、依存関係スキャン結果を脆弱性レコードとしてGitLabにフィードバックする方法を試しました。さらに、Static Analysis Results Interchange Format(SARIF)コンバーターを活用して、カスタムスクリプトを使用せずにSnykからSAST結果を直接読み取る方法も紹介します。

外部スキャナーの使用

GitLabは高い拡張性を持ち、プラットフォームでは多様なツールを統合できます。ビルトインのセキュリティスキャナーを使用することも、パイプラインやポリシー内のジョブを通じて外部スキャナーを使用することもできます。GitLabは、ガバナンスと実施のための単一プラットフォームとして機能し、独自のスキャナーを持ち込んで、DevSecOpsライフサイクルの早い段階で結果を確認できます。

開始するには、セキュリティジョブを実行するだけで、マージリクエストと脆弱性レポートで結果を取得できます。

GitLab CIから外部スキャンを実行する

このパイプライン例では、テストステージで外部的にSnykスキャンを実行し、gemnasium-maven-dependency_scanningというオーバーライドしたジョブで実行します。まず、必要なパッケージ(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がファイルを読み取り、その内容をウィジェットに表示するために必要なファイル名です。

      import json
from types import SimpleNamespace

with open("snyk_data_file.json") as snyk_data_file:
    snyk_data = json.load(snyk_data_file, object_hook=lambda d: SimpleNamespace(**d))

gitlab_vulns = []
dependency_files = []
for i in snyk_data:
    dependency_files.append({"path": i.path, "package_manager": i.packageManager, "dependencies": []})
    for v in i.vulnerabilities:
        gitlab_identifiers = []
        for vuln_type, vuln_names in v.identifiers.__dict__.items():
            if vuln_names: 
                for vuln_name in vuln_names:
                    gitlab_identifiers.append({"type": vuln_type, "name": vuln_name, "value": vuln_name.partition("-")[2]})
                gitlab_vulns.append({"id": v.id, "category": "dependency_scanning", "severity": v.severity.capitalize(), "identifiers": gitlab_identifiers, "description": v.description, "location": {"file": i.displayTargetFile, "dependency": {"package": {"name": "PLACEHOLDER"}, "version": "PLACEHOLDER"}}})

# Dummy data for scan and dependency files 
full_json = {"version": "15.0.6", "dependency_files": dependency_files, "scan": {"analyzer": {"id": "snyk", "name": "Snyk", "vendor": {"name": "Snyk"}, "version": "1.0.2"}, "scanner": {"id": "my-snyk-scanner", "name": "My Snyk Scanner", "version": "1.0.2", "vendor": {"name": "Snyk"}}, "end_time": "2022-01-28T03:26:02", "start_time": "2020-01-28T03:26:02", "status": "success", "type": "dependency_scanning"}, "vulnerabilities": gitlab_vulns}

with open("gl-dependency-scanning-report.json", "w") as gitlab_file:
    json.dump(full_json, gitlab_file, default=vars)

    

これで、脆弱性の検出結果がマージリクエストウィジェットに表示されるようになります。

セキュリティスキャン検出

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をアーティファクトとして保存すると、結果がマージリクエストウィジェットに表示されます。

セキュリティスキャン - 画像2

まとめ

この記事では、カスタムスクリプトとSARIFコンバーターの両方を使用して、GitLabマージリクエストウィジェットで外部スキャナーの脆弱性を表示する方法を説明しました。これらの操作は、示されているパイプラインから実行できるだけでなく、コンプライアンスパイプラインやパイプライン実行ポリシーからも実行できます。これらにより、外部スキャナーの強制実行が可能になります。GitLab Ultimateでは、完全なDevSecOpsプラットフォームにアクセスでき、当社のスキャナーを使用することも独自のスキャナーを持ち込むこともできます。これにより、デベロッパーが本番環境に到達する前に脆弱性を修正できるシフトレフトワークフローを構築できます。

GitLab Ultimateを今すぐ無料トライアルして、外部スキャナーの統合を開始しましょう。

セキュリティスキャンに関するその他のリソース

ご意見をお寄せください

このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。

フィードバックを共有する

今すぐ開発をスピードアップ

DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。