

# AMI verificables
<a name="attestable-ami"></a>

Una AMI verificable es una imagen de máquina de Amazon (AMI) con un hash criptográfico correspondiente que representa todo su contenido. El hash se genera durante el proceso de creación de la AMI y se calcula en función de todo el contenido de dicha AMI, incluidas las aplicaciones, el código y el proceso de arranque.

## Cómo mantener un estado certificable
<a name="maintain-attestability"></a>

Las mediciones de una instancia se basan en su estado de arranque inicial. Cualquier cambio en el software o el código realizado en la instancia después del lanzamiento y que persista tras los reinicios modificará la medición de la instancia después de los reinicios. Si las mediciones se alteran, dejarán de coincidir con las mediciones de referencia de la AMI verificable, y la instancia ya no podrá superar correctamente la atestación ante AWS KMS después de reiniciarse. Por tanto, para que las AMI verificables resulten útiles, las instancias deben restaurar su estado de arranque original cada vez que se reinicien.

Mantener el estado de arranque original garantiza que la instancia pueda superar la atestación correctamente después de reiniciarse. Las siguientes utilidades pueden ayudar a garantizar que las instancias conserven su capacidad de atestación después de los reinicios:
+ `erofs`: sistema de archivos de solo lectura mejorado Esta utilidad mantiene el sistema de archivos raíz en modo de solo lectura. Con ella, las operaciones de escritura en el sistema de archivos, incluidas `/etc`, `/run` y `/var`, se almacenan en memoria y se descartan al reiniciar la instancia, de modo que el sistema de archivos raíz se conserva en su estado original de arranque. Para obtener más información, consulte la [documentación de EROFS](https://docs.kernel.org/filesystems/erofs.html).
+ `dm-verity`: protección de integridad para el sistema de archivos raíz de solo lectura. Esta utilidad calcula un hash de los bloques del sistema de archivos y lo almacena en la línea de comandos del kernel. Esto permite que el kernel verifique la integridad del sistema de archivos durante el arranque. Para obtener más información, consulte la [documentación de dm-verity](https://docs.kernel.org/admin-guide/device-mapper/verity.html).

## Requisitos para crear AMI con capacidad de atestación
<a name="ami-attestable-requirements"></a>

Las AMI con capacidad de atestación tienen los siguientes requisitos:
+ **Sistema operativo base**: Amazon Linux 2023 y [NixOS](https://github.com/aws/nitrotpm-attestation-samples)
+ **Arquitectura**: arquitectura `x86_64` o `arm64`
+ **Compatibilidad con TPM**: NitroTPM debe estar habilitado. Para obtener más información, consulte [Requisitos para utilizar NitroTPM con instancias de Amazon EC2](enable-nitrotpm-prerequisites.md).
+ **Modo de arranque**: el modo de arranque UEFI debe estar habilitado.

**Topics**
+ [Cómo mantener un estado certificable](#maintain-attestability)
+ [Requisitos para crear AMI con capacidad de atestación](#ami-attestable-requirements)
+ [Creación de AMI con capacidad de atestación](#sample-ami)
+ [Compilación de la descripción de imagen de muestra](build-sample-ami.md)
+ [Descripción de la imagen de muestra de Amazon Linux 2023](al2023-isolated-compute-recipe.md)
+ [Personalización de la descripción de la imagen de muestra](customize-sample-ami.md)
+ [Cálculo de mediciones PCR](create-pcr-compute.md)

## Creación de AMI con capacidad de atestación
<a name="sample-ami"></a>

Para crear una AMI con capacidad de atestación, debe usar Amazon Linux 2023 con [KIWI Next Generation (KIWI-NG)](https://osinside.github.io/kiwi/). Amazon Linux 2023 proporciona todo el software y las utilidades necesarias para crear una AMI con capacidad de atestación mediante KIWI-NG. 

KIWI NG es una herramienta de código abierto que permite compilar imágenes de Linux preconfiguradas. KIWI NG utiliza *descripciones de imagen* XML que definen el contenido de una imagen. La descripción de imagen especifica el sistema operativo base, el software, la configuración del kernel y los scripts que se deben ejecutar para generar una AMI lista para usar, adaptada a un caso de uso específico.

Durante el proceso de compilación de la AMI, debe usar la utilidad `nitro-tpm-pcr-compute` para generar las mediciones de referencia basadas en la imagen de núcleo unificado (UKI) generada por KIWI NG. Para obtener más información sobre cómo usar la utilidad `nitro-tpm-pcr-compute`, consulte [Cálculo de mediciones PCR para una AMI personalizada](create-pcr-compute.md).

AWS proporciona una descripción de la imagen de muestra de Amazon Linux 2023 que incluye todas las configuraciones necesarias para configurar una instancia de EC2 en un entorno de computación aislado. Para obtener más información, consulte [Compilación de la descripción de imagen de Amazon Linux 2023 de muestra](build-sample-ami.md).

# Compilación de la descripción de imagen de Amazon Linux 2023 de muestra
<a name="build-sample-ami"></a>

AWS proporciona una descripción de imagen de Amazon Linux 2023 de muestra que puede usar como punto de partida para crear sus propias AMI personalizadas con capacidad de atestación para las cargas de trabajo. La descripción de imagen de muestra incluye Amazon Linux 2023 como sistema operativo base, además de las configuraciones `dm-verity` y `erofs` para la inmutabilidad del sistema de archivos. También elimina todo acceso interactivo (como SSH, EC2 Instance Connect y consola serie) para crear un entorno de computación aislado. Para obtener más información sobre la descripción de imagen de muestra, consulte el [repositorio de GitHub](https://github.com/amazonlinux/kiwi-image-descriptions-examples).

La descripción de imagen de muestra instala automáticamente las herramientas NitroTPM (`nitro-tpm-pcr-compute` y `nitro-tpm-attest`) en la imagen compilada, dentro del directorio `/usr/bin/`. Esto garantiza que las herramientas estén preinstaladas en las instancias que se lanzan a partir de la AMI.

La descripción de imagen de muestra incluye un script (`edit_boot_install.sh`) con los comandos necesarios para generar las mediciones de referencia. El script monta el archivo de imagen de disco sin procesar (`.raw`) creado por KIWI NG en un dispositivo de bucle invertido, localiza la imagen de núcleo unificado (UKI), que tiene la extensión de archivo `.efi`, y luego ejecuta la utilidad `nitro-tpm-pcr-compute` para generar las mediciones de referencia de la AMI. El script se ejecuta automáticamente mediante KIWI NG durante el proceso de compilación.

Este tutorial muestra cómo compilar la descripción de imagen de muestra para crear una AMI con capacidad de atestación.

Para obtener más información sobre cómo crear sus propias descripciones de imagen, consulte la siguiente documentación de KIWI NG:
+ [Quick Start (Inicio rápido](https://osinside.github.io/kiwi/quickstart.html)
+ [Descripción de imagen](https://osinside.github.io/kiwi/image_description.html)
+ [Descripción de la imagen de muestra de Amazon Linux 2023](https://github.com/amazonlinux/kiwi-image-descriptions-examples)

Requisitos previos

Para completar este tutorial, su identidad de IAM necesita tener lo siguiente:
+ `ebs:CompleteSnapshot`, `ebs:StartSnapshot` y `ebs:PutSnapshotBlock` en `arn:aws:ec2:*::snapshot/*`
+ `ec2:RegisterImage` en todos los recursos

**Para compilar la descripción de la imagen de muestra de Amazon Linux 2023 con KIWI NG**

1. Lance una instancia de Amazon EC2 con la versión más reciente de la AMI AL2023. Para garantizar que la instancia tenga suficiente espacio de almacenamiento para compilar la AMI, asegúrese de aprovisionar al menos 12 GB de almacenamiento.

1. Instale las dependencias requeridas. El siguiente comando instala las utilidades necesarias:
   + `kiwi-cli`
   + `veritysetup`
   + `erofs-utils`
   + `aws-nitro-tpm-tools`

   ```
   sudo dnf install -y kiwi-cli python3-kiwi kiwi-systemdeps-core python3-poetry-core qemu-img veritysetup erofs-utils git cargo aws-nitro-tpm-tools
   ```

1. Instale la utilidad `coldsnap`. Esta utilidad permite crear instantáneas de Amazon EBS a partir de datos de imágenes sin procesar. Usará esta utilidad para crear una instantánea de EBS a partir del archivo de imagen de disco sin procesar creado por KIWI NG.

   ```
   git clone https://github.com/awslabs/coldsnap.git
   cd coldsnap
   cargo install --locked coldsnap
   cd ..
   ```

1. Obtenga los archivos de descripción de imagen de muestra.

   ```
   sudo dnf install kiwi-image-descriptions-examples
   ```

   Los archivos de descripción de imagen de muestra se descargan en el siguiente directorio: `/usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example`

1. Compile la descripción de imagen de muestra mediante el comando `system build` de KIWI NG. El siguiente comando crea un archivo de imagen de disco sin procesar en el directorio `./image`.

   ```
   sudo kiwi-ng \
   --color-output \
   --loglevel 0 \
   system build \
   --description /usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example \
   --target-dir ./image
   ```

   Para obtener más información, consulte la [documentación de compilación del sistema de kiwi-ng](https://osinside.github.io/kiwi/commands/system_build.html).

1. Obtenga las mediciones de referencia para la AMI. Las mediciones se generan mediante la utilidad `nitro-tpm-pcr-compute` durante el tiempo de compilación de la imagen, en el paso anterior. Puede ubicar las mediciones de referencia en el siguiente archivo: `./image/pcr_measurements.json`.

   Las mediciones se proporcionan en el siguiente formato JSON:

   ```
   {
     "Measurements": {
       "HashAlgorithm": "SHA384 { ... }",
       "PCR4": "PCR4_measurement",
       "PCR7": "PCR7_measurement",
       "PCR12": "PCR12_measurement"
     }
   }
   ```

1. Use la utilidad `coldsnap` para cargar la imagen de disco sin procesar creada por KIWI NG en una instantánea de EBS. El comando devuelve el ID de la instantánea. Anote ese ID, ya que será necesario para el siguiente paso.

   ```
   SNAPSHOT=$(.cargo/bin/coldsnap upload ./image/al2023*.raw)
   echo "Created snapshot: $SNAPSHOT"
   ```

   Para obtener más información sobre la utilidad `coldsnap`, consulte el [repositorio de GitHub de coldsnap](https://github.com/awslabs/coldsnap).

1. Registre una AMI con TPM 2.0 habilitado y modo de arranque UEFI con la instantánea del paso anterior. En `--architecture`, especifique `x86_64` para Intel o `arm64` para Graviton.

   ```
   aws ec2 register-image \
   --name "attestable_isolated_al2023_ami" \
   --virtualization-type hvm \
   --boot-mode uefi \
   --architecture x86_64|arm64 \
   --root-device-name /dev/xvda \
   --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=${SNAPSHOT}} \
   --tpm-support v2.0 \
   --ena-support
   ```

# Descripción de la imagen de muestra de Amazon Linux 2023
<a name="al2023-isolated-compute-recipe"></a>

La descripción de la imagen de muestra de Amazon Linux 2023 incluye las siguientes características: 

1. **Arranque mediante imagen de núcleo unificado**: inicia con un único binario firmado que combina el kernel, `initrd` y los parámetros de arranque en una sola imagen inmutable.

1. **Sistema de archivos raíz de solo lectura**: usa el sistema de archivos de solo lectura mejorado (`erofs`) con protección dm-verity para garantizar que el sistema de archivos raíz no se modifique y conserve la verificación criptográfica de integridad.

1. **Sistema de archivos superpuesto efímero**: cree un sistema de archivos superpuesto temporal que permite escrituras temporales en directorios como `/etc`, `/run` y `/var`. Dado que este sistema de archivos superpuesto existe únicamente en la memoria, todos los cambios se pierden cuando la instancia se reinicia. Esto garantiza que el sistema recupere su estado original y confiable.

1. **Métodos de acceso remoto desactivados**: elimine los siguientes mecanismos de acceso remoto para impedir el acceso remoto:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/al2023-isolated-compute-recipe.html)

   \$1 Para obtener más información, consulte [Image Description Elements](https://osinside.github.io/kiwi/image_description/elements.html#packages-ignore).

# Personalización de la descripción de la imagen de muestra de Amazon Linux 2023 según las necesidades de la carga de trabajo
<a name="customize-sample-ami"></a>

Puede personalizar la descripción de la imagen de muestra de Amazon Linux 2023 e incluir los paquetes de software, scripts y archivos necesarios para la carga de trabajo específica. La personalización se realiza mediante la adición o modificación de distintos elementos en la descripción de imagen de KIWI NG.

**Topics**
+ [Administración de repositorios](#prepare-custom-image-repos)
+ [Administración de paquetes](#customize-sample-ami-packages)
+ [Adición de archivos y directorios](#customize-sample-ami-overlay)
+ [Adición de scripts personalizados](#customize-sample-ami-script)

## Administración de repositorios
<a name="prepare-custom-image-repos"></a>

De forma predeterminada, la descripción de imagen de muestra incluye un único elemento `<repository>` que apunta a un punto de conexión espejo para los repositorios principales de Amazon Linux 2023. Si es necesario, puede agregar referencias a otros repositorios desde los cuales instalar el software requerido.

La descripción de imagen de muestra usa el administrador de paquetes `dnf`, tal como se define en el elemento `<packagemanager>`.

Para obtener más información sobre cómo agregar repositorios, consulte [Setting up Repositories](https://osinside.github.io/kiwi/concept_and_workflow/repository_setup.html).

## Administración de paquetes
<a name="customize-sample-ami-packages"></a>

De forma predeterminada, la descripción de imagen de muestra incluye todos los paquetes necesarios para crear una AMI de Amazon Linux 2023 con capacidad de atestación destinada a un entorno de computación aislado con un sistema de archivos de solo lectura `erofs`.

Puede incluir paquetes de software adicionales en la descripción de imagen mediante la adición de dichos paquetes al elemento `<packages>` de la descripción de imagen. El elemento `<packages>` define todo el software que se debe instalar en la AMI.

También puede usar el elemento `<packages>` para desinstalar o eliminar paquetes de software específicos.

Para obtener más información sobre cómo agregar o eliminar paquetes en la descripción de imagen, consulte [Adding and Removing Packages](https://osinside.github.io/kiwi/concept_and_workflow/packages.html#).

## Adición de archivos y directorios
<a name="customize-sample-ami-overlay"></a>

La descripción de imagen de muestra incluye un directorio de estructura superpuesta (`/root/`). El directorio de estructura superpuesta es un directorio que contiene archivos y directorios que se copian en la imagen durante el proceso de compilación de la imagen. Cualquier archivo o directorio que se coloque en el directorio de estructura superpuesta se copia directamente en el sistema de archivos raíz de la imagen durante el proceso de compilación.

El directorio de estructura superpuesta se copia en la imagen después de la instalación de todos los paquetes. Los archivos nuevos se agregan y los existentes se sobrescriben.

## Adición de scripts personalizados
<a name="customize-sample-ami-script"></a>

La descripción de imagen de muestra incluye un único script personalizado (`edit_boot_install.sh`). Este script contiene los comandos necesarios para ejecutar la utilidad `nitro-tpm-pcr-compute`, la cual genera las mediciones de referencia con base en el contenido de la imagen. Este script se ejecuta inmediatamente después de la instalación del cargador de arranque.

Si es necesario, puede incluir sus propios scripts personalizados en la descripción de imagen para realizar tareas o configuraciones durante el proceso de compilación de la imagen o en su primer arranque. El uso de scripts permite personalizar las imágenes de maneras que no es posible mediante la descripción de imagen por sí sola.

Para incluir scripts personalizados en la descripción de imagen, asígneles el nombre adecuado según el tipo de script y agréguelo al mismo directorio que el archivo `appliance.kiwi`. KIWI NG detecta y ejecuta automáticamente los scripts cuando se nombran correctamente y se ubican en la ruta adecuada, sin necesidad de hacer referencia explícita a ellos en el archivo de descripción de la imagen.

Para obtener más información sobre los scripts compatibles con KIWI NG, consulte [Scripts definidos por el usuario](https://osinside.github.io/kiwi/concept_and_workflow/shell_scripts.html).

# Cálculo de mediciones PCR para una AMI personalizada
<a name="create-pcr-compute"></a>

La utilidad `nitro-tpm-pcr-compute` permite generar las mediciones de referencia para una AMI con capacidad de atestación durante el proceso de compilación, con base en su imagen de núcleo unificado (UKI).

La descripción de la imagen de muestra de Amazon Linux 2023 instala automáticamente la utilidad en la imagen compilada, dentro del directorio `/usr/bin/`. La descripción de imagen de muestra también incluye un script con los comandos necesarios para ejecutar la utilidad y generar las mediciones de referencia durante la compilación de la imagen. Si utiliza la descripción de imagen de muestra, no es necesario instalar la utilidad ni ejecutarla manualmente. Para obtener más información, consulte [Compilación de la descripción de imagen de Amazon Linux 2023 de muestra](build-sample-ami.md).

## Instalación de la utilidad `nitro-tpm-pcr-compute`
<a name="nitro-tpm-compute-install"></a>

Si utiliza Amazon Linux 2023, puede instalar la utilidad `nitro-tpm-pcr-compute` desde el repositorio de Amazon Linux de la siguiente manera:

```
sudo yum install aws-nitro-tpm-tools
```

Las herramientas se instalan en el directorio `/usr/bin`.

## Uso de la utilidad `nitro-tpm-pcr-compute`
<a name="nitro-tpm-compute-use"></a>

La utilidad proporciona un único comando (`nitro-tpm-pcr-compute`) para generar las mediciones de referencia.

Al ejecutar el comando, debe especificar lo siguiente:
+ Imagen de núcleo unificado (`UKI.efi`): requerida para el arranque estándar y UEFI.

**Para generar las mediciones de referencia de una AMI con capacidad de atestación:**  
Use el siguiente comando y parámetros:

```
/usr/bin/nitro-tpm-pcr-compute \
--image UKI.efi
```

La utilidad devuelve las mediciones de referencia en el siguiente formato JSON.

```
{
  "Measurements": {
    "HashAlgorithm": "SHA384 { ... }",
    "PCR4": "PCR4_measurement",
    "PCR7": "PCR7_measurement",
    "PCR12": "PCR12_measurement"
  }
}
```

Para un ejemplo práctico sobre cómo usar la utilidad `nitro-tpm-pcr-compute`, consulte el script `edit_boot_install.sh` incluido en la [ descripción de la imagen de muestra de Amazon Linux 2023](build-sample-ami.md).