Header Image

エンド ツー エンドのソフトウェア サプライ チェーンを理解する

Nicholas Liffen
Nicholas Liffen // Director, GitHub Advanced Security // GitHub

ソフトウェア サプライ チェーンを包括的に理解することは、セキュリティ体制と脅威サーフェスの理解に重要です。サプライ チェーン セキュリティが複雑な理由の 1 つは、依存性を理解してセキュリティで保護する必要があるだけではなく、一時的な依存性を理解してセキュリティで保護する必要もあることです。つまり、依存性の依存性であり、さらにそれらの依存性の依存性などです。Ruby や Node.js などの一部のプログラミング プラットフォームには、一時的な依存性を指定するロック ファイルが含まれています。しかし、そうでないプラットフォームもあります。

このガイドでは、GitHub Actions で GitHub Dependency Submission API を使用して一時的な依存関係のマップを作成し、それを依存関係グラフに渡すことで、Dependabot が全ての依存関係をスキャンして警告できるようにします。続いてソフトウェア部品表(SBOM)の作成方法を説明することにより、全ての依存関係を報告し、一貫性のある再現可能な形式でサプライ チェーン セキュリティの状態を関連する利害関係者と共有できるようにします。今回も、GitHub プリンシパル フィールド セキュリティ スペシャリストの Keith Hoodlet がご意見番として参加します。


このガイドの学習内容

  • GitHub Actions で依存関係のスナップショットを作成し、GitHub Dependency Submission API を使ってアップロードする方法

  • 依存関係グラフで結果を表示する方法

  • GitHub Actions でソフトウェア部品表(SBOM)を自動的にエクスポートする方法


1. 現在の依存関係グラフを確認します。

Web Goat リポジトリで [インサイト] タブを選択し、サイドバーから [依存関係グラフ] を選択します。この時点で Web Goat の依存関係が 4 ページにわたってリストアップされているはずです。 

2. GitHub Actions で依存関係のスナップショットを作成し、アップロードします。

依存関係マップは手作業でも作成できますが、今回は GitHub Actions で自動生成することにします。

最適なセキュリティを実現するには、依存関係グラフをできるだけ最新の状態に保つ必要があります。つまり、早い段階で頻繁に更新しなければなりません。致命的な脆弱性があるかどうかを判断するための構築を待ってはいられません。最新の状態を維持するには、自動化が一番です

Keith Hoodlet
Keith Hoodlet // Principal Field Security Specialist, CodeQL // GitHub

Web Goat リポジトリで [アクション] タブを選択します。

[新しいワークフロー] を選択し、次のように名前を付けます。upload-dependencies-of-dependenices.yml.

以下のワークフローを upload-dependencies-of-dependenices.yml ファイルに追加します。

name: "Dependency Submission API Upload"

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  schedule:
    - cron: '26 18 * * 1'

jobs:
  depSubmissionAPIUpload:
    name: Analyze
    runs-on: 'ubuntu-latest'
    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
    - name: Submit Dependency Snapshot
      uses: advanced-security/maven-dependency-submission-action@v3

これにより、GitHub で作成された maven-dependency-submission-action というアクションが使用され、Maven で一時的な依存関係を含む全ての依存関係のスナップショットが取得され、Dependency Submission API を介して GitHub にアップロードされます。

同様のアクションは、他のビルドシステムやプラットフォーム (GoGradleMillScala など) でも見られます。

3. 結果をレビューします。

もう一度、Web Goat リポジトリの [インサイト] タブを選択して、次にサイドバーの [依存関係グラフ] を選択します。

今の時点で依存関係は 16 ページ前後になり、これらの依存関係とそのセキュリティ態勢に新たな可視性が得られているはずです。

SBOM を生成する

ソフトウェア部品表 (SBOM) のアイディアは、サプライ チェーン セキュリティに対する懸念の高まりや、ソフトウェア サプライ チェーンの透明性を高めようとする世界中の規制当局や政府機関の勧告や必須要件を受け、ますます重要となっています。SBOM の便利な点は、ソフトウェア サプライ チェーンのスナップショットとそのセキュリティ態勢を、エクスポート可能な標準形式で共有できることです。  幸いなことに、GitHub が皆さんのリポジトリごとに作成できる依存関係グラフは SBOM であり、業界標準の SPDX 形式でエクスポートできます。

1. 迅速かつ簡単なエクスポート。

Web Goat リポジトリで [インサイト] タブを選択し、サイドバーから [依存関係グラフ] を選択します。

[Export SBOM] ボタンを選択します。

これで完了です。

Dependency Graph settings with Export SBOM button highlighted

2. GitHub Actions を使用した SBOM のエクスポートとアップロードの自動化。

次はこのプロセスを自動化してみましょう。やり方は前述の一時的な依存関係の報告と同じです。 

Web Goat リポジトリで [アクション] タブを選択します。

[新しいワークフロー] を選択し、次のように名前を付けます。SBOM.yml.

name: SBOM Generator



on:
  push:
    branches: [ "main" ]



  workflow_dispatch:



permissions: read-all



jobs:
  build:
    runs-on: ubuntu-latest



    steps:
      - uses: actions/checkout@v3



      - uses: advanced-security/sbom-generator-action@v0.0.1
        id: sbom
        env: 
          GITHUB_TOKEN: ${{ github.token }}
      - uses: actions/upload-artifact@v3.1.0
        with: 
          path: ${{steps.sbom.outputs.fileName }}
          name: "SBOM"

これにより、GitHub で作成されたファーストパーティアクション sbom-generator-action を使用して SBOM JSON ファイルを生成し、リポジトリのメインブランチに変更をプッシュするたびにアーティファクトとしてアップロードすることで、手元の SBOM を常に最新の状態に保つことができます。

次の項目: GitHub Advanced Security 上級モジュールのラップアップ

ここで、これまでに学んだことを復習し、GitHub Advanced Security で他に何ができるかを見てみましょう