Eseguire il push e il pull degli artefatti della supply chain usando Registro di sistema di Azure (anteprima)

Usare un Registro Azure Container per archiviare e gestire un grafico di artefatti della supply chain, incluse firme, fatture software di materiali (SBOM), risultati dell'analisi della sicurezza e altri tipi.

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

Per illustrare questa funzionalità, questo articolo illustra come usare il Registro OCI come interfaccia della riga di comando di Archiviazione (ORAS) per discoverpushe pull un grafico degli artefatti della supply chain in un registro contenitori di Azure. L'archiviazione di singoli artefatti OCI (radice) è descritta in Elementi OCI push e pull.

Per archiviare un grafico di artefatti, viene definito un riferimento a un subject artefatto usando il manifesto dell'artefatto OCI, che fa parte della specifica di distribuzione OCI 1.1 non rilasciata. Il supporto del manifesto degli artefatti OCI 1.1 è una funzionalità di anteprima di Registro Azure Container e soggetta a limitazioni.

Prerequisiti

  • Registro Azure Container: creare un registro di contenitori nella sottoscrizione di Azure. Ad esempio usare il portale di Azure oppure l'interfaccia della riga di comando di Azure.
    Vedere Limitazioni di anteprima per il supporto cloud di Azure.
  • Interfaccia della riga di comando di Azure: è necessaria la versione o una versione 2.29.1 successiva. Vedere Installare l'interfaccia della riga di comando di Azure per l'installazione e/o l'aggiornamento.
  • Interfaccia della riga di comando ORAS: è necessaria la versione v0.16.0 . Vedere: Installazione di ORAS.
  • Docker (facoltativo): per completare la procedura dettagliata, viene fatto riferimento a un'immagine del contenitore. È possibile usare Docker installato localmente per compilare ed eseguire il push di un'immagine del contenitore oppure usare acr build per la compilazione remota in Azure.
    Anche se Docker Desktop non è obbligatorio, l'interfaccia della oras riga di comando usa l'archivio credenziali desktop Docker per l'archiviazione delle credenziali. Se Docker Desktop è installato, deve essere in esecuzione per oras login.

Limiti dell'anteprima

Il supporto del manifesto dell'artefatto OCI (specifica OCI 1.1) è disponibile in tutte le aree pubbliche di Azure. Microsoft Azure gestito da 21Vianet e cloud per enti pubblici non sono ancora supportati.

Configurare un registro

Configurare le variabili di ambiente per copiare/incollare facilmente i comandi nella shell. I comandi possono essere eseguiti in locale o in Azure Cloud Shell.

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

Eseguire l'autenticazione con l'identità singola di Microsoft Entra usando un token di Active Directory. Usare sempre "000..." per perché USER_NAME il token viene analizzato tramite la PASSWORD variabile .

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

Nota

Registro Azure Container e ORAS supportano più opzioni di autenticazione per gli utenti e l'automazione del sistema. Questo articolo usa una singola identità usando un token di Azure. Per altre opzioni di autenticazione, vedere Eseguire l'autenticazione con un registro Azure Container

Accedere con ORAS

Specificare le credenziali per oras login.

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

Eseguire il push di un'immagine del contenitore

In questo esempio viene associato un grafico di artefatti a un'immagine del contenitore.

Compilare ed eseguire il push di un'immagine del contenitore oppure ignorare questo passaggio se $IMAGE fa riferimento a un'immagine esistente nel Registro di sistema.

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

Creare una firma di esempio per l'immagine del contenitore

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

Allegare una firma al Registro di sistema, come riferimento all'immagine del contenitore

Il oras attach comando crea un riferimento tra il file (./signature.json) e .$IMAGE --artifact-type fornisce elementi diversi, simili alle estensioni di file che consentono tipi di file diversi. È possibile allegare uno o più file specificando [file]:[mediaType].

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

Per altre informazioni su oras attach, vedere la documentazione di ORAS.

Collegare un artefatto multi-file come riferimento

Quando viene eseguito il push degli artefatti OCI in un registro con ORAS, ogni riferimento al file viene inserito come BLOB. Per eseguire il push di BLOB separati, fare riferimento ai file singolarmente o alla raccolta di file facendo riferimento a una directory.
Per altre informazioni su come eseguire il push di una raccolta di file, vedere Push di artefatti con più file.

Creare una documentazione relativa a un artefatto:

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

Allegare l'artefatto multi-file come riferimento a $IMAGE:

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

Individuazione dei riferimenti agli artefatti

La specifica OCI v1.1 definisce un'API referrers per individuare i riferimenti a un subject artefatto. Il oras discover comando può visualizzare l'elenco di riferimenti all'immagine del contenitore.

Usando oras discover, visualizzare il grafico degli artefatti ora archiviati nel Registro di sistema.

oras discover -o tree $IMAGE

L'output mostra l'inizio di un grafico di artefatti, in cui la firma e la documentazione vengono visualizzate come elementi figlio dell'immagine del contenitore.

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

Creazione di grafici profondi di artefatti

La specifica OCI v1.1 consente grafici profondi, abilitando la fattura software firmata dei materiali (SBOM) e altri tipi di artefatti.

Creare un esempio di SBOM

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

Collegare un esempio SBOM all'immagine nel Registro di sistema

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

Firmare SBOM

Gli artefatti di cui viene eseguito il push come riferimenti, in genere non hanno tag perché sono considerati parte dell'artefatto subject . Per eseguire il push di una firma in un artefatto figlio di un altro artefatto, usare con --artifact-type il oras discover filtro per trovare il digest.

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

Creare una firma di un S SBOM

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

Allegare la firma SBOM

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

Visualizzare il grafico

oras discover -o tree $IMAGE

Genera l'output seguente:

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

Alzare di livello il grafico

Un flusso di lavoro DevOps tipico promuoverà gli artefatti dallo sviluppo tramite la gestione temporanea, ai flussi di lavoro della supply chain sicura dell'ambiente di produzione promuovere il contenuto pubblico in ambienti protetti privatamente. In entrambi i casi è consigliabile alzare di livello le firme, gli SBOM, analizzare i risultati e altri artefatti correlati con l'artefatto radice per avere un grafico completo delle dipendenze.

Usando il oras copy comando è possibile alzare di livello un grafico filtrato di elementi tra registri.

Copiare l'immagine net-monitor:v1 e gli artefatti correlati in sample-staging/net-monitor:v1:

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

Output di 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

Individuare il grafico dell'artefatto alzato di livello

oras discover -o tree $TARGET_REPO:$TAG

Output di 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

Eseguire il pull di un artefatto a cui si fa riferimento

Per eseguire il pull di un artefatto di riferimento specifico, il digest di riferimento viene individuato con il oras discover comando :

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

Creare una directory pulita per il download

mkdir ./download

Eseguire il pull dei documenti nella directory di download

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

Visualizzare la documentazione

tree ./download

Output di tree:

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

Visualizzare il repository e l'elenco di tag

Il manifesto dell'artefatto OCI consente il push, il pull e la copia dei grafici degli artefatti senza dover assegnare tag. I manifesti degli artefatti consentono a un elenco di tag di concentrarsi sugli elementi che gli utenti pensano, invece delle firme e degli SBOM associati alle immagini del contenitore, ai grafici Helm e ad altri artefatti.

Visualizzare un elenco di tag

oras repo tags $REGISTRY/$REPO

Visualizzare un elenco di manifesti

Un repository può avere un elenco di manifesti contrassegnati e senza tag. Usando l'interfaccia della az acr manifest riga di comando, visualizzare l'elenco completo dei manifesti:

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

Si noti che i manifesti dell'immagine del contenitore hanno "tags", mentre i tipi di riferimento ("mediaType": "application/vnd.oci.artifact.manifest.v1+json") non lo sono.

Nell'output la firma non è contrassegnata, ma viene rilevata come oci.artifact.manifest riferimento all'immagine del contenitore:

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

Eliminare tutti gli artefatti nel grafico

Il supporto per la specifica OCI v1.1 consente di eliminare il grafico degli artefatti associati all'artefatto radice. Usare il oras delete comando per eliminare il grafico degli artefatti (firma, SBOM e firma di SBOM).

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

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

Visualizzare i manifesti rimanenti

Eliminando l'artefatto radice, vengono eliminati anche tutti gli artefatti correlati lasciando un ambiente pulito:

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

Output:

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

Riepilogo

In questo articolo viene creato un grafico degli artefatti della supply chain, individuati, alzati di livello e trascinati fornendo la gestione del ciclo di vita degli artefatti creati e dipendenti.

Passaggi successivi