Artefactos de cadena de suministro de inserción y extracción mediante Azure Registry (versión preliminar)
Use un registro de contenedor de Azure para almacenar y administrar un gráfico de artefactos de la cadena de suministro, incluidas firmas, lista de materiales de software (SBOM), resultados de análisis de seguridad y otros tipos.
Para demostrar esta funcionalidad, en este artículo se muestra cómo usar la CLI de OCI Registry as Storage (ORAS) para push
, discover
y pull
un grafo de artefactos de cadena de suministros en un registro de contenedor de Azure.
El almacenamiento de artefactos de OCI individuales (raíz) se trata en Inserción y extracción de artefactos de OCI.
Para almacenar un grafo de artefactos, se define una referencia a un artefacto subject
mediante el manifiesto de artefacto de OCI, que forma parte de la especificación de la distribución OCI 1.1 en versión preliminar.
La compatibilidad con OCI 1.1 Artifact Manifest es una característica en versión preliminar de ACR y está sujeta a limitaciones.
Prerrequisitos
- Registro de contenedor de Azure: cree un registro de contenedor en la suscripción de Azure. Por ejemplo, use Azure Portal o la CLI de Azure.
Consulte Limitaciones de la versión preliminar para más información sobre la compatibilidad con la nube de Azure. - CLI de Azure: se requiere la versión
2.29.1
o posterior. Consulte Instalación de la CLI de Azure para obtener información sobre la instalación o actualización. - CLI de ORAS: se requiere la versión
v0.16.0
o posterior. Consulte: Instalación de ORAS. - Docker (opcional): para completar el tutorial, se hace referencia a una imagen de contenedor.
Puede usar Docker instalado localmente para crear e insertar una imagen de contenedor, o bien usar
acr build
para crear de forma remota en Azure.
Aunque Docker Desktop no es necesario, la CLI deoras
usa el almacén de credenciales de escritorio de Docker para almacenar credenciales. Si Docker Desktop está instalado, debe ejecutarse paraoras login
.
Limitaciones de vista previa
La compatibilidad con manifiestos de artefactos de OCI (especificación OCI 1.1) está disponible en todas las regiones públicas de Azure. Microsoft Azure operado por 21Vianet y nubes gubernamentales aún no se admiten.
Configuración de un registro
Configure variables de entorno para copiar y pegar comandos fácilmente en el shell. Los comandos se pueden ejecutar localmente o en Azure Cloud Shell.
ACR_NAME=myregistry
REGISTRY=$ACR_NAME.azurecr.io
REPO=net-monitor
TAG=v1
IMAGE=$REGISTRY/${REPO}:$TAG
Autentíquese con la identidad individual de Microsoft Entra mediante un token de AD. Utilice siempre "000..." para USER_NAME
, ya que el token se analiza mediante la variable PASSWORD
.
# 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
ACR y ORAS admiten varias opciones de autenticación para los usuarios y la automatización del sistema. En este artículo se usa una identidad individual, que emplea un token de Azure. Para ver más opciones de autenticación, consulte Autenticación con un registro de contenedor de Azure.
Inicio de sesión con ORAS
Proporcione las credenciales a oras login
.
oras login $REGISTRY \
--username $USER_NAME \
--password $PASSWORD
Inserción de una imagen de contenedor
En este ejemplo se asocia un grafo de artefactos a una imagen de contenedor.
Cree e inserte una imagen de contenedor u omita este paso si $IMAGE
hace referencia a una imagen existente en el registro.
az acr build -r $ACR_NAME -t $IMAGE https://github.com/wabbit-networks/net-monitor.git#main
Creación de una firma de ejemplo en la imagen de contenedor
echo '{"artifact": "'${IMAGE}'", "signature": "jayden hancock"}' > signature.json
Asociación de una firma en el registro, como referencia a la imagen de contenedor
El comando oras attach
crea una referencia entre el archivo (./signature.json
) y $IMAGE
. El --artifact-type
proporciona artefactos de diferenciación, de forma similar a las extensiones de archivo que habilitan diferentes tipos de archivo. Se pueden asociar uno o varios archivos especificando [file]:[mediaType]
.
oras attach $IMAGE \
--artifact-type signature/example \
./signature.json:application/json
Para obtener más información sobre la asociación con ORAS, consulte Documentación de ORAS.
Asociación de un artefacto de varios archivos como referencia
Cuando se insertan artefactos de OCI en un registro con ORAS, cada referencia de archivo se inserta como un blob. Para insertar blobs independientes, haga referencia a los archivos individualmente o a la colección de archivos haciendo referencia a un directorio.
Para obtener más información sobre cómo insertar una colección de archivos, consulte Inserción de artefactos con varios archivos.
Cree documentación sobre un artefacto:
echo 'Readme Content' > readme.md
mkdir details/
echo 'Detailed Content' > details/readme-details.md
echo 'More detailed Content' > details/readme-more-details.md
Asocie un artefacto de varios archivos como referencia 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
Descubrimiento de referencias de artefacto
La especificación OCI v1.1 define una API de referencias para detectar referencias a un artefacto subject
. El comando oras discover
puede mostrar la lista de referencias a la imagen de contenedor.
Con oras discover
, consulte el grafo de artefactos ahora almacenados en el registro.
oras discover -o tree $IMAGE
La salida muestra el principio de un grafo de artefactos, donde la firma y los documentos se ven como elementos secundarios de la imagen de contenedor.
myregistry.azurecr.io/net-monitor:v1
├── signature/example
│ └── sha256:555ea91f39e7fb30c06f3b7aa483663f067f2950dcb...
└── readme/example
└── sha256:1a118663d1085e229ff1b2d4d89b5f6d67911f22e55...
Creación de grafos profundos de artefactos
La especificación OCI v1.1 permite grafos profundos, que habilitan la lista de materiales de software firmados (SBOM) y otros tipos de artefactos.
Creación de una SBOM de muestra
echo '{"version": "0.0.0.0", "artifact": "'${IMAGE}'", "contents": "good"}' > sbom.json
Asociación de una SBOM de muestra a la imagen del 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
Firma de la SBOM
Los artefactos que se insertan como referencias normalmente no tienen etiquetas, ya que se consideran parte del artefacto subject
. Para insertar una firma en un artefacto que es un elemento secundario de otro artefacto, use el oras discover
con el filtrado --artifact-type
para buscar la síntesis del mensaje.
SBOM_DIGEST=$(oras discover -o json \
--artifact-type sbom/example \
$IMAGE | jq -r ".manifests[0].digest")
Creación de una firma de una SBOM
echo '{"artifact": "'$IMAGE@$SBOM_DIGEST'", "signature": "jayden hancock"}' > sbom-signature.json
Asociación de la firma de SBOM
oras attach $IMAGE@$SBOM_DIGEST \
--artifact-type 'signature/example' \
./sbom-signature.json:application/json
Consulte el grafo
oras discover -o tree $IMAGE
Se genera el siguiente código resultado:
myregistry.azurecr.io/net-monitor:v1
├── sbom/example
│ └── sha256:4f1843833c029ecf0524bc214a0df9a5787409fd27bed2160d83f8cc39fedef5
│ └── signature/example
│ └── sha256:3c43b8cb0c941ec165c9f33f197d7f75980a292400d340f1a51c6b325764aa93
├── readme/example
│ └── sha256:5fafd40589e2c980e2864a78818bff51ee641119cf96ebb0d5be83f42aa215af
└── signature/example
└── sha256:00da2c1c3ceea087b16e70c3f4e80dbce6f5b7625d6c8308ad095f7d3f6107b5
Promoción del grafo
Un flujo de trabajo típico de DevOps promoverá artefactos desde la etapa de desarrollo a través de la etapa de almacenamiento provisional, hasta la etapa en el entorno de producción. Los flujos de trabajo de una cadena de suministro segura promueven el contenido público a entornos protegidos de forma privada. En cualquier caso, querrá promover las firmas, las SBOM, examinar los resultados y otros artefactos relacionados con el artefacto raíz para tener un grafo completo de dependencias.
Con el comando oras copy
, puede promover un grafo filtrado de artefactos entre registros.
Copie la imagen net-monitor:v1
y sus artefactos relacionados en sample-staging/net-monitor:v1
:
TARGET_REPO=$REGISTRY/sample-staging/$REPO
oras copy -r $IMAGE $TARGET_REPO:$TAG
La salida de 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
Detección del grafo de artefactos promocionados
oras discover -o tree $TARGET_REPO:$TAG
Salida de 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
Extracción de un artefacto al que se hace referencia
Para extraer un artefacto específico al que se hace referencia, la síntesis del mensaje de referencia se detecta con el comando oras discover
:
DOC_DIGEST=$(oras discover -o json \
--artifact-type 'readme/example' \
$TARGET_REPO:$TAG | jq -r ".manifests[0].digest")
Creación de un directorio limpio para la descarga
mkdir ./download
Extracción de los documentos en el directorio de descarga
oras pull -o ./download $TARGET_REPO@$DOC_DIGEST
Visualización de los documentos
tree ./download
La salida de tree
:
./download
├── details
│ ├── readme-details.md
│ └── readme-more-details.md
└── readme.md
Visualización del repositorio y la lista de etiquetas
El manifiesto de artefactos de OCI permite insertar, detectar, extraer y copiar grafos de artefactos sin tener que asignar etiquetas. Los manifiestos de artefacto permiten que una lista de etiquetas se centre en los artefactos en los que los usuarios piensan, en lugar de las firmas y las SBOM asociadas a las imágenes de contenedor, gráficos de Helm y otros artefactos.
Consulte una lista de etiquetas
oras repo tags $REGISTRY/$REPO
Visualización de una lista de manifiestos
Un repositorio puede tener una lista de manifiestos etiquetados y sin etiquetar. Con la CLI de az acr manifest
, vea la lista completa de manifiestos:
az acr manifest list-metadata \
--name $REPO \
--registry $ACR_NAME \
--output jsonc
Observe que los manifiestos de imagen de contenedor tienen "tags"
, mientras que los tipos de referencia ("mediaType": "application/vnd.oci.artifact.manifest.v1+json"
) no.
En la salida, la firma no está etiquetada, pero se realiza un seguimiento como referencia oci.artifact.manifest
a la imagen de contenedor
{
"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"
}
Eliminación de todos los artefactos del grafo
La compatibilidad con la especificación OCI v1.1 permite eliminar el grafo de artefactos asociados al artefacto raíz. Use el comando oras delete
para eliminar el grafo de artefactos (firma, SBOM y la firma de la SBOM).
oras manifest delete -f $REGISTRY/$REPO:$TAG
oras manifest delete -f $REGISTRY/sample-staging/$REPO:$TAG
Visualización de los manifiestos restantes
Al eliminar el artefacto raíz, todos los artefactos relacionados también se eliminan dejando un entorno limpio:
az acr manifest list-metadata \
--name $REPO \
--registry $ACR_NAME -o jsonc
Salida:
2023-01-10 18:38:45.366387 Error: repository "net-monitor" is not found.
Resumen
En este artículo se crea, detecta, promociona y extrae un grafo de artefactos de la cadena de suministro que proporciona administración del ciclo de vida de los artefactos que crea y de los que depende.
Pasos siguientes
- Obtenga más información sobre la CLI de ORAS
- Aprenda más sobre OCI Artifact Manifest para saber cómo insertar, detectar, extraer y copiar un grafo de artefactos de la cadena de suministro