この記事について

今回、Amazon Inspectorを使ってSBOMの出力を行ってみました。
これが初めての経験だったので、その過程で学んだことを共有したいと思います。

はじめに

SBOMとは?

SBOM(Software Bill of Materials)は、ソフトウェア製品の「部品表」です。具体的には、ソフトウェアを構成するコンポーネント、その依存関係、ライセンス情報などを一覧化した文書のことを指します。

主な用途は以下の通りです。

  • オープンソースソフトウェア(OSS)のライセンス管理
  • 脆弱性の管理
  • ソフトウェアサプライチェーンのリスク

SBOMの特徴的な点として、CycloneDXやSPDXなどの標準化された書式があります。これにより、異なるツールや組織間でSBOMデータを簡単に共有・利用できるようになっています。

近年、IoTデバイスを含む様々なソフトウェア製品のセキュリティ管理において、SBOMの重要性が高まっています。ソフトウェアの透明性を向上させ、脆弱性の迅速な特定と対応を可能にし、ライセンスリスクの管理も容易にするためです。
世界的に見ても、各国の規制当局や業界団体がSBOMの採用を推奨または要求する動きが広がっています。ソフトウェア開発のベストプラクティスとして認識されつつあります。
ソフトウェアエコシステムが複雑化する中、SBOMはシステム全体のソフトウェア構成を網羅的に把握するための重要なツールとなっています。今後のソフトウェア開発、特にセキュリティ面での重要性がさらに増すことが予想されます。

※参考: セキュリティ用語解説(NRI secure様)

Amazon Inspectorとは?

Amazon Inspectorは、AWSが提供する脆弱性管理サービスです。
EC2やECR、Lambda等のAWSワークロードを一括でスキャンし、自動的・継続的に既知の脆弱性がないかを確認してくれます。
※参考: Amazon Inspectorの公式ドキュメント(AWS)

注目すべき点として、Amazon InspectorはSBOM(Software Bill of Materials)の生成機能も備えています。
この機能は2022年11月29日のAWS re:Invent 2022で発表され、ソフトウェアコンポーネントの可視化とセキュリティ管理をより容易にしました。

次のセクションでは、Amazon Inspectorを使用してSBOMを出力する具体的な手順を紹介します。

AmazonInspectorでのSBOM出力手順

以下の記事を参考にしてSBOMの出力をおこないました。

今回は、EC2とLambdaをスキャンし、SBOMを出力しました。
SBOM構成

 

Amazon Inspectorの有効化

  1. AWSコンソールより、Amazon Inspectorのサービスを表示。
  2. ナビゲーションペインより、「inspectorをアクティブ化」を押下。
    インスペクターをアクティブ化
  3. 「インスペクターをアクティブ化」ボタンを押下。
    インスペクターのアクティブ化ボタン
  4. ナビゲーションペインより「Resources coverage」を参照し、た印象のリソースがスキャン対象になっていることを確認する。
    (デフォルトでは、全リソースがスキャン対象となっている。)

出力先S3バケットの作成

  1. Amazon Inspectorと同一のリージョンに出力先S3バケットを作成する。
  2. Inspectorから出力先バケットへのアップロードを許可する。
    以下、公式が提供するバケットポリシーを参考に設定する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allow-inspector",
            "Effect": "Allow",
            "Principal": {
                "Service": "inspector2.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:inspector2:Region:111122223333:report/*"
                }
            }
        }
    ]
}

SBOMの暗号化用のKMSキーの作成

SBOMの出力時、出力ファイルを暗号化する。
ここでは、暗号化用のキーを作成する。
Amazon Inspectorと同一のリージョンにKMSを作成する。
(以下、公式が提供するキーポリシーのサンプル)

{
    "Sid": "Allow Amazon Inspector to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "inspector2.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
            "aws:SourceArn": "arn:aws:inspector2:Region:111122223333:report/*"
        }
    }
}

 

SBOMの出力

  1. AWSコンソールより、Amazon Inspectorのサービスを表示。
  2. ナビゲーションペインより、「Export SBOMs」を押下。
  3. 以下の情報を入力し、Exportボタンを押下。
    • ファイルタイプ:SBOMの形式
    • S3 URI:作成したS3バケットのURI
    • KMS Key: 作成したKMS KeyのArn

出力結果の確認

  1. 作成したS3バケットを参照し、SBOMが出力されていることを確認する。
    ※出力までに、2~3分程度の時間がかかる。
  2. 出力ファイルを確認し、コンポーネントが漏れなく表示されることを確認する。

引っ掛かったこと、調べたこと

プログラミング言語のサポート

一部の言語では、EC2のSSM Agentを無効化しないとスキャンが実行されない様子です。
※参照:Amazon Inspector でサポートされているオペレーティングシステムとプログラミング言語(AWS)

Amazon Inspector は現在、対象となる Amazon EC2 インスタンスでエージェントレススキャンを実行するときに、次のプログラミング言語をサポートしています。

詳細については、「エージェントレススキャン」を参照してください。
C#
Go
Java
JavaScript
PHP
Python
Ruby
Rust

NPMパッケージの出力

NPMパッケージを出力する際、package-lock.jsonだけではSBOMを出力できませんでした。
SBOM出力の際は、アセット本体(node_modules)も配置したら出力されるようになりました。
(Webpack等を用いてアセットを圧縮している場合、圧縮前のファイルも配置するよう注意が必要です。)

カスタムパスの設定

Amazon Inspectorの設定より、スキャン対象のディレクトリを明示的に指定できるようです。
ただし、今回はエージェントレスでスキャンしたので利用しませんでした。

まとめ

Amazon Inspectorを使用することで、AWSワークロードのSBOMを簡単に出力できることがわかりました。
ただし、以下の点に関しては注意が必要です。

  • 言語とフレームワークの対応
  • SBOM出力形式の確認

AWSユーザーとしては、SBOMの出力が手軽にできてとても便利でした。
軽く試用してみて、ご自身の環境に合うかご確認いただけますと幸いです。

参考文献