Seguridad de contenedores y procedencia de builds

Este documento describe cómo Fystack garantiza builds de contenedores verificables y resistentes a manipulaciones mediante procedencia conforme a SLSA, firma criptográfica sin claves y logs públicos de transparencia. Esto nos permite demostrar que cada imagen de contenedor de producción proviene de un commit de Git específico y que no ha sido manipulada.


1. Descripción general

Cada imagen de producción se construye con Docker BuildKit e incluye metadatos de procedencia SLSA nivel 3 y SBOM SPDX. Todos los artefactos se firman sin claves con Sigstore Cosign y se registran en el log de transparencia Rekor, lo que crea un registro de auditoría inmutable.

Cadena de integridad:

Cadena de integridad

Git Commit → SLSA Provenance → Cosign Signature → Rekor Transparency Log

Imágenes base distroless

Fystack usa imágenes distroless para minimizar los vectores de ataque provenientes del sistema operativo. Las imágenes distroless contienen solo la aplicación y sus dependencias de ejecución, y eliminan gestores de paquetes, shells y otras utilidades que podrían explotarse.

Arquitectura de contenedores distroless
Click to open the full-size diagram

Dockerfile distroless

Dockerfile
FROM golang:1.25 AS builder

ARG TARGETOS=linux
ARG TARGETARCH=amd64

WORKDIR /src

COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
    go mod download

COPY . .

RUN --mount=type=cache,target=/go/pkg/mod \
    --mount=type=cache,target=/root/.cache/go-build \
    CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \
    go build -o /out/mpcium ./cmd/mpcium

FROM gcr.io/distroless/base-debian12:latest

USER nonroot:nonroot
WORKDIR /app

COPY --from=builder /out/mpcium /app/mpcium

ENTRYPOINT ["/app/mpcium"]

Este enfoque:

  • Reduce la superficie de ataque al eliminar paquetes del sistema operativo innecesarios
  • Se ejecuta como usuario no root para mayor seguridad
  • Usa montajes de caché de BuildKit para builds más rápidos y eficientes
  • Produce imágenes finales mínimas (normalmente <20MB para binarios de Go)

2. Procedencia y firma de builds

Pipeline de CI/CD seguro: procedencia SLSA nivel 3 con firma sin claves y logs de transparencia
Click to open the full-size diagram

Pipeline de CI/CD seguro: procedencia SLSA nivel 3 con firma sin claves y logs de transparencia

Procedencia SLSA nivel 3

Workflow: .github/workflows/docker-push.yml Disparador: push: tags: ['v*.*.*'] Permisos: id-token: write

Cada build etiquetado produce:

  • Procedencia SLSA: incluye la URI del código fuente y el SHA del commit.
  • SBOM (SPDX 2.3): enumera las dependencias y los metadatos de los paquetes.
  • Tags inmutables: docker.io/fystack/apex/{service}:{version} y {version}-{sha}.

Verificar la procedencia

bash
docker buildx imagetools inspect docker.io/fystack/apex/api:v1.0.0 \
  --format '{{ json .Provenance.SLSA }}' | jq -r '.predicate.buildDefinition.resolvedDependencies[0].uri'
# Expected: https://github.com/fystack/apex/commit/<sha>

Firma criptográfica (Cosign sin claves)

Cada imagen y cada atestación se firman con la identidad OIDC de GitHub Actions, lo que elimina los riesgos de gestionar claves privadas. Las firmas se almacenan en Rekor, un log de transparencia público de solo anexado.

Generación de la firma (dentro de CI):

Firmar la imagen

bash
cosign sign \
  --identity-token "https://token.actions.githubusercontent.com" \
  docker.io/fystack/apex/api@sha256:<digest>

Verificación de la firma:

Verificar la firma

bash
cosign verify \
  --certificate-identity-regexp="github.com/fystack/apex/.github/workflows/docker-push.yml@*" \
  --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
  docker.io/fystack/apex/api:v1.0.0

Esto demuestra que:

  • La imagen fue construida por un workflow de GitHub de confianza.
  • La firma es válida y tiene una marca de tiempo en Rekor.
  • No existen claves de firma manuales que puedan robarse o usarse indebidamente.

3. Verificación y recuperación ante incidentes

Si sospechas de un hackeo, una manipulación de imágenes o un ataque interno, sigue esta secuencia de verificación para demostrar la autenticidad:

Paso 1: Obtener la procedencia

Obtener la procedencia

bash
cosign verify-attestation --type slsaprovenance docker.io/fystack/apex/api:v1.0.0 | jq .

Muestra la URI del commit de origen, el repositorio y la identidad del workflow.

Paso 2: Verificar la firma y el registro de transparencia

Verificar la firma y el log de Rekor

bash
cosign verify \
  --certificate-identity-regexp="github.com/fystack/apex/.github/workflows/docker-push.yml@*" \
  --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
  docker.io/fystack/apex/api:v1.0.0

rekor-cli search --artifact docker.io/fystack/apex/api:v1.0.0

Confirma que la firma de la imagen es válida y que su registro existe en el log público de Rekor con una marca de tiempo.

Paso 3: Verificar la integridad del commit de Git

Verificar el commit

bash
git show <commit-sha>

Confirma que el commit referenciado en la procedencia todavía existe y no fue reescrito.

Paso 4: Contrastar el SBOM

Verificar el SBOM

bash
docker buildx imagetools inspect docker.io/fystack/apex/api:v1.0.0 | jq '.SBOM'

Confirma que las dependencias coinciden con el repositorio de origen verificado y con los metadatos del SBOM.

Cadena de prueba final:

Cadena de prueba

Rekor Timestamp → Cosign Signature → Provenance Commit URI → Git Commit Hash

Si los cuatro elementos coinciden, queda demostrado que la imagen proviene de un commit de confianza y sin manipular.

Lista de verificación

Paso

Comando

Resultado esperado

  1. Verificar la firma
cosign verify ...

Mensaje de éxito que muestra la identidad OIDC de GitHub

  1. Revisar el log de Rekor
rekor-cli search --artifact <image>

Entrada de log con marca de tiempo

  1. Inspeccionar la procedencia
cosign verify-attestation --type slsaprovenance ...

URI del commit e ID del workflow

  1. Confirmar que el commit existe
git show <sha>

Los metadatos del commit coinciden con la procedencia

  1. Validar el SBOM
docker buildx imagetools inspect ...

Metadatos SPDX 2.3 presentes


4. Hardening y buenas prácticas

Control

Propósito

Fijar las imágenes base por digest

Evita desviaciones en la cadena de suministro y la reescritura de tags.

Tags de versión inmutables

Impide sobrescribir tags de versión existentes.

Exigir commits firmados en GitHub

Garantiza commits de código fuente autenticados.

Confianza en el contenido del registry

Aplica la inmutabilidad de tags en el registry OCI.

SBOM integrado

Garantiza la trazabilidad de las dependencias.

Aplicación de la política de inmutabilidad

Impide pushes al registry sobre tags existentes.

Auditoría con immudb

Almacena los resultados de verificación (digest de la imagen + SHA del commit) en logs a prueba de manipulaciones.


5. Resumen

Este pipeline de build le da a Fystack un linaje demostrable y verificable criptográficamente desde el commit de Git hasta el contenedor desplegado.

Garantiza:

  • Procedencia de la cadena de suministro transparente y auditable.
  • Ninguna dependencia de claves secretas.
  • Resistencia a manipulaciones internas o externas.
  • Alineación con el cumplimiento de SLSA nivel 3 y las buenas prácticas de Sigstore.

En resumen: cada contenedor de Fystack no solo es reproducible, sino también demostrablemente auténtico.