Comprueba quién aprobó la actualización de la guía

CiberseguridadBeginner
Practicar Ahora

Introducción

Waymark publica una guía de un festival de paseos. Un proveedor ha entregado varios paquetes de actualización. Tu trabajo consiste en aceptar la versión que solicitó el organizador sin confiar en un paquete solo porque su suma de comprobación coincida.

Usarás una clave pública del editor proporcionada de forma independiente, verificarás una firma real con Cosign, compararás el producto y la versión solicitados y comprobarás el resumen del archivo comprimido. Necesitas conocimientos básicos de terminal y rutas; no se requiere programación ni una cuenta en la nube. En este laboratorio seleccionarás una actualización. En el siguiente laboratorio guiado convertirás estas decisiones en un receptor reutilizable.

Empieza por la guía del festival y la solicitud de actualización

En este paso verás el servicio en funcionamiento y buscarás la solicitud del organizador antes de elegir una actualización. Abre la pestaña Event Guide. La edición actual de event-guide es 2.0. Abre Old Mill Walk: la hora de encuentro es 11:00. Usa el enlace All walks de la página para volver y descarga la hoja de rutas. El sitio web y el CSV describen los mismos dos paseos.

La página de inicio de la guía identifica la edición encima del encabezado y muestra la hora de encuentro de cada paseo en su tarjeta:

La guía Waymark en funcionamiento antes de la actualización

Ahora cambia a Workspace. Este terminal comparte el mismo contenedor que la guía; las pestañas son entradas distintas, no máquinas diferentes. cd cambia el directorio actual del terminal. La ruta absoluta funciona desde cualquier directorio:

cd /home/labex/project/waymark

cat muestra un archivo de texto pequeño. Lee la solicitud que el organizador proporcionó de forma independiente de los paquetes entregados:

cat /opt/labex-waymark/trust/request.json

El objeto JSON tiene dos campos con nombre:

{
  "product": "event-guide",
  "version": "2.1"
}

Un producto identifica qué guía se actualiza; una versión identifica la edición solicitada. Una edición anterior auténtica no es esta actualización. La clave pública fijada de forma independiente es /opt/labex-waymark/trust/publisher.pub. Conserva esa clave y la solicitud sin cambios.

ls enumera las entradas de un directorio. Inspecciona el directorio de entregas:

ls candidates

Los paquetes tienen etiquetas de entrega como parcel-101; sus nombres no demuestran aprobación. Cada uno contiene manifest.json, manifest.sigstore.json, guide.tar.gz y SHA256SUMS. El manifiesto describe el producto, la versión y el resumen del archivo comprimido. El bundle contiene una firma. El archivo comprimido contiene los archivos reales de la guía. Conserva intactos los paquetes originales, la guía actual, las versiones anteriores y el aviso para visitantes. Pondrás una copia del paquete elegido en accepted/.

Si un comando muestra No such file or directory, ejecuta el comando cd absoluto anterior, usa ls candidates para comprobar la escritura de los nombres y vuelve a intentarlo. Nada en este laboratorio requiere restablecer el entorno.

Aprende qué puede decirte una suma de comprobación coincidente

En este paso compararás dos paquetes que superan la comprobación de sus sumas adjuntas. Permanece en Workspace.

Un resumen SHA-256 es una huella calculada a partir de los bytes de un archivo. Las huellas coincidentes ayudan a detectar cambios en los bytes, siempre que la huella esperada sea de confianza. sha256sum -c lee una lista de sumas de comprobación y compara con ella los archivos indicados. Aquí, -c significa «comprobar». Ejecútalo dentro del paquete porque la lista usa un nombre de archivo relativo:

cd candidates/parcel-103
sha256sum -c SHA256SUMS

Deberías ver guide.tar.gz: OK. Vuelve al proyecto y prueba otro paquete:

cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS

De nuevo, deberías ver guide.tar.gz: OK. Ambas listas llegaron en la misma entrega que sus archivos comprimidos. Alguien que sustituyera un archivo también podría calcular una nueva suma adjunta. OK establece que esos dos archivos concuerdan; no identifica a su editor ni demuestra que se trate de la actualización solicitada.

Vuelve al proyecto:

cd /home/labex/project/waymark

A continuación verificarás el manifiesto con la clave pública en la que el organizador ya confía. El resumen esperado del archivo procederá entonces de ese manifiesto verificado, en lugar de la lista adjunta sin firmar.

Verifica al editor con una clave pública independiente

En este paso distinguirás una firma real de una firma realizada con una clave no aprobada. Empieza en Workspace, en /home/labex/project/waymark.

Un editor firma un archivo con una clave privada. La clave pública correspondiente permite al destinatario verificar la firma y detectar cambios en el archivo firmado. La clave pública debe llegar por un canal en el que ya confíes. Un paquete no puede aprobar su propia clave. Este ejercicio fija una clave de editor sintética suministrada por separado en /opt/labex-waymark/trust/; no se te proporciona la clave privada del editor.

Cosign es la herramienta de firma preparada. verify-blob verifica un archivo; --key selecciona la clave pública de confianza; --bundle selecciona el bundle de firma. El último argumento nombra el manifiesto exacto cuyos bytes están firmados.

Estos paquetes sintéticos se firmaron sin un registro público de transparencia. --insecure-ignore-tlog omite deliberadamente la verificación de inclusión en el registro. Sigue exigiendo una firma válida bajo la clave seleccionada. Este ejercicio local no verifica una identidad pública OIDC, un servicio de certificados ni un registro de transparencia; no copies esta excepción en una política que requiera esos servicios.

El siguiente paquete está firmado con una clave diferente. Se espera que esta verificación falle, con un estado de salida distinto de cero y un error de verificación de firma:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json

echo muestra un valor; $? es el estado de salida del comando inmediatamente anterior. Cero significa éxito y un número distinto de cero significa fallo. Compruébalo inmediatamente:

echo $?

Ahora verifica un paquete firmado por el editor fijado:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json

Deberías ver la advertencia sobre el registro de transparencia y Verified OK:

WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK

Comprueba el estado inmediatamente anterior:

echo $?

Debería ser 0. El manifiesto está firmado con la clave de confianza. Esa es una decisión; aún debes comprobar qué autoriza el manifiesto.

Comprueba el producto, la versión y el resumen del archivo firmados

En este paso usarás el manifiesto verificado para decidir si un paquete auténtico es la versión solicitada. Permanece en Workspace.

Primero verifica una versión anterior auténtica. Se espera que este comando tenga éxito:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json

jq lee JSON. El filtro .product, .version muestra los dos campos indicados. Las comillas simples conservan el filtro como un único argumento, evitando que el shell interprete su puntuación:

jq '.product, .version' candidates/parcel-101/manifest.json

Deberías ver "event-guide" y "2.0". Es una guía auténtica, pero no la 2.1 solicitada. Una firma no convierte automáticamente una versión antigua en la adecuada.

Inspecciona el candidato verificado en el paso anterior:

cat candidates/parcel-104/manifest.json

Su producto y versión coinciden con la solicitud independiente. El campo sha256 es un resumen hexadecimal de 64 caracteres de guide.tar.gz; no lo memorices. jq -r muestra un campo sin las comillas de JSON. Muestra ese resumen esperado:

jq -r .sha256 candidates/parcel-104/manifest.json

Ahora calcula el resumen real del archivo comprimido:

sha256sum candidates/parcel-104/guide.tar.gz

El primer campo debe coincidir con el resumen del manifiesto verificado. El nombre de archivo que aparece después no forma parte del resumen.

El archivo modificado que inspeccionaste antes también tiene un manifiesto firmado auténtico, pero sus bytes actuales ya no coinciden con ese manifiesto. Confírmalo verificando su manifiesto y comparando después los dos resúmenes:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz

La firma pasa la verificación, pero los resúmenes son distintos. Rechaza este paquete. Ahora tienes tres decisiones separadas: firmante de confianza, producto y versión solicitados, y bytes del archivo coincidentes. Si falla cualquiera de ellas, la actualización no está lista para aceptarse.

Acepta el paquete solicitado sin cambiar la guía activa

En este paso guardarás el paquete solicitado y verificado para su entrega. Empieza en Workspace, en /home/labex/project/waymark.

accepted/ ya existe. cp copia archivos; el último argumento es el directorio de destino. Copia el manifiesto, el bundle de firma y el archivo comprimido que verificaste:

cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/

Al copiar obtienes un conjunto de archivos independiente. Verifica ese conjunto, sin suponer que una verificación anterior se aplica a una copia posterior:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz

Se espera una firma válida, event-guide, 2.1 y resúmenes coincidentes del archivo. La autocomprobación preparada de solo lectura usa esos archivos reales, la clave y la solicitud independientes, y el contenido esperado de la guía:

python3 /opt/labex-waymark/verify.py selected

Resultado esperado:

The accepted parcel is the independently signed, requested release with matching archive bytes.

Si falla, comprueba cuál de las tres decisiones falló, repite la copia desde el paquete original correcto y verifica otra vez la copia. Conserva sin cambios los archivos de confianza independientes. La comprobación no selecciona un paquete por ti ni lo despliega.

Cambia a Event Guide y actualiza la página. Debería seguir mostrando la edición 2.0, y la hora de encuentro de Old Mill Walk debería seguir siendo 11:00. Abre Visitor notice y confirma que se conservan los consejos prácticos originales. En esta unidad se acepta una entrega para su traspaso; publicar la actualización es una operación independiente que aprenderás a continuación.

Resumen

Has aceptado una entrega real firmada combinando una clave de editor de confianza independiente, la solicitud de producto y versión del organizador y el resumen del archivo comprimido real. También has visto por qué una suma de comprobación adjunta, una firma válida de una versión antigua o un manifiesto firmado junto a bytes modificados no bastan por sí solos.

La guía actual sigue disponible. En el siguiente laboratorio guiado integrarás estas decisiones en un receptor reutilizable y garantizarás que solo los bytes del archivo verificado lleguen a la guía en funcionamiento.