fix(devsecops): firmar y verificar imagenes por digest, no por tag
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 58s
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 32s
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 35s
Build and Push Medusa / Construir y publicar Medusa (push) Successful in 18m58s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 12m0s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 5m43s

Los 3 pipelines (frontend, commerce-backend, docs-portal) ahora capturan
el digest real del docker push y lo usan como referencia para cosign
sign/verify, en vez del tag mutable :VERSION. Documenta ademas la
decision de mantener Rekor deshabilitado (registry privado, evita
dependencia de red saliente hacia rekor.sigstore.dev via el tunel).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FqYP3Wf1W63Qmh7qgXAAT
This commit is contained in:
2026-08-16 14:46:01 -05:00
co-authored by Claude Sonnet 5
parent b3da3cc131
commit ac095ff981
4 changed files with 94 additions and 17 deletions
+19 -9
View File
@@ -426,12 +426,21 @@ jobs:
# Login ya se hizo arriba; recién acá se sube, después de que la
# imagen pasó el gate de CRITICAL.
- name: Subir Imagen al Registry
id: push
shell: bash
run: |
set -euo pipefail
docker push "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
PUSH_OUTPUT="$(docker push "${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}")"
echo "${PUSH_OUTPUT}"
docker push "${IMAGE_NAME}:latest"
DIGEST="$(echo "${PUSH_OUTPUT}" | grep -oE 'sha256:[a-f0-9]{64}' | tail -1)"
test -n "${DIGEST}" || {
echo "ERROR: no se pudo extraer el digest del push."
exit 1
}
echo "digest=${DIGEST}" >> "$GITHUB_OUTPUT"
- name: Instalar Cosign
shell: bash
run: |
@@ -443,12 +452,13 @@ jobs:
chmod +x /tmp/cosign
/tmp/cosign version
# Firma solo la versión (no :latest, que es un tag mutable y firmarlo
# pierde sentido en cuanto se vuelve a mover). --use-signing-config=false
# --tlog-upload=false: firma solo con el par de llaves propio, sin
# publicar metadata en el transparency log público de Sigstore — este
# registry es privado, no tiene sentido anunciar públicamente qué se
# firmó y cuándo.
# Firma por digest, no por tag: :VERSION y :latest son punteros que
# en teoría podrían volver a moverse, pero el digest identifica el
# contenido exacto de la imagen que Trivy ya escaneó unos pasos
# atrás. --use-signing-config=false --tlog-upload=false: firma solo
# con el par de llaves propio, sin publicar metadata en el
# transparency log público de Sigstore — este registry es privado,
# no tiene sentido anunciar públicamente qué se firmó y cuándo.
- name: Firmar Imagen (Cosign)
shell: bash
env:
@@ -461,7 +471,7 @@ jobs:
--use-signing-config=false \
--tlog-upload=false \
--yes \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
"${IMAGE_NAME}@${{ steps.push.outputs.digest }}"
# Smoke test: confirma en el propio pipeline que la firma que se
# acaba de crear valida contra la llave pública commiteada en el
@@ -475,7 +485,7 @@ jobs:
/tmp/cosign verify \
--key "${APP_DIR}/cosign.pub" \
--insecure-ignore-tlog=true \
"${IMAGE_NAME}:${{ steps.vars.outputs.VERSION }}"
"${IMAGE_NAME}@${{ steps.push.outputs.digest }}"
# Evita que una ejecución antigua actualice frontend.yaml después de que
# ya exista un commit más reciente en main.