在上个月颁布的 Docker Desktop v4.7.0 中,介绍了一个新的 CLI 插件-docker/sbom-cli-plugin,其为 Docker CLI 缩小了一个子命令 – sbom,用于查看 Docker 容器镜像的软件物料清单(SBOM)。

什么是 SBOM?

首先介绍下什么是 SBOM(Software Bill of  Materials),咱们称之为软件物料清单,是软件供应链中的术语。软件供应链是用于构建软件应用程序(软件产品)的组件、库和工具的列表,而物料清单则声明这些组件、库的清单,类似于食品的配料清单。软件物料清单可能帮忙组织或者个体避免利用有安全漏洞的软件。

DOCKER SBOM 命令

当心: 从 Docker Desktop 4.7.0 版本开始到当初,docker sbom 命令还是实验性的,该性能兴许会在以后版本中删除和更改,当前 Linux 的 Docker CLI 还未蕴含该子命令。

docker sbom 命令用于生产一个容器镜像的软件物料清单(SBOM)

 >$ docker sbom --helpUsage:  docker sbom [OPTIONS] COMMANDView the packaged-based Software Bill Of Materials (SBOM) for an image.EXPERIMENTAL: The flags and outputs of this command may change. Leave feedback on https://github.com/docker/sbom-cli-plugin.Examples: docker sbom alpine:latest                                          a summary of discovered packages docker sbom alpine:latest --format syft-json                       show all possible cataloging details docker sbom alpine:latest --output sbom.txt                        write report output to a file docker sbom alpine:latest --exclude /lib  --exclude '**/*.db'      ignore one or more paths/globs in the imageOptions: -D, --debug                 show debug logging     --exclude stringArray   exclude paths from being scanned using a glob expression     --format string         report output format, options=[syft-json cyclonedx-xml cyclonedx-json github-0-json spdx-tag-value spdx-json table text] (default "table")     --layers string         [experimental] selection of layers to catalog, options=[squashed all] (default "squashed") -o, --output string         file to write the default report output to (default is STDOUT)     --platform string       an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')     --quiet                 suppress all non-report output -v, --version               version for sbomCommands: version     Show Docker sbom version informationRun 'docker sbom COMMAND --help' for more information on a command.

从命令的帮忙信息中可能看到,除了间接生成表格模式的 SBOM 输出外,还拥护利用--format 指定多种类型的输出格局。

咱们尝试对镜像 neo4j:4.4.5 生成 SBOM:

 >$ docker sbom neo4jh:4.4.5Syft v0.43.0 ✔ Loaded image ✔ Parsed image ✔ Cataloged packages      [385 packages]NAME                                VERSION                                    TYPECodePointIM                         11.0.15                                    java-archive  FastInfoset                         1.2.16                                     java-archiveFileChooserDemo                     11.0.15                                    java-archiveFont2DTest                          11.0.15                                    java-archiveHdrHistogram                        2.1.9                                      java-archiveJ2Ddemo                             11.0.15                                    java-archiveMetalworks                          11.0.15                                    java-archive...libuuid1                            2.36.1-8+deb11u1                           deblibxxhash0                          0.8.0-2                                    deblibzstd1                            1.4.8+dfsg-2.1                             deblistenablefuture                    9999.0-empty-to-avoid-conflict-with-guava  java-archivelog4j-api                           2.17.1                                     java-archivelog4j-core                          2.17.1                                     java-archivelogin                               1:4.8.1-1                                  deb...

上面的输出表格之截取了部分,咱们可能看到在清单列表中,除了系统包(deb 类型)之外,还有 java 的软件包,其中就蕴含了 log4j  的包及其版本信息,从这些信息中就可能了解到容器镜像是否蕴含了存在安全漏洞的依赖和软件包,增强了应用软件镜像来部署利用的安全性。

上面的信息中还看到了 Syft v0.43.0,这是因为当前的 SBOM CLI 插件是利用 Anchore 的 Syft 我的我的项目来进行镜像层的扫描,以后的版本兴许会通过其余方法读取 SBOM 信息。

咱们再尝试输出一个镜像的 SPDX 格局的 SBOM 文件:

 >$ docker sbom --form spdx-json --output hugo-sbom.json mengzyou/hugo:latestSyft v0.43.0 ✔ Loaded image ✔ Parsed image ✔ Cataloged packages >$ cat hugo-sbom.json{  "SPDXID": "SPDXRef-DOCUMENT",  "name": "mengzyou/hugo-latest",  "spdxVersion": "SPDX-2.2",  "creationInfo": {   "created": "2022-05-09T10:55:06.6343529Z",   "creators": [    "Organization: Anchore, Inc",    "Tool: syft-[not provided]"   ],   "licenseListVersion": "3.16"  },  "dataLicense": "CC0-1.0",  "documentNamespace": "https://anchore.com/syft/image/mengzyou/hugo-latest-162a6a05-379c-49f0-a7f2-b4b738a63d1b",  "packages": [   {    "SPDXID": "SPDXRef-ed18f2a986e77aab",    "name": "alpine-baselayout",    "licenseConcluded": "GPL-2.0-only",    "description": "Alpine base dir structure and init scripts",    "downloadLocation": "https://git.alpinelinux.org/cgit/aports/tree/main/alpine-baselayout", ...   }}

因为生成的文件较长,上面只输出了一小部分。补充 – SPDX (Software Package Data  Exchage) 是一个形容 SBOM 信息的凋零标准,其中将蕴含软件组件、许可版权信息以及相干的安全参考。SPDX  通过为公司和社区提供共享重要数据的通用格局来放大冗余的工作,从而简化和提供合规性。

总结

这里简略的介绍了 SBOM,以及 Docker CLI 的试验性子命令 –  sbom,可能通过该命令生成 r 容器镜像多种格局的 SBOM 信息,让开发人员和须要利用容器镜像来部署服务的运维人员可能容易的获取到镜像的 SBOM 信息,从而了解到镜像的安全信息,以满足利用的合规性。同时,也可能思考将该工具退出到公司交付利用的 CI/CD 流水中,作为镜像制品的安全检查工作。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。