# Firma de código


## ¿Qué es la firma de código?

La firma de código es el proceso de aplicar una firma criptográfica a los artefactos
de software, como las imágenes de Docker, para verificar su integridad y autenticidad.
Al firmar una imagen, garantizas que no ha sido alterada desde que fue firmada y que
proviene de una fuente confiable.

En el contexto de las Docker Hardened Images (DHI), la firma de código se realiza utilizando
[Cosign](https://docs.sigstore.dev/), una herramienta desarrollada por el proyecto Sigstore.
Cosign permite la firma segura y verificable de imágenes de contenedor, mejorando la
confianza y la seguridad en la cadena de suministro de software.

## ¿Por qué es importante la firma de código?

La firma de código juega un papel crucial en el desarrollo de software moderno y la
ciberseguridad:

- Autenticidad: Verifica que la imagen haya sido creada por una fuente confiable.
- Integridad: Garantiza que la imagen no haya sido manipulada desde que fue firmada.
- Cumplimiento: Ayuda a satisfacer los requisitos de seguridad organizativos y regulatorios.

## Firma de código de las Docker Hardened Images

Cada DHI se firma criptográficamente utilizando Cosign, lo que garantiza que las imágenes
no hayan sido manipuladas y provengan de una fuente confiable.

## ¿Por qué firmar tus propias imágenes?

Docker firma las Docker Hardened Images para demostrar su origen e integridad, pero si estás
construyendo imágenes de aplicaciones que amplían o utilizan las DHI como base, también
deberías firmar tus propias imágenes.

Al firmar tus propias imágenes, puedes:

- Demostrar que la imagen fue construida por tu equipo o pipeline
- Asegurarte de que tu construcción no haya sido manipulada después de subirla (push)
- Dar soporte a marcos de cadena de suministro de software como SLSA
- Habilitar la verificación de imágenes en los flujos de trabajo de despliegue

Esto es especialmente importante en entornos de CI/CD donde construyes y subes imágenes
con frecuencia, o en cualquier escenario donde la procedencia de la imagen deba ser auditable.

## Cómo visualizar y utilizar las firmas de código

### Visualizar firmas

Puedes verificar que una Docker Hardened Image esté firmada y sea confiable utilizando Docker
Scout o Cosign.

Para listar todas las atestaciones, incluidos los metadatos de firma, adjuntas a la imagen,
utiliza el siguiente comando:

```console
$ docker scout attest list <image-name>:<tag>
```

> [!NOTE]
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer el prefijo `registry://` al nombre de la imagen. Por ejemplo, utiliza
> `registry://dhi.io/python` en lugar de `dhi.io/python`.

Para verificar una atestación firmada específica (por ejemplo, SBOM, VEX, procedencia):

```console
$ docker scout attest get \
  --predicate-type <predicate-uri> \
  --verify \
  <image-name>:<tag>
```

> [!NOTE]
>
> Si la imagen existe localmente en tu dispositivo, debes anteponer el prefijo `registry://` al nombre de la imagen. Por ejemplo, utiliza
> `registry://dhi.io/python:3.13` en lugar de `dhi.io/python:3.13`.

Por ejemplo:

```console
$ docker scout attest get \
  --predicate-type https://openvex.dev/ns/v0.2.0 \
  --verify \
  dhi.io/python:3.13
```

Si es válida, Docker Scout confirmará la firma y mostrará la carga útil de la firma (payload),
así como el comando de Cosign equivalente para verificar la imagen.

### Firmar imágenes

Para firmar una imagen de Docker, utiliza [Cosign](https://docs.sigstore.dev/). Reemplaza
`<image-name>:<tag>` con el nombre y la etiqueta de la imagen.

```console
$ cosign sign <image-name>:<tag>
```

Este comando te solicitará que te autentiques a través de un proveedor OIDC (como GitHub,
Google o Microsoft). Tras una autenticación exitosa, Cosign generará un certificado de corta
duración y firmará la imagen. La firma se almacenará en un registro de transparencia y se
asociará con la imagen en el registro.
