AWS環境でSBOMとなったら候補に上がってくるAmazon Inspectorですが、ECRのイメージからSBOMを出力するのに一工夫必要だったので記事を作成しました。

SBOM自体の概要については色々なサイトで紹介されていると思いますので省略します。

躓いた点

  • Amazon Inspectorコンソール上でのSBOM出力対象になるのは「継続スキャン」対象のECRのみ
  • Amazon Inspectorコンソール上でのSBOM Exportはライセンス情報を含まない
  • ライセンス情報は「Amazon Inspector SBOM Generator ライセンスコレクション」をコマンド実行する必要がある

これらの内容を手順に沿って解説していきます。

Amazon InspectorからSBOMを出力する

Inspectorの有効化

まずAmazon Inspectorを有効化する必要があります。

有効化と共に全てのスキャンが有効になります。(ECR,EC2,Lambdaなど)

 

今回はECR以外いらないので「アクション」のプルダウンから他を無効化します。

「すべてのスキャン」を選ぶとInspectorごと無効化されて一個前の画像になるので注意してください。

 

この時、ECR側の スキャン設定も強制的に更新されるので注意が必要です。

  • 通常スキャン→拡張スキャン
  • 継続スキャンなし→全てのリポジトリを継続的にスキャンする
  • プッシュ時スキャン→(前の設定のまま)

ここで自分はコスト削減のために「プッシュ時スキャン」でInspectorにECRを読み込ませたのですが、これが大きな間違いでした。

Inspectorのダッシュボードでスキャンが完了しても、SBOMの出力対象にはなりません。継続スキャンの対象のみ出力されます。


前準備:S3とKMSの設定について

(※検出結果レポートのページですが、S3とKMSの設定については共通です)

エクスポートするにはS3のバケットポリシーにInspectorの許可と、KMSにカスタマーマネージドキーを作成する必要があります。AWSのデフォルトキーは使えません。

ここも上記のリンクや色々なサイトや解説されているので省略します。


AWSコンソールでのエクスポート

「SBOMをエクスポート」をクリックし、設定したS3とKMSキーを指定してエクスポートします。

(前準備の設定が上手く言ってない場合、エクスポートボタンを押すとエラーになります)

出力例

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "version": 1,
  "metadata": {
    "timestamp": "2023-06-02T01:17:46Z",
    "component": null,
    "properties": [
      {
        "name": "imageId",
        "value": "sha256:c8ee97f7052776ef223080741f61fcdf6a3a9107810ea9649f904aa4269fdac6"
      },
      {
        "name": "architecture",
        "value": "arm64"
      },
      {
        "name": "accountId",
        "value": "111122223333"
      },
      {
        "name": "resourceType",
        "value": "AWS_ECR_CONTAINER_IMAGE"
      }
    ]
  },
  "components": [
    {
      "type": "library",
      "name": "pip",
      "purl": "pkg:pypi/pip@22.0.4?path=usr/local/lib/python3.8/site-packages/pip-22.0.4.dist-info/METADATA",
      "bom-ref": "98dc550d1e9a0b24161daaa0d535c699"
    },

  ],
  "vulnerabilities": [
    {
      "id": "CVE-2022-40897",
      "affects": [
        {
          "ref": "a74a4862cc654a2520ec56da0c81cdb3"
        },
        {
          "ref": "0119eb286405d780dc437e7dbf2f9d9d"
        }
      ]
    }
  ]
}

SBOMが出力されましたが、licensesの項目がありません。

「Inspector SBOM ライセンス」みたいな検索ワードでいくつかページが引っかかるのですが、どれもSBOM自体の概要を説明している箇所と、Inspectorのエクスポート解説を同じ記事でしているだけでした。

代わりに「vulnerabilities」項目があります。

これは脆弱性スキャン結果が反映されており、CVEから始まるコードが記載されています。

「共通脆弱性識別子(CVE)」と呼ばれるもので、特定の脆弱性を指す採番規格です。

ライセンス情報より脆弱性情報が欲しい場合はこちらのエクスポートがおすすめです。

ライセンス情報が入ったSBOMの出力

SBOMの出力目的がライセンス情報目当てだったので、他の方法を探していたところ以下のツールに辿り着きました。

Amazon Inspector SBOM Generator

Amazon Inspector SBOM Generator

こちらはローカルで実行するツールです。

Amazon Inspectorから派生したものですが、Inspector自体を有効化しなくても使用可能です。(AWSアカウント自体不要?)

SBOM生成に特化しており、Inspectorの脆弱性スキャンは実施されない様です。上記エクスポートであった「vulnerabilities」の項目がありません。

基本的には以下にインストールして使えると思います。

  • CodeBuild
  • ECSonEC2
  • 自分のPC

aws cliなどと同じくcurlでダウンロードしてunzipするだけで使えます。ただしlinux限定です。

スキャン対象に出来るのは以下の通り。

  • ディレクトリ
  • コンテナイメージ
  • アーカイブファイル
  • コンパイル済みバイナリ
  • マウントボリューム

今回自分はコンテナイメージに対して使用しました。


ライセンスコレクションの使い方

ライセンスコレクション

SBOM Generator のオプションコマンドとして、「ライセンスコレクション」が存在しています。

こちらを使用する事で、SBOMにライセンス情報を追加する事が出来ます。

使い方は簡単でコマンドに「--collect-licenses」を付けるだけ。

今回は動作検証のため、ECSが実行されているEC2上からセッションマネージャーで入って実行しました。

継続的に実施するならCodeBuildなどが良いと思います。

curl -OL https://amazon-inspector-sbomgen.s3.amazonaws.com/latest/linux/amd64/inspector-sbomgen.zip
unzip inspector-sbomgen.zip

sudo ./inspector-sbomgen container --image {対象イメージ名} --collect-licenses -o ./{任意のファイル名}.json

以下の様な形式で出力され、componentsに「licenses」のキーが追加されています。

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.5",
  "serialNumber": "urn:uuid:828875ef-8c32-4777-b688-0af96f3cf619",
  "version": 1,
  "metadata": {
    "timestamp": "2023-11-17T21:36:38Z",
    "tools": [
      {
        "vendor": "Amazon Web Services, Inc. (AWS)",
        "name": "Amazon Inspector SBOM Generator",
        "version": "1.0.0",
        "hashes": [
          {
            "alg": "SHA-256",
            "content": "10ab669cfc99774786301a745165b5957c92ed9562d19972fbf344d4393b5eb1"
          }
        ]
      }
    ],
    "component": {
      "bom-ref": "comp-1",
      "type": "container",
      "name": "fedora:latest",
      "properties": [
        {
          "name": "amazon:inspector:sbom_generator:image_id",
          "value": "sha256:c81c8ae4dda7dedc0711daefe4076d33a88a69a28c398688090c1141eff17e50"
        },
        {
          "name": "amazon:inspector:sbom_generator:layer_diff_id",
          "value": "sha256:eddd0d48c295dc168d0710f70364581bd84b1dda6bb386c4a4de0b61de2f2119"
        }
      ]
    }
  },
    "components": [
    {
        "bom-ref": "comp-2",
        "type": "application",
        "name": "sample-js-pkg",
        "version": "1.2.3",
        "licenses": [
            {
                "expression": "Apache-2.0 AND (MIT OR GPL-2.0-only)"
            }
        ],
        "purl": "pkg:npm/sample-js-pkg@1.2.3",
    }
  ]
}

SBOMの作成時間はイメージサイズによって変動し、大体1GB/1分です。

まとめ

今回はAmazon Inspectorと派生ツールを使ってSBOMを出力しました。

Amazon Inspectorのコンソール上からのエクスポートと、ツールを使うエクスポートで生成される情報が異なります。

目的にあったSBOM作成の一助になれば幸いです。