Amazon InspectorからSBOMを出力する

# 概要
Amazon Inspectorを有効化してから、EC2スキャン結果に対するSBOMエクスポートまでの流れを備忘録として書き起こす。

# 前提
- EC2インスタンス
    - Amazon Linux 2023 (al2023-ami-2023.6.20241031.0-kernel-6.1-x86_64)
# 公式
- Amazon Inspectorを使ったSBOM出力手順：https://docs.aws.amazon.com/ja_jp/inspector/latest/user/sbom-export.html
- アクセス許可・ポリシー周りの設定：https://docs.aws.amazon.com/ja_jp/inspector/latest/user/findings-managing-exporting-reports.html

# 手順
## Amazon Inspectorの有効化
ナビゲーションペインから「Inspectorをアクティブ化」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239558/7e72b2cf-c998-884a-3602-ba8e716c5b50.png)

「Inspectorをアクティブ化」を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239558/ea52710a-eec1-9a8a-b4d3-2c6c51f2bae3.png)
## SBOM出力用S3バケットの作成
- S3バケットのリージョンと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/*"
    				}
    			}
    		}
    	]
    }
    ```
## 出力レポートの暗号化用のKMSキーの作成
- KMSのリージョンは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/*"
    				}
    			}
    		}
    	]
    }
    ```
## 出力
ナビゲーションペインから「Export SBOMs」を選択
- ファイルタイプ：SBOMのフォーマットを「CycloneDX」「SPDX」のどちらかを選択。詳細は「ソフトウェア管理に向けたSBOM（Software Bill of Materials）の導入に関する手引ver2.0」を参照。https://www.meti.go.jp/press/2024/08/20240829001/20240829001-1r.pdf
- S3 URI：作成したS3バケット
- KMS key：作成したKMSキー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239558/e3892d31-5877-14c1-d6d3-947c5140eed3.png)
## 出力結果
- CycloneDXで出力
- 2分後、指定したS3バケットにjsonファイルが出力された
- オブジェクトは、指定したKMSキーで暗号化してあった (SSE-KMS)
## 出力内容
- CycloneDX(v1.4)のデータレファレンス：https://cyclonedx.org/docs/1.4/json/
- Inspectorが出力するSBOM(CycloneDX)の構造は以下の通り
    ```json
    {
    	"bomFormat": "CycloneDX",
    	"specVersion": "1.4",
    	"version": 1,
    	"metadata": {
    		"timestamp": "",
    		"component": {},
    		"properties": []
    	},
    	"components": [],
    	"vulnerabilities": []
    }
    ```
### metadata
- timestamp：生成時刻
- component：BOMが表現するコンポーネント
    ```
    "component": {
        "type": "operating-system",
        "name": "AMAZON_LINUX_2023",
        "version": "6.1.112-124.190.amzn2023.x86_64"
    }
    ```
- properties：key-value形式で設定できるプロパティ。Inspectorの場合は、スキャン対象のリソース情報（今回は、Inspector EC2スキャン対象のEC2インスタンス）を入れているようだ。
    ```
    "properties": [
        {
            "name": "amazon:inspector:ami",
            "value": "ami-066a7fbea5161f451"
        },
        {
            "name": "amazon:inspector:arch",
            "value": "x86_64"
        },
        {
            "name": "amazon:inspector:account_id",
            "value": <AWSアカウント番号>
        },
        {
            "name": "amazon:inspector:resource_type",
            "value": "AWS_EC2_INSTANCE"
        },
        {
            "name": "amazon:inspector:instance_id",
            "value": <EC2インスタンスID>
        },
        {
            "name": "amazon:inspector:resource_arn",
            "value": "arn:aws:ec2:us-west-2:<AWSアカウントの番号>:instance/<EC2インスタンスID>"
        }
    ]
    ```
    
### components
- ソフトウェアコンポーネントの列挙
    - type：コンポーネントタイプ (rpmのものはapplication、pypiのものはlibraryに区分されていた)
    - name：コンポーネント名
    - purl：パッケージURL（qualifiersとして、archやepoch、upstreamが指定されていた）
    - version：コンポーネントバージョン
    - bom-ref：レファレンス用の識別子
    ```
    "components": [
        {
            "type": "application",
            "name": "libedit",
            "purl": "pkg:rpm/libedit@3.1-38.20210714cvs.amzn2023.0.2?arch=X86_64&epoch=0&upstream=libedit-3.1-38.20210714cvs.amzn2023.0.2.src.rpm",
            "version": "3.1",
            "bom-ref": "40853ebb7fa05c9370e08063b4fd6e94"
        },(以下省略)
    ]
    ```
- コンポーネントの照合
    - rpmパッケージ：出力したSBOM内には471件あったが、「rpm -qa」を叩いたら476件あった。どのコンポーネントが抜けていたかまでは特定してない。そのうち調べる。
    - pypiパッケージ：出力したSBOM内には11件あった。デフォルトで「/usr/lib/python3.9/site-packages/」に配置されているパッケージが読み取られた。
### vulnerabilities
- 最新のAmazon Linux 2023で試したので、今回は脆弱性数0でした。今後、脆弱性が検出されたら、追記します。