Seguridad de supply chain en Docker | Nicolás Garzón
Texto
Copiar source
+ dependencias
+ base image
+ builder
+ pipeline
+ registry
→ image por digest
→ deploymentLa seguridad de supply chain busca responder:
qué contiene la imagen;
de dónde provino cada componente;
quién y dónde la construyó;
si el artefacto fue modificado;
qué digest exacto se desplegó;
qué vulnerabilidades conocidas lo afectan.
Un tag como latest no responde ninguna de esas preguntas.
dependencia maliciosa;
typosquatting;
base image comprometida;
token de CI filtrado;
builder persistente contaminado;
cache manipulada;
artefacto sustituido en registry;
tag movido después de aprobación;
script de instalación comprometido;
paquete legítimo vulnerado;
source generado diferente al revisado.
El runtime puede estar endurecido y aun ejecutar código malicioso construido antes.
Bash
Copiar docker pull registry.example.com/api:1.8.2
docker image inspect registry.example.com/api:1.8.2 \
--format '{{json .RepoDigests}}' Texto
Copiar registry.example.com/api@sha256:...El digest identifica contenido. El tag es una referencia mutable.
Texto
Copiar CI construye
→ publica tag y digest
→ tests aprueban digest
→ promoción conserva digest
→ producción despliega ese digestNo reconstruyas separadamente para staging y producción si quieres demostrar que ambos ejecutaron el mismo artefacto.
docker
Copiar FROM node:22-bookworm-slim@sha256:...Fijar digest mejora reproducibilidad, pero introduce responsabilidad de actualización. El digest no recibe parches automáticamente.
digest fijado + bot/proceso que propone upgrades;
tag controlado + resolución periódica registrada y aprobada.
Lo importante es combinar identidad y actualización, no elegir una y olvidar la otra.
Una Software Bill of Materials inventaría componentes presentes:
paquetes del sistema;
librerías de lenguaje;
versiones;
relaciones;
licencias;
metadata de origen.
Una SBOM permite responder rápidamente:
Texto
Copiar ¿La image contiene la librería X versión vulnerable?
que el componente sea seguro;
que el inventario sea perfecto;
que la vulnerabilidad sea explotable;
que no exista código malicioso;
que el build sea íntegro.
Es un inventario, no un certificado de seguridad.
Puede generarse durante build o analizarse después. Es preferible asociarla al digest exacto y publicarla como attestation/referrer compatible con el registry.
formato interoperable;
relación inequívoca con digest;
conservación junto al artefacto;
cobertura de paquetes OS y aplicación;
actualización en cada build.
Una SBOM generada desde el repository puede diferir de lo realmente instalado. Analizar el resultado final reduce esa brecha.
Un scanner compara componentes con bases de vulnerabilidades conocidas.
Resultados deben priorizarse por:
severidad;
exploitability;
exposición;
privileges;
fix disponible;
uso real del componente;
controles compensatorios;
criticidad del servicio.
Conteo bruto de CVEs es una métrica pobre. Una vulnerabilidad crítica alcanzable en una librería expuesta puede importar más que cien findings de herramientas ausentes en runtime.
El scanner detecta una biblioteca instalada, pero la funcionalidad vulnerable no es alcanzable.
No la ignores sin análisis. Documenta:
componente;
versión;
path de exposición;
decisión;
expiración de excepción.
componente no fue identificado;
advisory aún no existe;
código propio contiene el bug;
paquete fue modificado;
base de datos está desactualizada.
Escaneo no reemplaza review, testing, threat modeling ni runtime controls.
Provenance describe cómo se construyó el artefacto:
source repository;
commit;
builder;
workflow;
parámetros no sensibles;
materials/inputs;
fecha;
identidad del proceso.
Texto
Copiar ¿Este digest fue construido por el pipeline autorizado desde el commit esperado?Una provenance generada por un builder comprometido puede mentir. La confianza depende de identidad del builder, firma, aislamiento y políticas.
SBOM y provenance pueden adjuntarse al artefacto como attestations.
Texto
Copiar image digest
├── SBOM attestation
├── provenance attestation
└── signatureEl consumidor debe verificar:
identidad firmante;
subject digest;
issuer;
repository/workflow permitido;
nivel de provenance;
expiración/revocación.
Una firma permite verificar que una identidad autorizada aprobó o produjo un digest.
No significa que el contenido sea bueno. Significa que:
el artefacto no cambió desde la firma;
una clave/identidad concreta lo firmó.
claves;
identidad OIDC del pipeline;
políticas de quién puede firmar;
revocación;
transparencia/auditoría.
Evita claves largas almacenadas como secret estático cuando exista firma keyless o identidad de workload adecuada.
Antes de desplegar, una política puede exigir:
digest, no tag;
firma válida;
provenance del workflow autorizado;
SBOM presente;
ausencia de vulnerabilidades por encima de umbral;
base permitida;
antigüedad máxima;
usuario no root;
secrets no detectados.
Una política demasiado rígida sin proceso de excepción bloquea incident response. Una política sin enforcement es documentación.
El builder es parte de la confianza.
runner compartido conserva secretos;
workspace no se limpia;
Docker socket entrega control del host;
cache de PR no confiable alimenta release;
dependencia descarga código arbitrario;
network permite exfiltración.
runners efímeros;
permisos mínimos;
branches protegidas;
secrets solo en workflows confiables;
caches separadas por trust boundary;
builder actualizado;
logs auditables;
output por digest.
Una cache remota acelera build, pero puede contener outputs previos.
Texto
Copiar PR no confiable
→ cache aislada de PR
main protegido
→ cache de releaseNo permitas que una PR externa escriba directamente la cache consumida por un release privilegiado.
El build debe seguir siendo correcto con cache vacía.
Usa instalación reproducible:
Lockfile no garantiza que el paquete sea legítimo; fija la versión/resolución.
registry permitido;
namespace;
autenticación;
integridad;
mirrors;
paquetes privados;
scripts de instalación.
Un paquete puede ejecutar código durante instalación. Evalúa dependencias y reduce permisos/network del build cuando sea posible.
publisher conocido;
mantenimiento activo;
frecuencia de parches;
documentación;
provenance;
tamaño y contenido;
compatibilidad;
política de tags.
“Official image” reduce incertidumbre, no elimina vulnerabilidades.
Aunque source no cambie, reconstruye para incorporar:
parches de base;
paquetes actualizados según política;
nueva metadata;
nuevas firmas;
correcciones del runtime.
Texto
Copiar scheduled rebuild
→ tests
→ scan
→ compare
→ rollout gradual
→ rollback disponibleUn rebuild puede producir un digest distinto. Trátalo como release y pruébalo.
repository;
build context;
layers;
image config;
logs;
artefactos;
caches.
rota/revoca;
identifica digests afectados;
elimina referencias;
limpia caches cuando sea posible;
investiga descargas;
reconstruye limpio;
agrega prevención.
Borrar el tag no revoca la credencial ni elimina copias descargadas.
Texto
Copiar checkout commit protegido
→ lint/test
→ build con BuildKit
→ SBOM + provenance
→ scan
→ push por digest
→ signature
→ integration/smoke tests sobre digest
→ promoción del mismo digest
→ policy verification
→ deployLos secretos de producción no deben existir en el build.
Texto
Copiar registry.example.com/api@sha256:A
commit abc1234;
workflow release.yml;
SBOM asociada a sha256:A;
provenance firmada por identidad CI;
scan sin findings bloqueantes;
firma válida;
staging y producción usan sha256:A.
Si el tag 1.8.2 luego se mueve, producción continúa identificada por digest.
identifica componente y versiones afectadas;
consulta SBOMs de todos los digests desplegados;
valida exposición y exploitability;
busca fix o mitigación;
reconstruye desde bases corregidas;
ejecuta tests y scan;
firma/publica nuevo digest;
despliega gradualmente;
verifica y retira el vulnerable;
documenta excepciones pendientes.
Sin SBOM, la investigación puede depender de reconstruir imágenes antiguas o inspeccionar hosts manualmente.
Un binario estático o bundle puede ocultar componentes. Complementa con SBOM de build y análisis especializado.
Reproducibilidad no equivale a actualización. Cambia digest y rebuild.
La firma demuestra identidad, no que el actor estuviera sano. Protege CI y revisa provenance.
Mantén estrategia de mirror/retención para artefactos críticos respetando licencias.
Cada manifest de plataforma puede contener paquetes diferentes. Escanea cada variante y el índice asociado.
No hay identidad reproducible.
Genera ruido y excepciones permanentes.
No sirve durante respuesta futura.
Rompe la frontera del builder.
La base conserva vulnerabilidades corregidas upstream.
La imagen es el resultado de una cadena, no solo del Dockerfile.
El digest es la identidad del artefacto; el tag es una referencia mutable.
SBOM inventaría componentes; escaneo compara vulnerabilidades; provenance explica el build; firma vincula una identidad.
Ningún control demuestra seguridad total por sí solo.
Builder, cache y CI forman parte del modelo de amenaza.
Rebuilds periódicos son necesarios aunque el código no cambie.
Comprueba lo aprendido
Explica las diferencias entre SBOM, scan, provenance y signature.
Diseña un pipeline que promueva el mismo digest a producción.
¿Cómo responderías a una CVE crítica usando SBOMs?
¿Por qué fijar una base por digest no resuelve patching?
¿Qué riesgos introduce compartir cache entre PRs y releases?
Node.js en Docker , donde estos controles se aterrizan en dependencias, señales, memoria, builds y desarrollo local de una aplicación real.