Pushen und Pullen von Lieferkettenartefakten mithilfe der Azure-Registrierung (Vorschauversion)

Mithilfe einer Azure-Containerregistrierung können Sie einen Graphen von Lieferkettenartefakten speichern und verwalten, z. B. Signaturen, Softwarestücklisten (Software Bill of Materials, SBoM), Ergebnisse von Sicherheitsüberprüfungen oder andere Typen.

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

Zur Veranschaulichung dieser Funktion wird in diesem Artikel gezeigt, wie Sie die Befehlszeilenschnittstelle von OCI Registry as Storage (ORAS) zum Ausführen von push-, discover- und pull-Vorgängen für einen Graphen von Lieferkettenartefakten in einer Azure-Containerregistrierung ausführen. Das Speichern einzelner (Stamm-)OCI-Artefakte wird unter Pushen und Pullen von OCI-Artefakten unter Verwendung einer Azure-Containerregistrierung behandelt

Zum Speichern eines Graphen von Artefakten wird mithilfe des OCI-Artefaktmanifests ein Verweis auf ein subject-Artefakt definiert. Dieses Manifest ist Teil der Vorabversion der Spezifikation für die OCI 1.1-Distribution. Unterstützung von OCI 1.1-Artefaktmanifesten ist eine Previewfunktion von ACR, die Einschränkungen unterliegt.

Voraussetzungen

  • Azure-Containerregistrierung: Erstellen Sie in Ihrem Azure-Abonnement eine Containerregistrierung. Verwenden Sie beispielsweise das Azure-Portal oder die Azure CLI.
    Weitere Informationen zur Unterstützung von Azure-Clouds finden Sie unter Einschränkungen der Vorschau.
  • Azure CLI: Version 2.29.1 oder höher ist erforderlich. Informationen zum Ausführen einer Installation oder eines Upgrades finden Sie unter Installieren der Azure CLI.
  • ORAS CLI: Version v0.16.0 ist erforderlich. Siehe Installation von ORAS
  • Docker (optional): Um die exemplarische Vorgehensweise abzuschließen, wird auf ein Containerimage verwiesen. Sie können eine lokal installierte Docker-Instanz zum Erstellen und Pushen eines Containerimages oder acr build für die Remoteerstellung in Azure verwenden.
    Docker Desktop ist zwar nicht erforderlich, doch die oras-CLI nutzt den Anmeldeinformationsspeicher von Docker Desktop zum Speichern von Anmeldeinformationen. Wenn Docker Desktop installiert ist, muss die Ausführung für oras login erfolgen.

Einschränkungen der Vorschau

Die Unterstützung des OCI-Artefaktmanifests (OCI 1.1-Spezifikation) ist in allen öffentlichen Azure-Regionen verfügbar. Azure China 21Vianet und Government-Clouds werden noch nicht unterstützt.

Konfigurieren einer Registrierung

Konfigurieren Sie Umgebungsvariablen, um Befehle einfach in Ihre Shell zu kopieren/einzufügen. Die Befehle können lokal oder in Azure Cloud Shell ausgeführt werden.

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

Authentifizieren Sie sich mit Ihrer persönlichen Microsoft Entra-Identität mithilfe eines AD-Tokens. Verwenden Sie immer „000...“ als USER_NAME, da das Token anhand der Variablen PASSWORD analysiert wird.

# 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)

Hinweis

ACR und ORAS unterstützen mehrere Authentifizierungsoptionen für Benutzer und Systemautomatisierung. In diesem Artikel wird eine einzelne Identität mithilfe eines Azure-Tokens verwendet. Weitere Authentifizierungsoptionen finden Sie unter Authentifizieren bei einer Azure-Containerregistrierung.

Anmelden mit ORAS

Geben Sie die Anmeldeinformationen für oras login an.

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

Pushen eines Containerimages

In diesem Beispiel wird einem Containerimage ein Graph von Artefakten zugeordnet.

Erstellen und pushen Sie ein Containerimage, oder überspringen Sie diesen Schritt, wenn $IMAGE auf ein vorhandenes Image in der Registrierung verweist.

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

Erstellen einer Beispielsignatur für das Containerimage

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

Anfügen einer Signatur in die Registrierung (als Verweis auf das Containerimage)

Der Befehl oras attach erstellt einen Verweis zwischen der Datei (./signature.json) und $IMAGE. --artifact-type dient der Unterscheidung von Artefakten, ähnlich wie Dateierweiterungen, die unterschiedliche Dateitypen ermöglichen. Durch Angabe von [file]:[mediaType] können eine oder mehrere Dateien angefügt werden.

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

Weitere Informationen zum Anfügen eines ORAS-Befehls finden Sie in der ORAS-Dokumentation.

Anfügen eines Artefakts mit mehreren Dateien als Referenz

Wenn OCI-Artefakte mit ORAS in eine Registrierung gepusht werden, wird jede referenzierte Datei als Blob gepusht. Um separate Blobs zu pushen, verweisen Sie einzeln auf die Dateien oder auf eine Sammlung von Dateien, indem Sie auf ein Verzeichnis verweisen.
Weitere Informationen zum Pushen einer Sammlung von Dateien finden Sie unter Pushen von Artefakten mit mehreren Dateien.

Erstellen Sie eine Dokumentation zu einem Artefakt:

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

Fügen Sie das Artefakt mit mehreren Dateien als Verweis an $IMAGE an:

Linux, WSL2 oder 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

Ermitteln von Artefaktverweisen

In der OCI v1.1-Spezifikation ist eine Verweis-API zum Ermitteln von Verweisen auf ein Artefakt vom Typ subject definiert. Der Befehl oras discover kann die Liste der Verweise auf das Containerimage zeigen.

Zeigen Sie mit oras discover den Graphen der jetzt in der Registrierung gespeicherten Artefakte an.

oras discover -o tree $IMAGE

Die Ausgabe zeigt den Beginn eines Graphen von Artefakten, in dem Signatur und Dokumente als untergeordnete Elemente des Containerimages angezeigt werden.

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

Erstellen tiefer Graphen von Artefakten

Die OCI v1.1-Spezifikation ermöglicht tiefe Graphen, sodass signierte Softwarestücklisten (Software Bill of Materials, SBoM) und andere Artefakttypen aktiviert werden.

Erstellen einer Beispiel-SBoM

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

Anfügen einer Beispiel-SBoM an das Image in der Registrierung

Linux, WSL2 oder 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

Signieren der SBoM

Artefakte, die als Verweise gepusht werden, verfügen in der Regel nicht über Tags, da sie als Teil des Artefakts subject betrachtet werden. Um eine Signatur in ein Artefakt zu übertragen, das ein untergeordnetes Element eines anderen Artefakts ist, filtern Sie mit oras discover und --artifact-type, um den Digest zu finden.

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

Erstellen einer Signatur einer SBoM

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

Anfügen der SBoM-Signatur

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

Anzeigen des Graphen

oras discover -o tree $IMAGE

Generiert folgende Ausgabe:

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

Höherstufen des Graphen

Ein typischer DevOps-Workflow stuft Artefakte von der Entwicklung über das Staging in die Produktionsumgebung hoch. Sichere Lieferkettenworkflows stufen öffentliche Inhalte in privat geschützte Umgebungen hoch. In beiden Fällen sollten Sie die Signaturen, SBoMs, Überprüfungsergebnisse und andere verwandte Artefakte mit dem Stammartefakt höher stufen, um einen vollständigen Graphen von Abhängigkeiten zu erhalten.

Mit dem Befehl oras copy können Sie einen gefilterten Graphen von Artefakten registrierungsübergreifend höher stufen.

Kopieren Sie das Image net-monitor:v1 und die zugehörigen Artefakte in sample-staging/net-monitor:v1:

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

Die Ausgabe von 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

Ermitteln des höhergestuften Artefaktgraphen

oras discover -o tree $TARGET_REPO:$TAG

Ausgabe von 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

Pullen eines Artefakts, auf das verwiesen wird

Um ein bestimmtes Artefakt, auf das verwiesen wird, zu pullen, wird der Digest des Verweises mit dem Befehl oras discover ermittelt:

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

Erstellen eines bereinigten Verzeichnisses zum Herunterladen

mkdir ./download

Pullen der Dokumentation in das Downloadverzeichnis

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

Anzeigen der Dokumentation

tree ./download

Die Ausgabe von tree:

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

Anzeigen des Repositorys und der Tagauflistung

Das OCI-Artefaktmanifest ermöglicht das Pushen, Ermitteln, Pullen und Kopieren von Artefaktgraphen, ohne Tags zuweisen zu müssen. Artefaktmanifeste ermöglichen es einer Tagauflistung, sich auf die Artefakte zu konzentrieren, die die Benutzer interessieren, im Gegensatz zu den Signaturen und SBoMs, die Containerimages, Helm-Charts und anderen Artefakten zugeordnet sind.

Anzeigen einer Liste mit Tags

oras repo tags $REGISTRY/$REPO

Anzeigen einer Liste mit Manifesten

Ein Repository kann eine Liste mit Manifesten enthalten, die mit Tags versehen sind oder nicht. Zeigen Sie mithilfe der az acr manifest-CLI die vollständige Liste der Manifeste an:

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

Beachten Sie, dass die Containerimagemanifeste "tags" enthalten, die Verweistypen ("mediaType": "application/vnd.oci.artifact.manifest.v1+json") hingegen nicht.

In der Ausgabe ist die Signatur nicht mit Tags versehen, wird aber als oci.artifact.manifest-Verweis auf das Containerimage nachverfolgt:

{
  "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"
}

Löschen aller Artefakte im Graphen

Unterstützung der OCI v1.1-Spezifikation ermöglicht das Löschen des Graphen der Artefakte, die dem Stammartefakt zugeordnet sind. Verwenden Sie den Befehl oras delete, um den Graphen der Artefakte (Signatur, SBoM und die Signatur der SBoM) zu löschen.

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

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

Anzeigen der verbleibenden Manifeste

Durch Löschen des Stammartefakts werden auch alle zugehörigen Artefakte gelöscht, sodass eine bereinigte Umgebung entsteht:

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

Ausgabe:

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

Zusammenfassung

In diesem Artikel wird ein Graph mit Lieferkettenartefakten erstellt, ermittelt, höher gestuft und gepullt und ermöglicht damit die Lebenszyklusverwaltung der Artefakte, die Sie erstellen und von denen Abhängigkeiten bestehen.

Nächste Schritte

  • Erfahren Sie mehr zur ORAS CLI.
  • Erfahren Sie mehr über das OCI-Artefaktmanifest zum Pushen, Ermitteln, Pullen und Kopieren eines Graphen von Lieferkettenartefakten.