Gestire gli artefatti OCI e gli artefatti della catena di approvvigionamento con ORAS
Registro Azure Container (ACR) consente di gestire gli artefatti OCI (Open Container Initiative) e gli artefatti della catena di approvvigionamento. Questo articolo informa su come usare Registro Azure Container per gestire gli artefatti OCI e gli artefatti della catena di approvvigionamento in modo efficace. Informazioni su come archiviare, gestire e recuperare sia gli artefatti OCI che un grafo di artefatti della catena di approvvigionamento, tra cui firme, distinta base del software (SBOM), risultati dell'analisi della sicurezza e altri tipi.
Questo articolo è diviso in due sezioni principali:
- Eseguire il push e il pull degli artefatti OCI con ORAS
- Collegare, eseguire il push e il pull degli artefatti della catena di approvvigionamento con ORAS
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.
- Interfaccia della riga di comando di Azure: è necessaria la versione
2.29.1
o una versione 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
v1.1.0
o una versione successiva. 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'oras
interfaccia della riga di comando usa l'archivio credenziali di Docker Desktop per l'archiviazione delle credenziali. Se Docker Desktop è installato, deve essere in esecuzione peroras login
.
Configurare il registro
Per configurare l'ambiente per semplificare l'esecuzione dei comandi, seguire questa procedura:
- Impostare la variabile
ACR_NAME
sul nome del registro. - Impostare la variabile
REGISTRY
su$ACR_NAME.azurecr.io
. - Impostare la variabile
REPO
sul nome dell’archivio. - Impostare la variabile
TAG
sul tag desiderato. - Impostare la variabile
IMAGE
su$REGISTRY/${REPO}:$TAG
.
Impostare le variabili di ambiente
Configurare un nome del registro, credenziali di accesso, un nome dell’archivio e un tag per eseguire il push e il pull degli artefatti. Nell'esempio seguente vengono usati il nome net-monitor
e il tag v1
dell’archivio. Sostituire con il proprio nome e tag dell’archivio.
ACR_NAME=myregistry
REGISTRY=$ACR_NAME.azurecr.io
REPO=net-monitor
TAG=v1
IMAGE=$REGISTRY/${REPO}:$TAG
Accedere a un registro
Eseguire l'autenticazione con Registro Azure Container per consentire di eseguire il pull e il push delle immagini del contenitore.
az login
az acr login -n $REGISTRY
Se Docker non è disponibile, è possibile usare il token di Progettazione applicazioni fornito per l'autenticazione. Eseguire l'autenticazione con l'identità singola di Microsoft Entra usando un token di Progettazione applicazioni. Usare sempre "000..." per il USER_NAME
perché il token viene analizzato tramite la variabile PASSWORD
.
# Login to Azure
az login
Accedere con ORAS
Specificare le credenziali per oras login
.
oras login $REGISTRY \
--username $USER_NAME \
--password $PASSWORD
Questa configurazione consente di eseguire facilmente il push e il pull degli artefatti da e verso Registro Azure Container. Modificare le variabili in base alle esigenze per la configurazione specifica.
Eseguire il push e il pull degli artefatti OCI con ORAS
È possibile usare un Registro Azure Container per archiviare e gestire artefatti OCI (Open Container Initiative), nonché immagini del contenitore Docker e OCI.
Per mostrare questa funzionalità, questa sezione spiega come usare l'interfaccia della riga di comando di ORAS (OCI Registry as Storage) per eseguire il push e il pull degli artefatti OCI da e verso un Registro Azure Container. È possibile gestire vari artefatti OCI in un Registro Azure Container usando diversi strumenti della riga di comando appropriati per ogni artefatto.
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 Registro Azure Container.
Eseguire il push di un artefatto
Un singolo file artefatto senza subject
elemento padre può essere qualsiasi elemento come un'immagine del contenitore, un grafico Helm, un file leggimi per l’archivio. Gli artefatti di riferimento possono essere qualsiasi elemento come una firma, una distinta base del software, report di analisi o altri tipi in evoluzione. Gli artefatti di riferimento, descritti in Collegare, eseguire il push e il pull degli artefatti della catena di approvvigionamento sono artefatti che fanno riferimento a un altro artefatto.
Eseguire il push di un singolo file artefatto
Per questo esempio, creare contenuto che rappresenta un file markdown:
echo 'Readme Content' > readme.md
Nel passaggio seguente si esegue il push del file readme.md
in <myregistry>.azurecr.io/samples/artifact:readme
.
- Il registro viene identificato con il nome completo
<myregistry>.azurecr.io
del registro (tutte minuscole), seguito dallo spazio dei nomi e dall’archivio:/samples/artifact
. - L'artefatto è contrassegnato come
:readme
, per identificarlo in modo univoco da altri artefatti elencati nell’archivio (:latest, :v1, :v1.0.1
). - L'impostazione
--artifact-type readme/example
differenzia l'artefatto da un'immagine del contenitore, che usaapplication/vnd.oci.image.config.v1+json
. ./readme.md
Identifica il file caricato e:application/markdown
rappresenta l'IANAmediaType
del file.
Per altre informazioni, vedere Materiale sussidiario per gli autori di artefatti OCI.
Usare il comando oras push
per eseguire il push del file nel registro.
Linux, WSL2 o 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
L'output per un push eseguito correttamente è simile all'output seguente:
Uploading 2fdeac43552b readme.md
Uploaded 2fdeac43552b readme.md
Pushed <myregistry>.azurecr.io/samples/artifact:readme
Digest: sha256:e2d60d1b171f08bd10e2ed171d56092e39c7bac1
aec5d9dcf7748dd702682d53
Eseguire il push di un artefatto con più file
Quando viene eseguito il push degli artefatti OCI in un registro con ORAS, ogni file di riferimento viene inserito come BLOB (oggetto binario di grandi dimensioni). 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 Eseguire il push di artefatti con più file.
Creare una documentazione per l’archivio:
echo 'Readme Content' > readme.md
mkdir details/
echo 'Detailed Content' > details/readme-details.md
echo 'More detailed Content' > details/readme-more-details.md
Eseguire il push dell'artefatto con più file:
Linux, WSL2 o 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
Trovare il manifesto
Per visualizzare il manifesto creato come risultato di oras push
, usare oras manifest fetch
:
oras manifest fetch --pretty $REGISTRY/samples/artifact:readme
L'output è simile a:
{
"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"
}
}
Eseguire il pull di un artefatto
Creare una directory pulita per il download.
mkdir ./download
Eseguire il comando oras pull
per eseguire il pull dell'artefatto dal registro.
oras pull -o ./download $REGISTRY/samples/artifact:readme
Visualizzare i file spostati
tree ./download
Rimuovere l'artefatto (facoltativo)
Per rimuovere l'artefatto dal registro, usare il comando oras manifest delete
.
oras manifest delete $REGISTRY/samples/artifact:readme
Collegare, eseguire il push e il pull degli artefatti della catena di approvvigionamento con ORAS
Per mostrare questa funzionalità, questo articolo spiega come usare l'interfaccia della riga di comando di ORAS (OCI Registry as Storage) per push
, discover
e pull
un grafo degli artefatti della catena di approvvigionamento in un Registro Azure Container.
L'archiviazione di singoli artefatti OCI (oggetto) è descritta in Eseguire il push e pull di artefatti OCI.
Per archiviare un grafo di artefatti, viene definito un subject
riferimento a un artefatto usando il manifesto dell'immagine OCI, che fa parte della Specifica di distribuzione OCI 1.1 versione preliminare.
Eseguire il push di un'immagine del contenitore
Per associare un grafo di artefatti a un'immagine del contenitore usando l'interfaccia della riga di comando di Azure:
È possibile compilare ed eseguire il push di un'immagine del contenitore oppure ignorare questo passaggio se $IMAGE
fa riferimento a un'immagine esistente nel registro.
az acr build -r $ACR_NAME -t $IMAGE https://github.com/wabbit-networks/net-monitor.git#main
Collegare una firma
echo '{"artifact": "'${IMAGE}'", "signature": "jayden hancock"}' > signature.json
Collegare una firma al registro, come riferimento all'immagine del contenitore
Il comando oras attach
crea un riferimento tra il file (./signature.json
) e $IMAGE
. --artifact-type
permette di differenziare gli artefatti, in modo simile alle estensioni di file che consentono tipi di file diversi. È possibile collegare 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 con più file come riferimento
Quando viene eseguito il push degli artefatti OCI in un registro con ORAS, ogni file di riferimento viene inserito come BLOB (oggetto binario di grandi dimensioni). 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.
Trovare i riferimenti agli artefatti
La Specifica OCI v1.1 definisce i referrer dell’API per trovare i riferimenti a un subject
artefatto. Il comando oras discover
può visualizzare l'elenco di riferimenti all'immagine del contenitore.
Usare oras discover
per visualizzare il grafo degli artefatti ora archiviati nel registro.
oras discover -o tree $IMAGE
L'output mostra l'inizio di un grafo 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 Grafi di artefatti
La Specifica OCI v1.1 consente grafici profondi, abilitando la distinta base del software (SBOM) e altri tipi di artefatti.
Ecco come creare e collegare una SBOM al registro:
Creare una SBOM di esempio
echo '{"version": "0.0.0.0", "artifact": "'${IMAGE}'", "contents": "good"}' > sbom.json
Collegare una SBOM di esempio all'immagine nel registro
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 la SBOM
Importante
Microsoft consiglia di usare uno strumento di firma di crittografia sicuro, ad esempio Notation per firmare l'immagine e generare una firma per la firma delle 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 oras discover
con --artifact-type
applicando il filtro per trovare il digest. In questo esempio viene usata una semplice firma JSON a scopo dimostrativo.
SBOM_DIGEST=$(oras discover -o json \
--artifact-type sbom/example \
$IMAGE | jq -r ".manifests[0].digest")
Creare una firma di una SBOM.
echo '{"artifact": "'$IMAGE@$SBOM_DIGEST'", "signature": "jayden hancock"}' > sbom-signature.json
Collegare la firma SBOM
oras attach $IMAGE@$SBOM_DIGEST \
--artifact-type 'signature/example' \
./sbom-signature.json:application/json
Visualizzare il grafo
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 del Grafo di artefatto
Un flusso di lavoro DevOps tipico alza di livello gli artefatti dallo sviluppo tramite staging all'ambiente di produzione. I flussi di lavoro della catena di approvvigionamento sicura alzano di livello il contenuto pubblico in ambienti protetti privatamente. In entrambi i casi si vogliono alzare di livello le firme, le SBOM, i risultati dell'analisi e altri artefatti correlati con l'artefatto soggetto per avere un grafo completo delle dipendenze.
Usando il comando oras copy
è possibile alzare di livello un grafo filtrato di artefatti 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
L'output dioras 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
Trovare il grafo 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
Effettuare il pull di artefatti di riferimento
Per eseguire il pull di un artefatto di riferimento specifico, il digest di riferimento viene trovato con il comando oras discover
:
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
L'output ditree
:
./download
├── details
│ ├── readme-details.md
│ └── readme-more-details.md
└── readme.md
Visualizzare l’archivio e l'elenco di tag
ORAS consente di eseguire il push, trovare, eseguire il pull e la copia dei grafi degli artefatti senza dover assegnare tag. Consente inoltre a un elenco di tag di concentrarsi sugli artefatti a cui gli utenti pensano, invece delle firme e delle SBOM associate alle immagini del contenitore, ai grafici Helm e ad altri artefatti.
Visualizzare un elenco di tag
oras repo tags $REGISTRY/$REPO
Eliminazione di tutti gli artefatti nel grafo
Il supporto per la Specifica OCI v1.1 consente di eliminare il grafo degli artefatti associati all'artefatto del soggetto. Usare il comando oras manifest delete
per eliminare il grafo degli artefatti (firma, SBOM e firma della SBOM).
oras manifest delete -f $REGISTRY/$REPO:$TAG
oras manifest delete -f $REGISTRY/sample-staging/$REPO:$TAG
È possibile visualizzare l'elenco dei manifesti per confermare l'eliminazione dell'artefatto del soggetto e 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 si è appreso come usare Registro Azure Container per archiviare, gestire e recuperare sia gli artefatti OCI sia gli artefatti della catena di approvvigionamento. È stata usata l'interfaccia della riga di comando ORAS per eseguire il push e il pull degli artefatti da e verso un Registro Azure Container. È stato anche individuato il manifesto degli artefatti di cui è stato eseguito il push ed è stato visualizzato il grafo degli artefatti Collegati all'immagine del contenitore.
Passaggi successivi
- Informazioni sui Riferimenti agli artefatti, sull'associazione di firme, sulla distinta base del software e su altri tipi di riferimento.
- Altre informazioni sul progetto ORAS, tra cui come configurare un manifesto per un artefatto.
- Per informazioni di riferimento sui nuovi tipi di artefatti visitare l’archivio artefatti OCI.