Azure レジストリを使用してサプライ チェーン成果物成果物をプッシュおよびプルする (プレビュー)

Azure コンテナー レジストリを使用して、シグネチャ、ソフトウェア部品表 (SBOM)、セキュリティ スキャン結果、またはその他の種類を含む、サプライ チェーン成果物のグラフを保存して管理します。

Graph of artifacts, including a container image, signature and signed software bill of materials

この機能を示すため、この記事では OCI Registry as Storage (ORAS) CLI を使って、サプライ チェーン成果物のグラフを Azure コンテナー レジストリに pushdiscover、および pull する方法について説明します。 個々の (ルート) OCI 成果物の格納については、OCI 成果物のプッシュとプルに関する記事を参照してください。

成果物のグラフを格納するために、subject 成果物への参照は、リリース前の OCI 1.1 distribution-spec の一部である OCI 成果物マニフェストを使用して定義されます。 OCI 1.1 成果物マニフェストのサポートは、ACR プレビュー機能であり、制限の対象です。

前提条件

  • Azure コンテナー レジストリ - コンテナー レジストリは、Azure サブスクリプションに作成します。 たとえば、Azure Portal または Azure CLI を使用します。
    "Azure クラウド サポートについては、「プレビューの制限事項」を参照してください。"
  • Azure CLI - バージョン 2.29.1 以降が必要です。 インストールまたはアップグレードについては、「Azure CLI のインストール」を参照してください。
  • ORAS CLI - バージョン v0.16.0 が必要です。 「ORAS のインストール」を参照してください。
  • Docker (省略可能) - チュートリアルを完了するには、コンテナー イメージを参照します。 ローカルにインストールされた Docker を使用して、コンテナー イメージをビルドしてプッシュしたり、acr build を使って Azure にリモートでビルドしたりすることができます。
    Docker Desktop は必要ありませんが、oras cli では資格情報を格納するために Docker デスクトップ資格情報ストアが利用されます。 Docker Desktop がインストールされている場合は、これは oras login 用に実行されている必要があります。

プレビューの制限事項

OCI 成果物マニフェスト サポート (OCI 1.1 仕様) は、すべての Azure パブリック リージョンで利用できます。 21Vianet が運用する Microsoft Azure と Government クラウドはまだサポートされていません。

レジストリを構成する

コマンドをシェルに簡単にコピーまたは貼り付けるための環境変数を構成します。 コマンドは、ローカルにまたは Azure Cloud Shell で実行できます。

ACR_NAME=myregistry
REGISTRY=$ACR_NAME.azurecr.io
REPO=net-monitor
TAG=v1
IMAGE=$REGISTRY/${REPO}:$TAG

AD トークンを使って、個人の Microsoft Entra ID による認証を受けます。 トークンは PASSWORD 変数を介して解析されるため、USER_NAME には常に "000..." を使います。

# Login to Azure
az login

# Login to ACR, using a token based on your Azure identity
USER_NAME="00000000-0000-0000-0000-000000000000"
PASSWORD=$(az acr login --name $ACR_NAME --expose-token --output tsv --query accessToken)

注意

ACR と ORAS では、ユーザーとシステム自動化のための複数の認証オプションがサポートされています。 この記事では、Azure トークンを使って、個々の ID を使います。 認証オプションの詳細については、「Azure コンテナー レジストリでの認証」を参照してください。

ORAS を使用してサインインする

資格情報を に oras login に指定します。

oras login $REGISTRY \
  --username $USER_NAME \
  --password $PASSWORD

コンテナー イメージをプッシュする

この例では、成果物のグラフをコンテナー イメージに関連付けます。

コンテナー イメージをビルドしてプッシュするか、$IMAGE がレジストリ内の既存のイメージを参照する場合はこの手順をスキップします。

az acr build -r $ACR_NAME -t $IMAGE https://github.com/wabbit-networks/net-monitor.git#main

コンテナー イメージへのサンプル シグネチャを作成する

echo '{"artifact": "'${IMAGE}'", "signature": "jayden hancock"}' > signature.json

コンテナー イメージへの参照としてレジストリにシグネチャをアタッチする

oras attach コマンドは、ファイル (./signature.json) から $IMAGE への参照を作成します。 --artifact-type は、さまざまなファイルの種類を使用できるようにするファイル拡張子と同様に、成果物を区別するために指定します。 [file]:[mediaType] を指定すると、1 つ以上のファイルをアタッチできます。

oras attach $IMAGE \
    --artifact-type signature/example \
    ./signature.json:application/json

oras attach の詳細については ORAS のドキュメントを参照してください。

参照として複数ファイルの成果物をアタッチする

OCI 成果物が ORAS を使用してレジストリにプッシュされると、各ファイル参照が BLOB としてプッシュされます。 個々の BLOB をプッシュするには、ファイルを個別に参照するか、ディレクトリを参照してファイルのコレクションを参照します。
ファイルのコレクションをプッシュする方法の詳細については、「Pushing artifacts with multiple files (複数のファイルを使って成果物をプッシュする)」を参照してください。

成果物に関するドキュメントを作成します。

echo 'Readme Content' > readme.md
mkdir details/
echo 'Detailed Content' > details/readme-details.md
echo 'More detailed Content' > details/readme-more-details.md

参照として複数ファイルの成果物を $IMAGE にアタッチします。

Linux、WSL2、または macOS

oras attach $IMAGE \
    --artifact-type readme/example \
    ./readme.md:application/markdown \
    ./details

Windows

.\oras.exe attach $IMAGE ^
    --artifact-type readme/example ^
    .\readme.md:application/markdown ^
    .\details

成果物参照の検出

OCI v1.1 仕様では、subject 成果物への参照を検出するための referrers API が定義されています。 oras discover コマンドでは、コンテナー イメージへの参照の一覧を表示できます。

oras discover を使用して、レジストリに保存されている成果物のグラフを表示します。

oras discover -o tree $IMAGE

出力には、成果物のグラフの先頭が表示されます。ここには、シグネチャとドキュメントがコンテナー イメージの子として表示されます。

myregistry.azurecr.io/net-monitor:v1
├── signature/example
│   └── sha256:555ea91f39e7fb30c06f3b7aa483663f067f2950dcb...
└── readme/example
    └── sha256:1a118663d1085e229ff1b2d4d89b5f6d67911f22e55...

成果物の詳細なグラフの作成

OCI v1.1 仕様では、詳細なグラフが可能であり、署名付きソフトウェア部品表 (SBOM) や他の成果物の種類を使用できます。

サンプル SBOM を作成する

echo '{"version": "0.0.0.0", "artifact": "'${IMAGE}'", "contents": "good"}' > sbom.json

レジストリ内のイメージにサンプルの SBOM をアタッチする

Linux、WSL2、または macOS

oras attach $IMAGE \
  --artifact-type sbom/example \
  ./sbom.json:application/json

Windows

.\oras.exe attach $IMAGE ^
    --artifact-type sbom/example ^
    ./sbom.json:application/json

SBOM に署名する

参照としてプッシュされる成果物は、通常、subject 成果物の一部と見なされるため、タグがありません。 別の成果物の子である成果物にシグネチャをプッシュするには、ダイジェストを検索するための --artifact-type フィルタリングを付けて、oras discover を使用します。

SBOM_DIGEST=$(oras discover -o json \
                --artifact-type sbom/example \
                $IMAGE | jq -r ".manifests[0].digest")

SBOM のシグネチャを作成する

echo '{"artifact": "'$IMAGE@$SBOM_DIGEST'", "signature": "jayden hancock"}' > sbom-signature.json

SBOM シグネチャをアタッチする

oras attach $IMAGE@$SBOM_DIGEST \
  --artifact-type 'signature/example' \
  ./sbom-signature.json:application/json

グラフを表示する

oras discover -o tree $IMAGE

次の出力が生成されます。

myregistry.azurecr.io/net-monitor:v1
├── sbom/example
│   └── sha256:4f1843833c029ecf0524bc214a0df9a5787409fd27bed2160d83f8cc39fedef5
│       └── signature/example
│           └── sha256:3c43b8cb0c941ec165c9f33f197d7f75980a292400d340f1a51c6b325764aa93
├── readme/example
│   └── sha256:5fafd40589e2c980e2864a78818bff51ee641119cf96ebb0d5be83f42aa215af
└── signature/example
    └── sha256:00da2c1c3ceea087b16e70c3f4e80dbce6f5b7625d6c8308ad095f7d3f6107b5

グラフの昇格

一般的な DevOps ワークフローでは、成果物を dev からステージング、運用環境まで昇格させます。セキュリティで保護されたサプライ チェーン ワークフローでは、パブリック コンテンツをプライベートにセキュリティ保護された環境に昇格させます。 いずれの場合も、シグネチャ、SBOM、スキャン結果、およびルート成果物に関連付けられているその他の成果物を昇格させて、依存関係の完全なグラフを作成します。

oras copy コマンドを使用すると、レジストリ間で成果物のフィルター処理されたグラフを昇格させることができます。

net-monitor:v1 イメージをコピーすると、成果物は sample-staging/net-monitor:v1 に関連付けられます。

TARGET_REPO=$REGISTRY/sample-staging/$REPO
oras copy -r $IMAGE $TARGET_REPO:$TAG

oras copy の出力:

Copying 6bdea3cdc730 sbom-signature.json
Copying 78e159e81c6b sbom.json
Copied  6bdea3cdc730 sbom-signature.json
Copied  78e159e81c6b sbom.json
Copying 7cf1385c7f4d signature.json
Copied  7cf1385c7f4d signature.json
Copying 3e797ecd0697 details
Copying 2fdeac43552b readme.md
Copied  3e797ecd0697 details
Copied  2fdeac43552b readme.md
Copied demo42.myregistry.io/net-monitor:v1 => myregistry.azurecr.io/sample-staging/net-monitor:v1
Digest: sha256:ff858b2ea3cdf4373cba65d2ca6bcede4da1d620503a547cab5916614080c763

昇格された成果物グラフを検出する

oras discover -o tree $TARGET_REPO:$TAG

oras discover の出力:

myregistry.azurecr.io/sample-staging/net-monitor:v1
├── sbom/example
│   └── sha256:4f1843833c029ecf0524bc214a0df9a5787409fd27bed2160d83f8cc39fedef5
│       └── signature/example
│           └── sha256:3c43b8cb0c941ec165c9f33f197d7f75980a292400d340f1a51c6b325764aa93
├── readme/example
│   └── sha256:5fafd40589e2c980e2864a78818bff51ee641119cf96ebb0d5be83f42aa215af
└── signature/example
    └── sha256:00da2c1c3ceea087b16e70c3f4e80dbce6f5b7625d6c8308ad095f7d3f6107b5

参照された成果物をプルする

特定の参照された成果物をプルするために、oras discover コマンドによって参照のダイジェストが検出されます。

DOC_DIGEST=$(oras discover -o json \
              --artifact-type 'readme/example' \
              $TARGET_REPO:$TAG | jq -r ".manifests[0].digest")

ダウンロード用のクリーン ディレクトリを作成する

mkdir ./download

ダウンロード ディレクトリにドキュメントをプルする

oras pull -o ./download $TARGET_REPO@$DOC_DIGEST

ドキュメントを表示する

tree ./download

tree の出力:

./download
├── details
│   ├── readme-details.md
│   └── readme-more-details.md
└── readme.md

リポジトリとタグの一覧を表示する

OCI 成果物マニフェストにより、タグを割り当てなくても、成果物グラフをプッシュ、検出、プル、コピーできます。 成果物マニフェストにより、コンテナー イメージ、Helm チャート、およびその他の成果物に関連付けられているシグネチャや SBOM とは対照的に、ユーザーが考える成果物に焦点を当てたタグの一覧表示が可能になります。

タグの一覧を表示する

oras repo tags $REGISTRY/$REPO

マニフェストの一覧を表示する

リポジトリには、タグ付きとタグなしの両方のマニフェストの一覧を含めることができます。 az acr manifest CLI を使用して、マニフェストの完全な一覧を表示します。

az acr manifest list-metadata \
  --name $REPO \
  --registry $ACR_NAME \
  --output jsonc

コンテナー イメージ マニフェストには "tags" が含まれていますが、参照型 ("mediaType": "application/vnd.oci.artifact.manifest.v1+json") には含まれていないことに注意してください。

出力では、シグネチャはタグ付けされませんが、コンテナー イメージへの oci.artifact.manifest 参照として追跡されます。

{
  "changeableAttributes": {
    "deleteEnabled": true,
    "listEnabled": true,
    "readEnabled": true,
    "writeEnabled": true
  },
  "createdTime": "2023-01-10T17:58:28.4403142Z",
  "digest": "sha256:00da2c1c3ceea087b16e70c3f4e80dbce6f5b7625d6c8308ad095f7d3f6107b5",
  "imageSize": 80,
  "lastUpdateTime": "2023-01-10T17:58:28.4403142Z",
  "mediaType": "application/vnd.oci.artifact.manifest.v1+json"
}

グラフのすべての成果物を削除する

OCI v1.1 仕様のサポートにより、ルート成果物に関連付けられている成果物のグラフを削除できます。 oras delete コマンドを使用して、成果物のグラフ (シグネチャ、SBOM、および SBOM のシグネチャ) を削除します。

oras manifest delete -f $REGISTRY/$REPO:$TAG

oras manifest delete -f $REGISTRY/sample-staging/$REPO:$TAG

残りのマニフェストを表示する

ルート成果物を削除すると、関連するすべての成果物もクリーンな環境から削除されます。

az acr manifest list-metadata \
  --name $REPO \
  --registry $ACR_NAME -o jsonc

出力:

2023-01-10 18:38:45.366387 Error: repository "net-monitor" is not found.

まとめ

この記事では、サプライ チェーン成果物のグラフを作成、検出、昇格、プルして、ビルドおよび依存先の成果物のライフサイクル管理を示します。

次の手順

  • ORAS CLI の詳細を確認する
  • サプライ チェーン成果物のグラフのプッシュ、検出、プル、コピーの方法について、OCI 成果物マニフェストの詳細を確認する