En pocas palabras
Herramienta de Sigstore para firmar y verificar contenedores, binarios y otros artefactos, comprobando integridad e identidad firmante.
Qué problema resuelve
Desplegar software de origen desconocido o alterado después de publicarse.
Cuándo utilizarlo
Publicación de versiones, integración y despliegue continuo (CI/CD) y Kubernetes. Ejemplo: firmar una imagen en CI y verificar que procede del constructor autorizado antes de desplegarla.
De la idea a la práctica
Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.
Cómo funciona
La firma se asocia al digest del artefacto, una huella de su contenido. En el flujo basado en identidad, Sigstore utiliza OIDC para acreditar al firmante y un registro de transparencia para dejar evidencia verificable. La política de verificación debe indicar la identidad y el emisor esperados.
Ejemplo: verificar antes de desplegar
Estos comandos suponen Cosign instalado, acceso al registro y las variables IMAGE, IDENTITY e ISSUER configuradas. IMAGE debe incluir el digest @sha256:…; IDENTITY identifica al publicador autorizado.
cosign sign "$IMAGE"
cosign verify "$IMAGE" \
--certificate-identity "$IDENTITY" \
--certificate-oidc-issuer "$ISSUER"
Componentes de Sigstore
| Componente | Función |
|---|---|
| Cosign | CLI para firmar y verificar imágenes, blobs y atestaciones |
| Fulcio | Autoridad que emite certificados de corta duración ligados a una identidad OIDC |
| Rekor | Registro de transparencia inmutable donde se anota cada firma |
El modo keyless evita gestionar claves privadas: la identidad del pipeline (por ejemplo, el workflow de GitHub Actions) es la que firma.
Firma en CI con GitHub Actions
permissions:
id-token: write # necesario para obtener el token OIDC
packages: write
steps:
- uses: sigstore/cosign-installer@v3
- run: |
DIGEST=$(docker buildx imagetools inspect "$IMAGE" --format '{{json .Manifest.Digest}}' | tr -d '"')
cosign sign --yes "$IMAGE@$DIGEST"
Y la verificación con identidad explícita:
cosign verify "$IMAGE@sha256:…" \
--certificate-identity "https://github.com/krediya/api-solicitudes/.github/workflows/release.yml@refs/heads/main" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
Atestaciones: SBOM y procedencia
Además de la firma, Cosign adjunta atestaciones in-toto que describen el artefacto:
cosign attest --yes --type spdxjson --predicate sbom.spdx.json "$IMAGE@$DIGEST"
cosign verify-attestation --type spdxjson \
--certificate-identity "$IDENTITY" --certificate-oidc-issuer "$ISSUER" "$IMAGE@$DIGEST"
Combinado con la procedencia SLSA que generan algunos sistemas de build, permite verificar qué contiene la imagen (SBOM) y cómo se construyó.
Claves gestionadas
Cuando el modo keyless no es viable (redes aisladas, requisitos de custodia), se puede firmar con claves en un KMS: cosign sign --key gcpkms://projects/…/cryptoKeys/firma "$IMAGE@$DIGEST". La clave nunca sale del KMS y su uso queda auditado.
Aplicar la verificación en el despliegue
| Plataforma | Mecanismo |
|---|---|
| Kubernetes | Sigstore policy-controller o Kyverno con reglas de verificación de imágenes |
| Google Cloud Run / GKE | Binary Authorization con atestaciones |
| Pipeline propio | cosign verify como paso bloqueante antes del deploy |
Una política que solo comprueba «está firmada» no basta: debe exigir la identidad y el emisor concretos.
Criterios de implementación
Verifica el mismo digest que vas a desplegar. Separa las identidades de construcción y despliegue, y combina la firma con análisis de vulnerabilidades y evidencias de construcción. Una firma válida de un publicador no autorizado debe rechazarse.
Continúa en las fuentes
Documentación oficial para verificar detalles y explorar más.