Azure レジストリを使用してサプライ チェーン成果物成果物をプッシュおよびプルする (プレビュー)
Azure コンテナー レジストリを使用して、シグネチャ、ソフトウェア部品表 (SBOM)、セキュリティ スキャン結果、またはその他の種類を含む、サプライ チェーン成果物のグラフを保存して管理します。
この機能を示すため、この記事では OCI Registry as Storage (ORAS) CLI を使って、サプライ チェーン成果物のグラフを Azure コンテナー レジストリに push
、discover
、および 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 成果物マニフェストの詳細を確認する