AWSのInspectorでSBOM Exportしてみた 後編

# 導入
- [AWSのInspectorでSBOM Exportしてみた 前編](https://qiita.com/asw_hoggge/items/b30157a9226be35ff3f1)の続きです。
- Amazon Athenaを用いて、AWS InspectorでExportしたSBOMファイルを分析したいと思います。

## Athenaでの分析手順

### SBOMフォーマットの確認
- 前回の記事では`CyclonedX 1.4 SBOM フォーマット`でSBOMファイルをExportしています。
- `CyclonedX 1.4 SBOM フォーマット`はメタデータ、コンポーネント、脆弱性情報を含んでいます。
```json
{
  "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"
    },
    {
      "type": "application",
      "name": "libss2",
      "purl": "pkg:dpkg/libss2@1.44.5-1+deb10u3?arch=ARM64&epoch=0&upstream=libss2-1.44.5-1+deb10u3.src.dpkg",
      "bom-ref": "2f4d199d4ef9e2ae639b4f8d04a813a2"
    },
    {
      "type": "application",
      "name": "liblz4-1",
      "purl": "pkg:dpkg/liblz4-1@1.8.3-1+deb10u1?arch=ARM64&epoch=0&upstream=liblz4-1-1.8.3-1+deb10u1.src.dpkg",
      "bom-ref": "9a6be8907ead891b070e60f5a7b7aa9a"
    },
    {
      "type": "application",
      "name": "mawk",
      "purl": "pkg:dpkg/mawk@1.3.3-17+b3?arch=ARM64&epoch=0&upstream=mawk-1.3.3-17+b3.src.dpkg",
      "bom-ref": "c2015852a729f97fde924e62a16f78a5"
    },
    {
      "type": "application",
      "name": "libgmp10",
      "purl": "pkg:dpkg/libgmp10@6.1.2+dfsg-4+deb10u1?arch=ARM64&epoch=2&upstream=libgmp10-6.1.2+dfsg-4+deb10u1.src.dpkg",
      "bom-ref": "52907290f5beef00dff8da77901b1085"
    },
    {
      "type": "application",
      "name": "ncurses-bin",
      "purl": "pkg:dpkg/ncurses-bin@6.1+20181013-2+deb10u3?arch=ARM64&epoch=0&upstream=ncurses-bin-6.1+20181013-2+deb10u3.src.dpkg",
      "bom-ref": "cd20cfb9ebeeadba3809764376f43bce"
    }
  ],
  "vulnerabilities": [
    {
      "id": "CVE-2022-40897",
      "affects": [
        {
          "ref": "a74a4862cc654a2520ec56da0c81cdb3"
        },
        {
          "ref": "0119eb286405d780dc437e7dbf2f9d9d"
        }
      ]
    }
  ]
}
              

```
([Amazon Inspector の CyclonedX 1.4 SBOM フォーマットの例](https://docs.aws.amazon.com/ja_jp/inspector/latest/user/sbom-export.html)からフォーマット例を抜粋)


### Athenaテーブルの作成
- AWSコンソールにログインし、Athenaサービス画面を開きます。
- `CyclonedX 1.4 SBOM フォーマット`に沿う形式でAthenaテーブルを作成します。[^1]
```
CREATE EXTERNAL TABLE IF NOT EXISTS `sbom_cyclone` (
  bomFormat string,
  specVersion string,
  version int,
  `metadata` struct<
    timestamp:string,
    component:struct<
      type:string,
      name:string,
      version:string
    >,
    properties: array<
      struct<
        name:string,
        value:string
      >
    >
  >,
  components array<
    struct<
      type:string,
      name:string,
      purl:string,
      version:string
    >
  >,
  vulnerabilities array<
    struct<
      id:string,
      affects: array<
        struct<
          ref:string
        >
      >
    >
  >
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://[bucket]/[prefix]/';
```
[^1]: Athenaのサービス仕様上、カラムにハイフンを指定することができなかったため、本記事では`bom-ref`はテーブルから除外しています。`bom-ref`の値も取得したい場合、S3配置をトリガにJSON内の`bom-ref`を`bom_ref`に加工するLambda関数を実行した上で、テーブル作成時のカラムに`bom_ref`を指定する等の工夫が必要になりそうです。

### 検索クエリの実行
- コンポーネントの一覧化
```
SELECT 
  component.type AS type,
  component.name AS name,
  component.purl AS purl,
  component.version AS version
FROM sbom_cyclone, UNNEST(components) AS t (component);
```

- CVEの一覧化[^2]
[^2]: 脆弱性の影響を受けるコンポーネントを特定できるよう、`vulnerabilities`の`affects`配列内に`bom-ref`の値が記載されます。脆弱性情報の確認はInspectorコンソールで充足できるとは思いつつ、Athena上からも分析したい場合は注釈[^1]を参考にした実装が必要かと思います。
```
SELECT 
  vulnerability.id AS CVE
FROM sbom_cyclone, UNNEST(vulnerabilities) AS t (vulnerability);
```

## 注意事項
- 本記事は万全を期して作成していますが、お気づきの点がありましたら、ご連絡よろしくお願いします。
- なお、本記事の内容を利用した結果及び影響について、筆者は一切の責任を負いませんので、予めご了承ください。