将签名的 SBOM 附加到容器映像

软件材料清单(SBOM)是一个生成清单,列出用于生成软件的组件。 SBOM 可用于跟踪整个生命周期内一段软件(包括容器映像)的出处。 本文介绍如何使用 CLI 工具为容器映像创建 SBOM、对其进行签名并将其附加到映像。 可以采用其他方法,包括使用 CI/CD 管道自动执行该过程。

先决条件

在进行之前,请确保具有以下各项:

登录到注册表

登录到 ACR 并获取注册表的访问令牌。 例如,以下命令使用 Azure CLI 登录到注册表,并将该注册表的访问令牌设置为 PASSWORD 环境变量。

# Update the ACR_NAME variable with the name of your registry
ACR_NAME=<acr-name>
PASSWORD=$(az acr login --name $ACR_NAME --expose-token --output tsv --query accessToken)

注意

ACR 和 ORAS 支持用于用户和系统自动化的多个身份验证选项。 本文通过使用 Azure 令牌使用个人标识。 有关更多身份验证选项,请参阅 使用 Azure 容器注册表进行身份验证。

生成和推送容器映像

用于 az acr build 生成容器映像并将其推送到注册表。

REPO=net-monitor
TAG=v1
REGISTRY=$ACR_NAME.azurecr.io
IMAGE=$REGISTRY/${REPO}:$TAG
IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main

az acr build -r $ACR_NAME -t $IMAGE $IMAGE_SOURCE

使用表示法 CLI 登录

用于 notation login 登录到注册表。

重要

使用 ACR 的访问令牌时,必须用作 00000000-0000-0000-0000-000000000000 用户名。

export USER_NAME="00000000-0000-0000-0000-000000000000"
notation login -u $USER_NAME -p $PASSWORD $REGISTRY

对映像进行签名

用于 notation sign 对映像进行签名。

重要

必须具有签名证书和密钥对来对映像进行签名。 例如,使用 Notary 和 Azure 密钥库生成、签名和验证容器映像演示如何使用 Azure 密钥库创建签名证书和密钥对。

notation sign $IMAGE

用于 notation ls 列出映像上的签名。

notation ls $IMAGE

以下示例输出显示了图像上的签名。

<acr-name>.azurecr.io/net-monitor@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
└── application/vnd.cncf.notary.signature
    └── sha256:111222333444555666777888999000aaabbbcccdddeeefff1112223334445556

创建 SBOM

用于 sbom-tool 为映像创建 SBOM。 例如,以下命令为映像创建 SBOM 并将其存储在 ./sbom 目录中。

SBOM_DIR=./sbom
PACKAGE_SUPPLIER=MyCompany
PACKAGE_NAME=TestProject
PACKAGE_VERSION=1.0.0
mkdir $SBOM_DIR
sbom-tool generate -m $SBOM_DIR -di $IMAGE -ps $PACKAGE_SUPPLIER -pn $PACKAGE_NAME -pv $PACKAGE_VERSION

将 SBOM 附加到映像

用于 oras attach 将 SBOM 附加到映像。 例如,以下命令将 manifest.spdx.json 文件附加到映像。

SBOM_FILE=$SBOM_DIR/_manifest/spdx_2.2/manifest.spdx.json
oras attach $IMAGE $SBOM_FILE --artifact-type example/sbom

对 SBOM 进行签名

用于 oras discover 获取 SBOM 的摘要。

oras discover $IMAGE -o tree

以下示例输出显示签名和图像的摘要。

$ oras discover $IMAGE -o tree

<acr-name>.azurecr.io/net-monitor@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
├── example/sbom
│   └── sha256:fffeeedddcccbbbaaa000999888777666555444333222111fffeeedddcccbbba
└── application/vnd.cncf.notary.signature
    └── sha256:111222333444555666777888999000aaabbbcccdddeeefff1112223334445556

用于 notation sign 使用上一命令中 SBOM 的摘要值对 SBOM 进行签名。

SBOM=$REGISTRY/${REPO}@sha256:fffeeedddcccbbbaaa000999888777666555444333222111fffeeedddcccbbba
notation sign $SBOM

用于 notation ls 列出 SBOM 上的签名。

notation ls $SBOM

以下示例显示了 SBOM 上的签名。

$ notation ls $SBOM

<acr-name>.azurecr.io/net-monitor@sha256:fffeeedddcccbbbaaa000999888777666555444333222111fffeeedddcccbbba
└── application/vnd.cncf.notary.signature
    └── sha256:fedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321

后续步骤

有关详细信息,请参阅每个阶段的概述: