Atestaciones de compilación
Las atestaciones de compilación describen cómo se compiló una imagen y qué contiene. Las atestaciones son creadas en el momento de la compilación por BuildKit y se adjuntan a la imagen final como metadatos.
El propósito de las atestaciones es hacer posible la inspección de una imagen para ver de dónde proviene, quién la creó, cómo y qué contiene. Esto te permite tomar decisiones informadas sobre cómo afecta una imagen a la seguridad de la cadena de suministro de tu aplicación. También permite el uso de motores de políticas para validar imágenes basadas en las reglas de políticas que hayas definido.
Están disponibles dos tipos de atestaciones de compilación:
- Lista de Materiales de Software (SBOM - Software Bill of Materials): lista de los artefactos de software que contiene una imagen o que se utilizaron para compilarla.
- Procedencia (Provenance): cómo se compiló una imagen.
Propósito de las atestaciones
El uso de paquetes de código abierto y de terceros está más extendido que nunca. Los desarrolladores comparten y reutilizan código porque ayuda a aumentar la productividad, lo que permite a los equipos crear mejores productos de forma más rápida.
Importar y utilizar código creado en otros lugares sin analizarlo introduce un riesgo de seguridad grave. Incluso si revisas el software que consumes, con frecuencia se descubren nuevas vulnerabilidades de día cero, lo que requiere que los equipos de desarrollo tomen medidas para solucionarlas.
Las atestaciones de compilación facilitan ver el contenido de una imagen y de dónde proviene. Utiliza las atestaciones para analizar y decidir si debes usar una imagen, o para ver si las imágenes que ya estás utilizando están expuestas a vulnerabilidades.
Creación de atestaciones
BuildKit genera las atestaciones al compilar la imagen. Las atestaciones de procedencia con el nivel mode=min se añaden a las imágenes por defecto. Los registros de atestación se envuelven en el formato JSON de in-toto y se adjuntan al índice de la imagen en un manifiesto para la imagen final.
Puedes personalizar el comportamiento de las atestaciones utilizando las banderas --provenance y --sbom:
# Activa las atestaciones SBOM:
docker buildx build --sbom=true .
# Activa las atestaciones de procedencia a nivel máximo:
docker buildx build --provenance=mode=max .
# Desactiva las atestaciones de procedencia:
docker buildx build --provenance=false .También puedes desactivar las atestaciones de procedencia por defecto estableciendo la variable de entorno
BUILDX_NO_DEFAULT_ATTESTATIONS. Consulta Atestación de procedencia para más detalles sobre los modos y opciones de procedencia.
Almacenamiento
BuildKit produce atestaciones en el formato in-toto, tal como lo define el framework in-toto, un estándar respaldado por la Linux Foundation.
Las atestaciones se adjuntan a las imágenes como un manifiesto en el índice de la imagen. Los registros de datos de las atestaciones se almacenan como blobs JSON.
Dado que las atestaciones se adjuntan a las imágenes como un manifiesto, esto significa que puedes inspeccionar las atestaciones de cualquier imagen en un registro sin tener que descargar (pull) la imagen completa.
Todos los exportadores de BuildKit admiten atestaciones. Los exportadores local y tar no pueden guardar las atestaciones en un manifiesto de imagen, ya que generan un directorio de archivos o un archivo tar, no una imagen. En su lugar, estos exportadores escriben las atestaciones en uno o más archivos JSON en el directorio raíz de la exportación.
Ejemplo
El siguiente ejemplo muestra una representación JSON in-toto truncada de una atestación SBOM.
{
"_type": "https://in-toto.io/Statement/v0.1",
"predicateType": "https://spdx.dev/Document",
"subject": [
{
"name": "pkg:docker/<registry>/<image>@<tag/digest>?platform=<platform>",
"digest": {
"sha256": "e8275b2b76280af67e26f068e5d585eb905f8dfd2f1918b3229db98133cb4862"
}
}
],
"predicate": {
"SPDXID": "SPDXRef-DOCUMENT",
"creationInfo": {
"created": "2022-12-15T11:47:54.546747383Z",
"creators": ["Organization: Anchore, Inc", "Tool: syft-v0.60.3"],
"licenseListVersion": "3.18"
},
"dataLicense": "CC0-1.0",
"documentNamespace": "https://anchore.com/syft/dir/run/src/core-da0f600b-7f0a-4de0-8432-f83703e6bc4f",
"name": "/run/src/core",
// lista de archivos que contiene la imagen, por ejemplo:
"files": [
{
"SPDXID": "SPDXRef-1ac501c94e2f9f81",
"comment": "layerID: sha256:9b18e9b68314027565b90ff6189d65942c0f7986da80df008b8431276885218e",
"fileName": "/bin/busybox",
"licenseConcluded": "NOASSERTION"
}
],
// lista de paquetes identificados para esta imagen:
"packages": [
{
"name": "busybox",
"originator": "Person: Sören Tempel <[email protected]>",
"sourceInfo": "acquired package info from APK DB: lib/apk/db/installed",
"versionInfo": "1.35.0-r17",
"SPDXID": "SPDXRef-980737451f148c56",
"description": "Size optimized toolbox of many common UNIX utilities",
"downloadLocation": "https://busybox.net/",
"licenseConcluded": "GPL-2.0-only",
"licenseDeclared": "GPL-2.0-only"
// ...
}
],
// relación archivos-paquetes
"relationships": [
{
"relatedSpdxElement": "SPDXRef-1ac501c94e2f9f81",
"relationshipType": "CONTAINS",
"spdxElementId": "SPDXRef-980737451f148c56"
},
...
],
"spdxVersion": "SPDX-2.2"
}
}Para profundizar en los detalles específicos sobre cómo se almacenan las atestaciones, consulta Almacenamiento de atestaciones de imagen (BuildKit).
Formato del manifiesto de atestación
Las atestaciones se almacenan como manifiestos, referenciados por el índice de la imagen. Cada manifiesto de atestación se refiere a un único manifiesto de imagen (una variante de plataforma de la imagen). Los manifiestos de atestación contienen una única capa, el "valor" de la atestación.
El siguiente ejemplo muestra la estructura de un manifiesto de atestación:
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 167,
"digest": "sha256:916d7437a36dd0e258e64d9c5a373ca5c9618eeb1555e79bd82066e593f9afae"
},
"layers": [
{
"mediaType": "application/vnd.in-toto+json",
"size": 1833349,
"digest": "sha256:3138024b98ed5aa8e3008285a458cd25a987202f2500ce1a9d07d8e1420f5491",
"annotations": {
"in-toto.io/predicate-type": "https://spdx.dev/Document"
}
}
]
}Atestaciones como artefactos OCI
Puedes configurar el formato del manifiesto de atestación mediante la
opción oci-artifact para los exportadores image y registry. Si se establece en true, la estructura del manifiesto de atestación cambia de la siguiente manera:
- Se añade un campo
artifactTypeal manifiesto de atestación con el valorapplication/vnd.docker.attestation.manifest.v1+json. - El campo
configes un descriptor vacío en lugar de una configuración ficticia ("dummy"). - También se añade un campo
subjectque apunta al manifiesto de la imagen al que se refiere la atestación.
El siguiente ejemplo muestra una atestación con el formato de artefacto OCI:
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"artifactType": "application/vnd.docker.attestation.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.empty.v1+json",
"size": 2,
"digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"data": "e30="
},
"layers": [
{
"mediaType": "application/vnd.in-toto+json",
"size": 2208,
"digest": "sha256:6d2f2c714a6bee3cf9e4d3cb9a966b629efea2dd8556ed81f19bd597b3325286",
"annotations": {
"in-toto.io/predicate-type": "https://slsa.dev/provenance/v0.2"
}
}
],
"subject": {
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 1054,
"digest": "sha256:bc2046336420a2852ecf915786c20f73c4c1b50d7803aae1fd30c971a7d1cead",
"platform": {
"architecture": "amd64",
"os": "linux"
}
}
}Qué sigue
Aprende más sobre los tipos de atestación disponibles y cómo utilizarlos: