Amazon Inspector SBOM 生成器 - Amazon Inspector
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Inspector SBOM 生成器

软件物料清单(SBOM)是一个包含构建软件所需的组件、库和模块的正式结构化列表。Amazon Inspector SBOM 生成器(Sbomgen)是一种工具,可为存档、容器映像、目录、本地系统以及已编译 Go 文件和 Rust 二进制文件生成 SBOM。Sbomgen 可扫描其中包含已安装程序包相关信息的文件。Sbomgen 找到相关文件后,它便会提取程序包名称、版本和其他元数据。然后,Sbomgen 将程序包元数据转换为 CycloneDX SBOM。您可以使用Sbomgen以文件形式生成 CycloneDX SBOM,也可以在 STDOUT 中生成,然后发送到 Amazon SBOMs Inspector 进行漏洞检测。也可以在 CI/CD 集成中使用 Sbomgen,它会在部署管道中自动扫描容器映像。

支持的程序包类型

Sbomgen 会收集以下程序包类型的清单:

  • Alpine APK

  • Debian/Ubuntu DPKG

  • Red Hat RPM

  • C#

  • Go

  • Java

  • Node.js

  • PHP

  • Python

  • Ruby

  • Rust

支持的容器映像配置检查

Sbomgen 可扫描独立的 Dockerfile 并根据现有映像生成历史记录来查找安全问题。有关更多信息,请参阅 Amazon Inspector Dockerfile 检查

安装 Sbomgen

Sbomgen 仅适用于 Linux 操作系统。

如果希望 Sbomgen 分析本地缓存的映像,则必须安装 Docker。如果要分析作为 .tar 文件导出的映像或托管在远程容器注册表中的映像,则无需 Docker。

Amazon Inspector 建议在至少具有以下硬件规格的系统上运行 Sbomgen:

  • 4 核 CPU

  • 8 GB RAM

要安装 Sbomgen,请执行以下操作
  1. 从架构的正确 URL 中下载最新 Sbomgen zip 文件:

    Linux AMD64:https://amazon-inspector-sbomgen.s3.amazonaws.com/latest/linux/amd64/inspector-sbomgen.zip

    Linux ARM64:https://amazon-inspector-sbomgen.s3.amazonaws.com/latest/linux/arm64/inspector-sbomgen.zip

    或者,您可以下载先前版本的 Amazon Inspector SBOM 生成器 zip 文件

  2. 使用以下命令解压缩下载的文件:

    unzip inspector-sbomgen.zip

  3. 检查提取的目录中是否包含以下文件:

    • inspector-sbomgen— 这是你要执行的生成工具 SBOMs。

    • README.txt – 这是说明如何使用 Sbomgen 的文档。

    • LICENSE.txt – 此文件包含 Sbomgen 的软件许可证。

    • licenses – 此文件夹包含 Sbomgen 所使用的第三方程序包的许可证信息。

    • checksums.txt – 此文件提供 Sbomgen 工具的哈希值。

    • sbom.json – 这是 Sbomgen 工具的 CycloneDX SBOM。

    • WhatsNew.txt - 此文件包含汇总的变更日志,因此您可以快速查看各 Sbomgen 版本之间的重大更改和改进。

  4. (可选)使用以下命令验证该工具的真实性和完整性:

    sha256sum < inspector-sbomgen

    1. 将结果与 checksums.txt 文件的内容进行比较。

  5. 使用以下命令为该工具授予可执行权限。

    chmod +x inspector-sbomgen

  6. 使用以下命令验证是否已成功安装 Sbomgen:

    ./inspector-sbomgen --version

    您应该可以看到类似于如下所示的输出内容:

    Version: 1.X.X

使用 Sbomgen

本部分介绍可以使用 Sbomgen 的不同方式。可以通过内置示例进一步了解如何使用 Sbomgen。要查看这些示例,请运行 list-examples 命令:

./inspector-sbomgen list-examples

为容器映像生成 SBOM 并输出结果

您可以使用Sbomgen SBOMs 为容器镜像生成并将结果输出到文件中。可以使用 container 子命令启用此功能。

示例命令

在以下代码片段中,可以将 image:tag 替换为您自己的映像 ID,将 output_path.json 替换为要保存输出的路径。

# generate SBOM for container image ./inspector-sbomgen container --image image:tag -o output_path.json
注意

扫描时间和性能取决于映像大小和层数。映像较小不仅可以提高 Sbomgen 性能,还可以减少潜在的攻击面。映像较小还可以缩短映像构建、下载和上传的时间。

Sbomgen与一起使用时 ScanSbom,Amazon Inspector Scan API 不会处理 SBOMs 包含超过 5,000 个包裹的包裹。在这种情况下,Amazon Inspector Scan API 会返回 HTTP 400 响应。

如果映像包含批量媒体文件或目录,请考虑使用 --skip-files 参数将它们排除在 Sbomgen 之外。

示例:常见错误案例

容器镜像扫描可能由于以下错误而失败:

  • InvalidImageFormat— 扫描带有损坏的 TAR 标头、清单文件或配置文件的格式错误的容器映像时发生。

  • ImageValidationFailure— 当容器映像组件的校验和或内容长度验证失败时发生,例如内容长度标头不匹配、清单摘要不正确或校验和校验失败。 SHA256

  • ErrUnsupportedMediaType— 当图像组件包含不支持的媒体类型时出现。有关支持的媒体类型的信息,请参阅支持的操作系统和媒体类型

Amazon Inspector 不支持该application/vnd.docker.distribution.manifest.list.v2+json媒体类型。但是,Amazon Inspector 确实支持清单清单。扫描使用清单列表的图像时,您可以通过--platform参数明确指定要使用哪个平台。如果未指定--platform参数,Amazon Inspector SBOM 生成器会根据清单的运行平台自动选择清单。

从目录和存档生成 SBOM

您可以使用Sbomgen SBOMs 从目录和档案中生成。可以使用 directoryarchive 子命令启用此功能。如果您想从项目文件夹(例如下载的 Git 存储库)生成 SBOM,Amazon Inspector 建议使用此特征。

示例命令 1

以下代码片段显示了从目录文件生成 SBOM 的子命令。

# generate SBOM from directory ./inspector-sbomgen directory --path /path/to/dir -o /tmp/sbom.json
示例命令 2

以下代码片段显示了从存档文件生成 SBOM 的子命令。仅支持 .zip.tar.tar.gz 存档格式。

# generate SBOM from archive file (tar, tar.gz, and zip formats only) ./inspector-sbomgen archive --path testData.zip -o /tmp/sbom.json

从 Go 或 Rust 已编译二进制文件生成 SBOM

您可以使用Sbomgen SBOMs 从编译后的文件Go和Rust二进制文件中生成。可以通过 binary 子命令启用此功能:

./inspector-sbomgen binary --path /path/to/your/binary

将 SBOM 发送给 Amazon Inspector 进行漏洞识别

除了生成 SBOM 外,您还可以使用 Amazon Inspector Scan API 中的单个命令发送 SBOM 进行扫描。Amazon Inspector 会先评估 SBOM 的内容是否存在漏洞,然后再将调查发现返回给 Sbomgen。根据您的输入,会显示调查发现或将其写入文件。

注意

您必须拥有 Amazon Web Services 账户 具有读取权限的活动用户InspectorScan-ScanSbom才能使用此功能。

要启用此功能,请将 --scan-sbom 参数传递给 Sbomgen CLI。也可以将 --scan-sbom 参数传递给以下任何一个 Sbomgen 子命令:archivebinarycontainerdirectorylocalhost

注意

Amazon Inspector Scan API 无法 SBOMs 处理超过 2,000 个包裹。在这种情况下,Amazon Inspector Scan API 会返回 HTTP 400 响应。

您可以使用以下 Amazon CLI 参数通过 Amazon 个人资料或 IAM 角色向 Amazon Inspector 进行身份验证:

--aws-profile profile --aws-region region --aws-iam-role-arn role_arn

您还可以通过向 Sbomgen 提供以下环境变量,来向 Amazon Inspector 进行身份验证。

AWS_ACCESS_KEY_ID=$access_key \ AWS_SECRET_ACCESS_KEY=$secret_key \ AWS_DEFAULT_REGION=$region \ ./inspector-sbomgen arguments

要指定响应格式,请使用 --scan-sbom-output-format cyclonedx 参数或 --scan-sbom-output-format inspector 参数。

示例命令 1

此命令可为最新 Alpine Linux 版本创建 SBOM,然后扫描 SBOM,并将漏洞结果写入 JSON 文件。

./inspector-sbomgen container --image alpine:latest \ --scan-sbom \ --aws-profile your_profile \ --aws-region your_region \ --scan-sbom-output-format cyclonedx \ --outfile /tmp/inspector_scan.json
示例命令 2

此命令使用 Amazon 证书作为环境变量向 Amazon Inspector 进行身份验证。

AWS_ACCESS_KEY_ID=$your_access_key \ AWS_SECRET_ACCESS_KEY=$your_secret_key \ AWS_DEFAULT_REGION=$your_region \ ./inspector-sbomgen container --image alpine:latest \ -o /tmp/sbom.json \ --scan-sbom \ --scan-sbom-output-format inspector
示例命令 3

此命令可使用 IAM 角色的 ARN 向 Amazon Inspector 进行身份验证。

./inspector-sbomgen container --image alpine:latest \ --scan-sbom \ --aws-profile your_profile \ --aws-region your_region \ --outfile /tmp/inspector_scan.json --aws-iam-role-arn arn:aws:iam::123456789012:role/your_role

使用其他扫描仪增强检测能力

Amazon Inspector SBOM 生成器根据所使用的命令应用预定义的扫描仪。

默认扫描仪组

每个 Amazon Inspector SBOM 生成器子命令都会自动应用以下默认扫描仪组。

  • 对于directory子命令:二进制、 programming-language-packages、dockerfile 扫描器组

  • 对于localhost子命令:os, programming-language-packages,生态系统外扫描仪组

  • 对于container子命令:os、、extra-cosystems programming-language-packages、dockerfile、二进制扫描器组

特殊扫描器

要包括默认扫描仪组之外的扫描仪,请使用--additional-scanners选项后面加上要添加的扫描仪的名称。以下是显示如何执行此操作的命令示例。

# Add WordPress installation scanner to directory scan ./inspector-sbomgen directory --path /path/to/directory/ --additional-scanners wordpress-installation -o output.jso

以下是显示如何使用逗号分隔列表添加多个扫描仪的命令示例。

./inspector-sbomgen container --image image:tag --additional-scanners scanner1,scanner2 -o output.json

自定义扫描以排除特定文件

分析和处理容器映像时,Sbomgen 会扫描该容器映像中所有文件的大小。您可以自定义扫描,以排除特定文件或查找特定程序包。

要减少磁盘消耗、RAM 消耗、运行时间以及跳过超过所提供阈值的文件,请将 --max-file-size 参数与 container 子命令一起使用:

./inspector-sbomgen container --image alpine:latest \ --outfile /tmp/sbom.json \ --max-file-size 300000000

禁用进度指示器

Sbomgen 会显示一个旋转的进度指示器,该指示器可能会导致 CI/CD 环境中出现过多的斜杠字符。

INFO[2024-02-01 14:58:46]coreV1.go:53: analyzing artifact | \ / | \ / INFO[2024-02-01 14:58:46]coreV1.go:62: executing post-processors

可以使用以下 --disable-progress-bar 参数禁用进度指示器:

./inspector-sbomgen container --image alpine:latest \ --outfile /tmp/sbom.json \ --disable-progress-bar

使用 Sbomgen 向私有注册表进行身份验证

通过提供您的私有注册表身份验证凭证,您可以 SBOMs 从私有注册表中托管的容器生成。可通过以下方法提供这些凭证:

使用缓存的凭证进行身份验证(推荐)

对于此方法,请先向容器注册表进行身份验证。例如,如果您使用的是 Docker,则可以使用 Docker login 命令向容器注册表进行身份验证:docker login

  1. 向容器注册表进行身份验证。例如,如果您使用的是 Docker,则可以使用 Docker login 命令向注册表进行身份验证:

  2. 向容器注册表进行身份验证后,在注册表中的容器映像上使用 Sbomgen。要使用以下示例,请将 image:tag 替换为要扫描的映像的名称:

./inspector-sbomgen container --image image:tag

使用交互式方法进行身份验证

对于这种方法,您需要提供用户名作为参数,Sbomgen 会在需要时提示您输入安全密码。

要使用以下示例,请将 image:tag 替换为要扫描的映像的名称,将 your_username 替换为有权访问该映像的用户名:

./inspector-sbomgen container --image image:tag --username your_username

使用非交互式方法进行身份验证

对于这种方法,请将您的密码或注册表令牌存储在 .txt 文件中。

注意

当前用户应该只能读取此文件。该文件应还包含一行密码或令牌。

要使用以下示例,请将 your_username 替换为您的用户名,将 password.txt 替换为包含一行密码或令牌的 .txt 文件,将 image:tag 替换为要扫描的映像的名称:

INSPECTOR_SBOMGEN_USERNAME=your_username \ INSPECTOR_SBOMGEN_PASSWORD=`cat password.txt` \ ./inspector-sbomgen container --image image:tag

来自 Sbomgen 的输出内容示例

下面是使用 Sbomgen 清点的容器映像的 SBOM 示例。

{ "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": "library", "name": "dnf", "version": "4.18.0", "purl": "pkg:pypi/dnf@4.18.0", "properties": [ { "name": "amazon:inspector:sbom_generator:source_file_scanner", "value": "python-pkg" }, { "name": "amazon:inspector:sbom_generator:source_package_collector", "value": "python-pkg" }, { "name": "amazon:inspector:sbom_generator:source_path", "value": "/usr/lib/python3.12/site-packages/dnf-4.18.0.dist-info/METADATA" }, { "name": "amazon:inspector:sbom_generator:is_duplicate_package", "value": "true" }, { "name": "amazon:inspector:sbom_generator:duplicate_purl", "value": "pkg:rpm/fedora/python3-dnf@4.18.0-2.fc39?arch=noarch&distro=39&epoch=0" } ] }, { "bom-ref": "comp-3", "type": "library", "name": "libcomps", "version": "0.1.20", "purl": "pkg:pypi/libcomps@0.1.20", "properties": [ { "name": "amazon:inspector:sbom_generator:source_file_scanner", "value": "python-pkg" }, { "name": "amazon:inspector:sbom_generator:source_package_collector", "value": "python-pkg" }, { "name": "amazon:inspector:sbom_generator:source_path", "value": "/usr/lib64/python3.12/site-packages/libcomps-0.1.20-py3.12.egg-info/PKG-INFO" }, { "name": "amazon:inspector:sbom_generator:is_duplicate_package", "value": "true" }, { "name": "amazon:inspector:sbom_generator:duplicate_purl", "value": "pkg:rpm/fedora/python3-libcomps@0.1.20-1.fc39?arch=x86_64&distro=39&epoch=0" } ] } ] }