Verificar SBOM y evidencia de suma de comprobación

CiberseguridadBeginner
Practicar Ahora

Introducción

La evidencia de la cadena de suministro solo es útil si se verifica antes del despliegue. Un paquete de lanzamiento puede contener un manifiesto de Kubernetes, un SBOM, metadatos de imagen y un archivo de suma de comprobación (checksum). La suma de comprobación demuestra que los archivos listados no han sido alterados. El SBOM y los metadatos de la imagen le ayudan a confirmar qué imagen y qué evidencia de paquetes afirma contener el lanzamiento.

En este laboratorio, validará un paquete de lanzamiento local utilizando sha256sum y jq, confirmará que el SBOM y los metadatos de la imagen describen la carga de trabajo aprobada, registrará un resultado de validación en formato JSON compacto y desplegará únicamente el manifiesto aprobado. Este laboratorio no requiere descargas externas ni herramientas de firma. Se centra en el hábito fundamental de CKS: verificar la evidencia local antes de confiar en el artefacto de lanzamiento.

Inspeccionar el paquete de lanzamiento

En este paso, inspeccionará el paquete de lanzamiento antes de ejecutar cualquier comando de validación. Esto es importante porque los archivos de suma de comprobación solo cubren las rutas listadas en su interior. Un archivo puede existir en el paquete y, aun así, estar fuera del conjunto de lanzamiento aprobado.

Comience en el directorio del proyecto y lea las notas:

cd /home/labex/project
sed -n '1,180p' RELEASE_VALIDATION_NOTES.md

Liste los archivos del paquete:

find release-bundle -path release-bundle/evidence -prune -o -type f -print | sort | tee release-bundle/evidence/bundle-files.txt

Acceda al paquete e inspeccione el archivo de suma de comprobación:

cd /home/labex/project/release-bundle
cat checksums.sha256 | tee evidence/checksum-file-review.txt

Debería ver las sumas de comprobación para manifests/receipt-ledger-approved.yaml, sbom.json y image-metadata.json. El manifiesto no listado debería existir en el paquete, pero no debería aparecer en checksums.sha256.

Verificar sumas de comprobación y rechazar el candidato no listado

En este paso, verificará los artefactos listados con sha256sum -c. La opción -c lee los hashes esperados de un archivo de suma de comprobación y los compara con los archivos actuales. Un resultado exitoso significa que los archivos listados aún coinciden con las sumas de comprobación aprobadas.

Ejecute la verificación de la suma de comprobación:

sha256sum -c checksums.sha256 | tee evidence/checksum-verification.txt

Confirme que el manifiesto no listado no forma parte de la evidencia de suma de comprobación aprobada:

if grep -q 'receipt-ledger-unlisted.yaml' checksums.sha256; then
  echo "unlisted manifest is unexpectedly approved" | tee evidence/unlisted-check.txt
else
  echo "unlisted manifest is not in the approved checksum list" | tee evidence/unlisted-check.txt
fi

El primer comando debería imprimir OK para los tres archivos listados. El segundo comando debería indicar que el manifiesto no listado no se encuentra en la lista de sumas de comprobación aprobadas.

Hacer coincidir los metadatos de SBOM con los metadatos de la imagen

En este paso, inspeccionará el SBOM y los metadatos de la imagen. La suma de comprobación le indica que los archivos no han cambiado, pero no explica si el SBOM describe la imagen que planea desplegar. Para ello, compare el nombre de la imagen y el resumen (digest) en ambos archivos.

Extraiga los metadatos del componente SBOM:

jq '.metadata.component' sbom.json | tee evidence/sbom-component.json

Confirme que el SBOM contiene la entrada del paquete esperada:

jq '.components[] | select(.name == "busybox")' sbom.json | tee evidence/sbom-required-package.json

Inspeccione los metadatos de la imagen:

jq . image-metadata.json | tee evidence/image-metadata-review.json

Ahora, cree un JSON de validación compacto a partir de la evidencia que acaba de inspeccionar. Las variables de shell leen la suma de comprobación del manifiesto aprobado y el resumen de la imagen del paquete en lugar de codificarlos directamente.

approved_sha="$(awk '$2=="manifests/receipt-ledger-approved.yaml" {print $1}' checksums.sha256)"
image_digest="$(jq -r '.digest' image-metadata.json)"

cat > evidence/validation.json <<EOF
{
  "checksum_status": "verified",
  "approved_manifest": "manifests/receipt-ledger-approved.yaml",
  "approved_manifest_sha256": "${approved_sha}",
  "sbom_name": "receipt-ledger",
  "sbom_version": "1.8.4",
  "sbom_image": "busybox:1.36",
  "sbom_package": "busybox",
  "image_digest": "${image_digest}",
  "rejected_manifest": "manifests/receipt-ledger-unlisted.yaml",
  "rejection_reason": "not-listed-in-checksums"
}
EOF
jq -M . evidence/validation.json

Este JSON no es un informe narrativo. Es un registro pequeño y legible por máquina de los hechos de verificación que usted desearía tener antes del despliegue.

Desplegar únicamente el manifiesto aprobado

En este paso, desplegará solo el manifiesto que superó la validación de suma de comprobación. El candidato no listado está presente en el paquete, pero no figuraba en el archivo de suma de comprobación aprobado, por lo que debe permanecer fuera del clúster.

Aplique el manifiesto aprobado:

kubectl apply -f manifests/receipt-ledger-approved.yaml

Espere al despliegue:

kubectl -n cks-prep-sbom rollout status deployment/receipt-ledger --timeout=120s

Confirme que el despliegue no listado no se haya creado:

if kubectl -n cks-prep-sbom get deployment receipt-ledger-unlisted >/dev/null 2>&1; then
  echo "unlisted deployment exists" | tee evidence/unlisted-deployment-check.txt
else
  echo "unlisted deployment is absent" | tee evidence/unlisted-deployment-check.txt
fi

Lea el estado de ejecución del Pod aprobado:

pod="$(kubectl -n cks-prep-sbom get pod -l app=receipt-ledger --field-selector=status.phase=Running -o jsonpath='{.items[0].metadata.name}')"
kubectl -n cks-prep-sbom exec "$pod" -- cat /release/status.txt | tee evidence/runtime-status.txt

El estado de ejecución debería ser:

release-status=approved

Resumen

Usted inspeccionó un paquete de lanzamiento local, verificó las sumas de comprobación aprobadas, confirmó que un candidato no listado estaba fuera del conjunto de lanzamiento aprobado, hizo coincidir los metadatos de SBOM con los metadatos de la imagen, registró evidencia de validación en un JSON compacto y desplegó únicamente el manifiesto de Kubernetes aprobado. Este es el flujo de trabajo fundamental de evidencia de la cadena de suministro: verificar la integridad y la identidad antes del despliegue.