次の方法で共有


ORAS を使用して OCI 成果物とサプライ チェーン成果物を管理する

Azure Container Registry (ACR) は、Open Container Initiative (OCI) 成果物とサプライ チェーン成果物の両方を管理するのに役立ちます。 この記事では、ACR を使用して OCI 成果物とサプライ チェーン成果物を効果的に管理する方法について説明します。 署名、ソフトウェア部品表 (SBOM)、セキュリティ スキャン結果、その他の種類を含む、OCI 成果物とサプライ チェーン成果物のグラフの両方を格納、管理、取得する方法について説明します。

この記事は、主に次の 2 つのセクションに分かれています。

前提条件

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

レジストリを構成する

コマンドを実行しやすい環境を構成するには、次の手順に従います。

  1. ACR_NAME 変数をレジストリ名に設定します。
  2. REGISTRY 変数を $ACR_NAME.azurecr.io に設定します。
  3. REPO 変数をリポジトリ名に設定します。
  4. TAG 変数を目的のタグに設定します。
  5. IMAGE 変数を $REGISTRY/${REPO}:$TAG に設定します。

環境変数を設定する

レジストリ名、ログイン資格情報、リポジトリ名、タグを構成して、成果物をプッシュおよびプルします。 次の例では、net-monitor リポジトリ名と v1 タグを使用します。 ご自身のリポジトリ名とタグに置き換えます。

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

レジストリにサインインする

コンテナー イメージをプルおよびプッシュできるようにするために ACR で認証します。

az login  
az acr login -n $REGISTRY  

このセットアップにより、Azure Container Registry との間で成果物をシームレスにプッシュおよびプルできるようになります。 これで、oras login コマンドを使用して、追加の認証なしで ACR で ORAS を使用できるようになりました。

Docker が使用できない場合は、提供された AD トークンを認証に使用できます。 AD トークンを使って、お客様の個人の Microsoft Entra ID の認証を受けます。 トークンは PASSWORD 変数を介して解析されるため、USER_NAME には常に "000..." を使います。 az acr login で使用されるトークンは 3 時間有効です。

Note

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

ORAS を使用して OCI 成果物をプッシュおよびプルする

Azure コンテナー レジストリを使うと、Open Container Initiative (OCI) 成果物に加えて、Docker と OCI のコンテナー イメージを格納して管理することができます。

この機能を示すため、このセクションでは OCI Registry as Storage (ORAS) CLI を使用して、OCI 成果物を Azure コンテナー レジストリとの間でプッシュおよびプルする方法について説明します。 各成果物に適したさまざまなコマンドライン ツールを使って、Azure コンテナー レジストリ内のさまざまな OCI 成果物を管理できます。

成果物をプッシュする

subject 親を持たない 1 つのファイル成果物には、コンテナー イメージ、Helm チャート、リポジトリの readme ファイルがあります。 参照成果物には、署名、ソフトウェアの部品表、スキャン レポート、その他の進化する種類があります。 サプライ チェーン成果物のアタッチ、プッシュ、プルに関する記事で説明されている参照成果物とは、他の成果物を参照する成果物です。

1 つのファイル成果物をプッシュする

この例では、マークダウン ファイルを表すコンテンツを作成します。

echo 'Readme Content' > readme.md

次の手順では、readme.md ファイルを <myregistry>.azurecr.io/samples/artifact:readme にプッシュします。

  • レジストリは、完全修飾レジストリ名 <myregistry>.azurecr.io (すべて小文字) と、それに続く名前空間とリポジトリ (/samples/artifact) で識別されます。
  • 成果物には :readme というタグが付けられ、リポジトリに登録されている他の成果物 (:latest, :v1, :v1.0.1) から一意に識別されます。
  • --artifact-type readme/example を設定すると、成果物は、application/vnd.oci.image.config.v1+json を使うコンテナー イメージと区別されます。
  • ./readme.md を使ってアップロードされたファイルを識別します。:application/markdown はそのファイルの IANA mediaType を表します。
    詳細については、OCI 成果物作成者向けガイダンスの記事を参照してください。

oras push コマンドを使って、このファイルをレジストリにプッシュします。

Linux、WSL2、または macOS

oras push $REGISTRY/samples/artifact:readme \
    --artifact-type readme/example \
    ./readme.md:application/markdown

Windows

.\oras.exe push $REGISTRY/samples/artifact:readme ^
    --artifact-type readme/example ^
    .\readme.md:application/markdown

プッシュが成功した場合の出力は、次の出力のようになります。

Uploading 2fdeac43552b readme.md
Uploaded  2fdeac43552b readme.md
Pushed <myregistry>.azurecr.io/samples/artifact:readme
Digest: sha256:e2d60d1b171f08bd10e2ed171d56092e39c7bac1

aec5d9dcf7748dd702682d53

複数ファイルの成果物をプッシュする

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

複数ファイルの成果物をプッシュします。

Linux、WSL2、または macOS

oras push $REGISTRY/samples/artifact:readme \
    --artifact-type readme/example\
    ./readme.md:application/markdown\
    ./details

Windows

.\oras.exe push $REGISTRY/samples/artifact:readme ^
    --artifact-type readme/example ^
    .\readme.md:application/markdown ^
    .\details

マニフェストを検出する

oras push の結果として作成されたマニフェストを表示するには、oras manifest fetch を使います。

oras manifest fetch --pretty $REGISTRY/samples/artifact:readme

次のように出力されます。

{
  "mediaType": "application/vnd.oci.artifact.manifest.v1+json",
  "artifactType": "readme/example",
  "blobs": [
    {
      "mediaType": "application/markdown",
      "digest": "sha256:2fdeac43552b71eb9db534137714c7bad86b53a93c56ca96d4850c9b41b777fc",
      "size": 15,
      "annotations": {
        "org.opencontainers.image.title": "readme.md"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:0d6c7434a34f6854f971487621426332e6c0fda08040b9e6cc8a93f354cee0b1",
      "size": 189,
      "annotations": {
        "io.deis.oras.content.digest": "sha256:11eceb2e7ac3183ec9109003a7389468ec73ad5ceaec0c4edad0c1b664c5593a",
        "io.deis.oras.content.unpack": "true",
        "org.opencontainers.image.title": "details"
      }
    }
  ],
  "annotations": {
    "org.opencontainers.artifact.created": "2023-01-10T14:44:06Z"
  }
}

成果物をプルする

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

mkdir ./download

oras pull コマンドを実行して、レジストリから成果物をプルします。

oras pull -o ./download $REGISTRY/samples/artifact:readme

プルしたファイルを表示する

tree ./download

成果物を削除する (省略可能)

レジストリから成果物を削除するには、oras manifest delete コマンドを使います。

 oras manifest delete $REGISTRY/samples/artifact:readme

ORAS を使用してサプライ チェーン成果物をアタッチ、プッシュ、プルする

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

成果物のグラフを格納するために、subject 成果物への参照は、リリース前の OCI 1.1 distribution-spec の一部である OCI イメージ マニフェストを使用して定義されます。

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

Azure CLI を使用して成果物のグラフをコンテナー イメージに関連付けるには、次の手順を実施します。

コンテナー イメージをビルドしてプッシュするか、$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 (複数のファイルを使って成果物をプッシュする)」を参照してください。

成果物参照の検出

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 を作成してレジストリにアタッチする方法を次に示します。

サンプル 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 に署名する

重要

Microsoft では、Notation などのセキュリティで保護された暗号化署名ツールを使用して、イメージに署名し、SBOM に署名するための署名を生成することをお勧めします。

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

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 ワークフローでは、開発環境からステージング環境を経て成果物を運用環境に昇格させます。 セキュリティで保護されたサプライ チェーン ワークフローは、パブリック コンテンツをプライベートにセキュリティで保護された環境に昇格させます。 いずれの場合も、シグネチャ、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

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

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

タグの一覧を表示する

oras repo tags $REGISTRY/$REPO

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

OCI v1.1 仕様のサポートにより、サブジェクト成果物に関連付けられている成果物のグラフを削除できます。 oras manifest 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.

まとめ

この記事では、Azure Container Registry を使用して、OCI 成果物とサプライ チェーン成果物の両方を格納、管理、および取得する方法について学びました。 ORAS CLI を使用して、Azure Container Registry との間で成果物をプッシュおよびプルしました。 また、プッシュされた成果物のマニフェストを検出し、コンテナー イメージにアタッチされている成果物のグラフを表示しました。

次のステップ

  • 署名、ソフトウェアの部品表、その他の参照型に関連する成果物の参照についてご確認ください。
  • 成果物のマニフェストを構成する方法など、ORAS プロジェクトの詳細についての詳細をご確認ください。
  • OCI 成果物リポジトリを参照して、新しい成果物の型に関するリファレンス情報をご確認ください。