🛡️

Black DuckのOSS脆弱性チェックをGitHub Code Scanningに統合する

に公開

はじめに

OSSの脆弱性チェックツールとして、DependabotやBlack Duckなどを利用している開発チームは多くあります。しかし、複数のツールを使用することで、以下のような課題に直面することがあります。

  • 脆弱性チェック結果が複数の場所に散在し、管理が煩雑になる
  • チームメンバー全員が脆弱性情報にアクセスできない
  • ツール間で検出結果に差分が生じる

本記事では、Black DuckのOSS脆弱性チェック結果をGitHubのCode Scanning機能に統合することで、これらの課題を解決する方法を紹介します。

抱えていた課題

複数ツールによる脆弱性チェックの運用課題

私たちのチームでは、以下のような体制でOSSの脆弱性チェックを行っていました。

  • Dependabot: 主な脆弱性チェックツールとして使用
  • Black Duck: 導入済みだが、主にライセンスチェック機能のみを使用

この運用において、以下の課題が顕在化しました。

1. 検出結果の差分による対応漏れ

DependabotとBlack Duckの脆弱性チェック結果に差分が生じており、一部の脆弱性への対応が漏れていることが判明しました。これは、各ツールが使用する脆弱性データベースや検出アルゴリズムの違いによるものです。

2. 情報アクセスの制限

Black Duckの管理画面へのアクセス権限が限定的で、一部のチームメンバーが脆弱性情報を直接確認できませんでした。これにより、開発チーム全体での迅速な対応が困難になっていました。

解決策: GitHub Code Scanningへの統合

基本方針

以下の方針で運用を改善することにしました。

  1. Black Duckの結果を正とする: 全社標準ツールであるBlack Duckの検出結果を基準に運用を統一
  2. GitHubへの情報集約: 脆弱性情報を日々の開発業務の中心であるGitHubへ集約し、チーム全員がアクセスできる環境を構築

実装方針

Black Duckは、GitHub Actionsで実行できるBlack Duck Security Scanを提供しています。

このアクションには、検出結果をSARIF形式(Static Analysis Results Interchange Format)に変換する機能が含まれています。
変換した結果をGitHubのCode Scanning機能にアップロードできます。

これを活用することで、Black Duckのスキャン結果をGitHubのセキュリティタブに直接表示できます。

GitHub Actionsワークフローの実装

以下は、Black DuckスキャンをGitHub Actionsで実行し、結果をCode Scanningに統合するワークフローの例です。

name: BlackDuck Security Scan

on:
  # push時に自動実行
  push:
    branches: [main, develop]
  # 手動実行も可能
  workflow_dispatch:

jobs:
  blackduck-scan:
    runs-on: ubuntu-latest

    # Code Scanningへのアップロードに必要な権限設定
    permissions:
      contents: read
      security-events: write  # SARIF形式のレポートをアップロードするために必須

    steps:
      # ソースコードのチェックアウト
      - name: Checkout Repository
        uses: actions/checkout@v4

      # BlackDuckスキャンの実行
      - name: Run BlackDuck Security Scan
        uses: blackduck-inc/black-duck-security-scan@v2.6.0

        # BlackDuck検出ツールの環境変数設定
        env:
          # スキャン対象のプロジェクト名(GitHub Secretsまたは変数で管理)
          DETECT_PROJECT_NAME: ${{ vars.BLACKDUCK_PROJECT_NAME }}
          # スキャン対象のバージョン名(ブランチ名を使用)
          DETECT_PROJECT_VERSION_NAME: ${{ github.ref_name }}
          # 検出精度の要求レベル
          DETECT_ACCURACY_REQUIRED: NONE

        with:
          ### BlackDuck基本設定(必須項目)
          blackducksca_url: ${{ secrets.BLACKDUCK_URL }}          # BlackDuckサーバーのURL
          blackducksca_token: ${{ secrets.BLACKDUCK_TOKEN }}      # BlackDuck APIトークン
          blackducksca_scan_full: true                             # フルスキャンを実行

          ### SARIF形式レポートの生成設定(GitHub連携の要)
          blackducksca_reports_sarif_create: true                  # SARIFレポートを作成
          blackducksca_reports_sarif_file_path: "./blackduck-results.sarif"  # レポートの保存先
          blackducksca_reports_sarif_severities: "CRITICAL,HIGH"   # レポートに含める脆弱性レベル
          blackducksca_upload_sarif_report: true                   # Code Scanningへ自動アップロード

          # SARIF アップロード時に必要(GitHub Tokenは自動で利用可能)
          github_token: ${{ secrets.GITHUB_TOKEN }}

設定のポイント

1. 権限設定

permissions:
  contents: read
  security-events: write  # SARIF形式のレポートをアップロードするために必須

security-events: write 権限がないと、Code ScanningへのアップロードがPermission Deniedエラーで失敗します。

2. 脆弱性レベルのフィルタリング

blackducksca_reports_sarif_severities: "CRITICAL,HIGH"
blackducksca_fixpr_filter_severities: "CRITICAL,HIGH"

GitHub上での確認方法

Code Scanningタブでの表示

ワークフローを実行すると、GitHubリポジトリの Security > Code scanning タブに検出された脆弱性が表示されます。

Code Scanningタブの表示例

フィルタリング機能

デフォルトブランチ以外の結果を確認したい場合は、ブランチフィルタを使用できます。

脆弱性の詳細確認

各脆弱性をクリックすると、以下の情報を確認できます。

  • 脆弱性の詳細説明
  • 影響を受けるパッケージとバージョン
  • 推奨される修正方法
  • CVSS スコア

脆弱性の解消

コードを変更し、再スキャンを実行して脆弱性が解消されると、該当のアラートは自動的に Closed タブに移動します。

Artifacts

スキャン実行後、Actions の実行結果に Artifacts として SARIF ファイルがアップロードされます。これをダウンロードして、詳細な解析結果を確認できます。

実装時のハマりポイント

1. ローカル環境での検証の難しさ

act を使用してローカル環境でGitHub Actionsを実行しようとしましたが、Black Duckサーバーとの通信がうまくいかず、ローカル環境での検証はできませんでした。

本番環境でのテストが必要になるため、テスト用のリポジトリで事前検証することを推奨します。

2. pull_requestトリガーの制限

pull_request トリガーでワークフローを実行した場合、Blackduck SCA SARIF Issues Fetcher という機能が正しく動作しません。
そのため、セキュリティタブにアラートが登録されませんでした。

そのため、push トリガーまたは workflow_dispatch トリガーを使用することを推奨します。

まとめ

Black DuckのOSS脆弱性チェック結果をGitHub Code Scanningに統合することで、以下のメリットが得られました。

  • 情報の一元化: 開発者全員がGitHub上で脆弱性情報を確認可能
  • 迅速な対応: 日常的に使用するGitHubに統合されることで、脆弱性への対応が迅速化
  • 運用の標準化: Black Duckを正とする運用に統一し、ツール間の差分問題を解消

GitHub ActionsとBlack Duckを組み合わせることで、セキュアな開発環境を効率的に構築できます。ぜひ参考にしてみてください。

参考資料

GitHubで編集を提案

Discussion