アプリケーションが利用しているライブラリの脆弱性を定期的にチェックする設定方法のメモです。 定期実行の仕掛けとしては GitLab の「CI/CD - スケジュール」を使っています。

ゴール

以下のことを実現したいと思います。

  • 毎週月曜日の深夜2時に脆弱性チェックを実行する
  • 脆弱性が発見されたらジョブを異常終了させる (ジョブが異常終了すれば自動的にメールで通知があるので、脆弱性が発見されたことがわかる)
  • 発見された脆弱性の詳細についてのレポートをダウンロード可能にする

脆弱性チェックの方法について

脆弱性チェックには OWASP Dependency Check を利用します。 OWASP Dependency Check は Gradle や Maven 等のビルドツールから実行することもできますが、ここでは言語を選ばず汎用的に使えるコマンドラインツールを利用したいと思います。

このコマンドラインツールは Docker イメージの形でDocker Hubに登録されています。今回はこのイメージを使用します。

設定手順

設定は以下の2ステップで行います。

  1. スケジュール設定を行う
  2. .gitlab-ci.yml を記述する

1. スケジュール設定

「CI/CD - スケジュール」で新規スケジュールを作成します。

新規スケジュール設定

2. .gitlab-ci.yml の記述

.gitlab-ci.yml には以下の記述を行います。

  1. 脆弱性チェックを行うジョブを追加する
  2. 脆弱性チェック以外のジョブはスケジュール実行しないようにする

脆弱性チェックジョブの追加

設定例です:

dependency-check:
  only:
  - schedules
  image:
    name: owasp/dependency-check:latest
    entrypoint: [""]
  script:
  - /usr/share/dependency-check/bin/dependency-check.sh --out report --failOnCVSS 3 --project "CI/CD Demo" -scan .
  artifacts:
    when: on_failure
    paths:
    - report

ここでは以下の設定を行っています。

  1. only: 実行タイミング設定
  2. image: 実行イメージの設定
  3. script: 実行する処理の記述
  4. artifacts: 検出結果レポートの保存指定

1. only: 実行タイミング設定

  only:
  - schedules

スケジュール設定した時間に実行するため、only.schedules を設定します。


2. image: 実行イメージの設定

  image:
    name: owasp/dependency-check:latest
    entrypoint: [""]
  • name: owasp/dependency-check の Dockerイメージを使う
  • entrypoint: 任意のスクリプト実行をできるようにするためにエントリポイントを無効化する

3. script: 実行する処理の記述

  script:
  - /usr/share/dependency-check/bin/dependency-check.sh --out report --failOnCVSS 3 --project "CI/CD Demo" --scan .
  • —out report : 結果レポートの出力先フォルダを report に設定
  • —failOnCVSS 3 : CVSSスコアが3以上のソフトウェアがあった場合に異常終了 (脆弱性が検出されたと判定) する
  • —project “CI/CD Demo” : (レポートに表示する) プロジェクト名の指定
  • —scan . : カレントディレクトリを対象に分析を行う

4. artifacts: 検出結果レポートの保存指定

  artifacts:
    when: on_failure
    paths:
    - report
  • when: 失敗したときだけレポートを保存する
  • paths: レポートが存在するフォルダの指定

設定内容のテスト

設定内容をすぐにテストしたい場合、「CI/CD - スケジュール」から実行することができます。

テスト実行

レポートのダウンロード

脆弱性が検出されるとパイプラインもしくはジョブの一覧からレポートのダウンロードができます。

レポートのダウンロード

ダウンロードしたレポートはこのようなイメージの HTML ファイルになります。

レポートの例

かわかみしんいち。島根県津和野町在住のフリーランスエンジニア。複合現実(Mixed Reality)と3DUXでおもちゃを作るのが趣味。 https://github.com/ototadana