本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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,请执行以下操作
-
从架构的正确 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
-
使用以下命令解压缩下载的文件:
unzip inspector-sbomgen.zip
-
检查提取的目录中是否包含以下文件:
-
inspector-sbomgen
— 这是你要执行的生成工具 SBOMs。 -
README.txt
– 这是说明如何使用 Sbomgen 的文档。 -
LICENSE.txt
– 此文件包含 Sbomgen 的软件许可证。 -
licenses
– 此文件夹包含 Sbomgen 所使用的第三方程序包的许可证信息。 -
checksums.txt
– 此文件提供 Sbomgen 工具的哈希值。 -
sbom.json
– 这是 Sbomgen 工具的 CycloneDX SBOM。 -
WhatsNew.txt
- 此文件包含汇总的变更日志,因此您可以快速查看各 Sbomgen 版本之间的重大更改和改进。
-
-
(可选)使用以下命令验证该工具的真实性和完整性:
sha256sum < inspector-sbomgen
-
将结果与
checksums.txt
文件的内容进行比较。
-
-
使用以下命令为该工具授予可执行权限。
chmod +x inspector-sbomgen
-
使用以下命令验证是否已成功安装 Sbomgen:
./inspector-sbomgen --version
您应该可以看到类似于如下所示的输出内容:
Version: 1.X.X
使用 Sbomgen
本部分介绍可以使用 Sbomgen 的不同方式。可以通过内置示例进一步了解如何使用 Sbomgen。要查看这些示例,请运行 list-examples
命令:
./inspector-sbomgen list-examples
为容器映像生成 SBOM 并输出结果
您可以使用Sbomgen SBOMs 为容器镜像生成并将结果输出到文件中。可以使用 container
子命令启用此功能。
示例命令
在以下代码片段中,可以将
替换为您自己的映像 ID,将 image:tag
替换为要保存输出的路径。output_path.json
# generate SBOM for container image ./inspector-sbomgen container
--image image:tag
-ooutput_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 从目录和档案中生成。可以使用 directory
或 archive
子命令启用此功能。如果您想从项目文件夹(例如下载的 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 子命令:archive
、binary
、container
、directory
、localhost
。
注意
Amazon Inspector Scan API 无法 SBOMs 处理超过 2,000 个包裹。在这种情况下,Amazon Inspector Scan API 会返回 HTTP 400 响应。
您可以使用以下 Amazon CLI 参数通过 Amazon 个人资料或 IAM 角色向 Amazon Inspector 进行身份验证:
--aws-profile
profile
--aws-regionregion
--aws-iam-role-arnrole_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-regionyour_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
。
-
向容器注册表进行身份验证。例如,如果您使用的是 Docker,则可以使用 Docker
login
命令向注册表进行身份验证: -
向容器注册表进行身份验证后,在注册表中的容器映像上使用 Sbomgen。要使用以下示例,请将
替换为要扫描的映像的名称:image:tag
./inspector-sbomgen container --image
image:tag
使用交互式方法进行身份验证
对于这种方法,您需要提供用户名作为参数,Sbomgen 会在需要时提示您输入安全密码。
要使用以下示例,请将
替换为要扫描的映像的名称,将 image:tag
替换为有权访问该映像的用户名:your_username
./inspector-sbomgen container --image
image:tag
--usernameyour_username
使用非交互式方法进行身份验证
对于这种方法,请将您的密码或注册表令牌存储在 .txt
文件中。
注意
当前用户应该只能读取此文件。该文件应还包含一行密码或令牌。
要使用以下示例,请将
替换为您的用户名,将 your_username
替换为包含一行密码或令牌的 password.txt
.txt
文件,将
替换为要扫描的映像的名称:image:tag
INSPECTOR_SBOMGEN_USERNAME=
your_username
\ INSPECTOR_SBOMGEN_PASSWORD=`catpassword.txt
` \ ./inspector-sbomgen container --imageimage: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" } ] } ] }