

# AMIs atestáveis
<a name="attestable-ami"></a>

Uma AMI atestável é uma imagem de máquina da Amazon (AMI) com um hash criptográfico correspondente que representa todo o seu conteúdo. O hash é gerado durante o processo de criação da AMI e é calculado com base em todo o conteúdo dessa AMI, incluindo as aplicações, o código e o processo de inicialização.

## Manter um estado atestável
<a name="maintain-attestability"></a>

As medidas de uma instância são baseadas em seu estado inicial de inicialização. Qualquer alteração de software ou código feita na instância após a inicialização que persista após as reinicializações alterará a medida da instância após as reinicializações. Se as medidas forem alteradas, elas se desviarão das medidas de referência da AMI atestável, e a instância não poderá mais atestar para o AWS KMS com sucesso após a reinicialização. Assim sendo, para que as AMIs atestáveis sejam úteis, as instâncias precisam voltar ao estado original de inicialização após a reinicialização.

Voltar sempre ao estado original de inicialização garante que uma instância possa atestar com sucesso após a reinicialização. Os seguintes utilitários podem ser usados para garantir que as instâncias permaneçam atestáveis após as reinicializações:
+ `erofs`: Enhanced Read-Only File System. Esse utilitário garante que o sistema de arquivos raiz seja somente leitura. Com esse utilitário, as gravações no sistema de arquivos, incluindo `/etc`, `/run` e `/var`, são armazenadas na memória e perdidas quando a instância é reiniciada, deixando o sistema de arquivos raiz em seu estado original de inicialização. Para obter mais informações, consulte a [documentação do erofs](https://docs.kernel.org/filesystems/erofs.html).
+ `dm-verity`: fornece proteção de integridade para o sistema de arquivos raiz somente leitura. O utilitário calcula um hash dos blocos do sistema de arquivos e o armazena na linha de comando do kernel. Isso permite que o kernel verifique a integridade do sistema de arquivos durante a inicialização. Para obter mais informações, consulte a [ documentação do dm-verity](https://docs.kernel.org/admin-guide/device-mapper/verity.html).

## Requisitos para a criação de AMIs atestáveis
<a name="ami-attestable-requirements"></a>

AMIs atestáveis têm os seguintes requisitos:
+ **Sistema operacional básico**: Amazon Linux 2023 e [NixOS](https://github.com/aws/nitrotpm-attestation-samples)
+ **Arquitetura**: arquitetura `x86_64` ou `arm64`
+ **Compatibilidade com TPM**: o NitroTPM deve estar habilitado. Para obter mais informações, consulte [Requisitos para usar o NitroTPM com instâncias do Amazon EC2](enable-nitrotpm-prerequisites.md).
+ **Modo de inicialização**: o modo de inicialização UEFI deve estar habilitado.

**Topics**
+ [Manter um estado atestável](#maintain-attestability)
+ [Requisitos para a criação de AMIs atestáveis](#ami-attestable-requirements)
+ [Criar AMIs atestáveis](#sample-ami)
+ [Criar o exemplo de descrição da imagem](build-sample-ami.md)
+ [Exemplo de descrição de imagem do Amazon Linux 2023](al2023-isolated-compute-recipe.md)
+ [Personalizar o exemplo de descrição de imagem](customize-sample-ami.md)
+ [Calcular medidas de PCR](create-pcr-compute.md)

## Criar AMIs atestáveis
<a name="sample-ami"></a>

Para criar uma AMI atestável, você precisará usar o Amazon Linux 2023 com o [KIWI Next Generation (KIWI NG](https://osinside.github.io/kiwi/)). O Amazon Linux 2023 fornece o software e os utilitários necessários para compilar uma AMI atestável usando o KIWI NG. 

O KIWI NG é uma ferramenta de código aberto para a criação de imagens baseadas no Linux pré-configuradas. O KIWI NG usa *descrições de imagem* XML que definem o conteúdo de uma imagem. A descrição da imagem especifica o sistema operacional básico, o software, a configuração do kernel e os scripts a serem executados para compilar uma AMI pronta para uso para um caso de uso específico.

Durante a compilação da AMI, você precisa usar o utilitário `nitro-tpm-pcr-compute` para gerar as medidas de referência com base na Unified Kernel Image (UKI) gerada pelo KIWI NG. Para obter mais informações sobre o uso do utilitário `nitro-tpm-pcr-compute`, consulte [Calcular medidas de PCR para uma AMI personalizada](create-pcr-compute.md).

A AWS fornece um exemplo de descrição de imagem do Amazon Linux 2023 que inclui todas as configurações necessárias para configurar uma instância do EC2 em um ambiente computacional isolado. Para obter mais informações, consulte [Criar o exemplo de descrição de imagem do Amazon Linux 2023](build-sample-ami.md).

# Criar o exemplo de descrição de imagem do Amazon Linux 2023
<a name="build-sample-ami"></a>

A AWS fornece um exemplo de descrição de imagem do Amazon Linux 2023 que você pode usar como ponto de partida para criar suas próprias AMIs atestáveis personalizadas para suas workloads. O exemplo de descrição de imagem inclui o Amazon Linux 2023 como sistema operacional básico, as configurações `dm-verity` e `erofs`, para garantir a imutabilidade do sistema de arquivos, e remove todo acesso interativo (como SSH, conexão de instância do EC2 e console serial) para criar um ambiente computacional isolado. Para obter mais informações sobre o exemplo de descrição de imagem, consulte o [repositório do Github](https://github.com/amazonlinux/kiwi-image-descriptions-examples).

O exemplo de descrição de imagem instala automaticamente as ferramentas do NitroTPM (`nitro-tpm-pcr-compute` e `nitro-tpm-attest`) na imagem gerada no diretório `/usr/bin/`. Isso garante que as ferramentas sejam pré-instaladas nas instâncias iniciadas na AMI.

O exemplo de descrição de imagem inclui um script, `edit_boot_install.sh`, que inclui os comandos necessários para gerar as medidas de referência. O script monta o arquivo da imagem de disco bruta (`.raw`) criada pelo KIWI NG em um dispositivo de loopback, localiza a UKI, que tem a extensão de arquivo `.efi`, e executa o utilitário `nitro-tpm-pcr-compute` para gerar as medidas de referência para a AMI. O script é executado automaticamente pelo KIWI NG durante a compilação.

Este tutorial mostra como compilar o exemplo de descrição de imagem para criar uma AMI atestável.

Para obter mais informações sobre como criar suas próprias descrições de imagem, consulte a seguinte documentação do KIWI NG:
+ [Início rápido](https://osinside.github.io/kiwi/quickstart.html)
+ [Descrição de imagem](https://osinside.github.io/kiwi/image_description.html)
+ [Exemplo de descrição de imagem do Amazon Linux 2023](https://github.com/amazonlinux/kiwi-image-descriptions-examples)

Pré-requisitos

A identidade do IAM precisa ter as seguintes permissões para concluir este tutorial:
+ `ebs:CompleteSnapshot`, `ebs:StartSnapshot` e `ebs:PutSnapshotBlock` no `arn:aws:ec2:*::snapshot/*`
+ `ec2:RegisterImage` Para todos os recursos

**Para compilar o exemplo de descrição de imagem do Amazon Linux 2023 usando o KIWI NG**

1. Inicie uma instância do Amazon EC2 usando a AMI AL2023 mais recente. Para garantir que a instância tenha espaço de armazenamento suficiente para compilar a AMI, provisione pelo menos 12 GB de armazenamento.

1. Instale as dependências necessárias. O seguinte comando instala estes utilitários:
   + `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 o utilitário `coldsnap`. Esse utilitário permite que você crie snapshots do Amazon EBS a partir de dados de imagem brutos. Você usará esse utilitário para criar um snapshot do EBS a partir do arquivo da imagem de disco bruta criada pelo KIWI NG.

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

1. Obtenha os arquivos de exemplos de descrição de imagem.

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

   Os arquivos de exemplos de descrição de imagem são baixados para o seguinte diretório: `/usr/share/kiwi-image-descriptions-examples/al2023/attestable-image-example`

1. Compile o exemplo de descrição de imagem usando o comando `system build` do KIWI NG. O comando a seguir cria um arquivo da imagem de disco bruta no diretório `./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 obter mais informações, consulte a [documentação do kiwi-ng system build](https://osinside.github.io/kiwi/commands/system_build.html).

1. Obtenha as medidas de referência da AMI. As medidas são geradas pelo utilitário `nitro-tpm-pcr-compute` durante a criação da imagem na etapa anterior. É possível localizar as medidas de referência no seguinte arquivo: `./image/pcr_measurements.json`.

   As medidas são fornecidas no seguinte formato JSON:

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

1. Use o utilitário `coldsnap` para carregar a imagem de disco bruta criada pelo KIWI NG em um snapshot do EBS. O comando retorna o ID do snapshot. Anote o valor do ID, pois vai precisar dele na próxima etapa.

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

   Para obter mais informações sobre o utilitário `coldsnap`, consulte o [repositório do coldsnap no GitHub](https://github.com/awslabs/coldsnap).

1. Registre uma AMI habilitada para o TPM 2.0 com o modo de inicialização UEFI usando o snapshot da etapa anterior. Para `--architecture`, especifique `x86_64` para Intel ou `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
   ```

# Exemplo de descrição de imagem do Amazon Linux 2023
<a name="al2023-isolated-compute-recipe"></a>

O exemplo de descrição de imagem do Amazon Linux 2023 tem as seguintes características: 

1. **Inicialização da Unified Kernel Image (UKI)**: inicialize usando um único binário assinado que combine o kernel `initrd` e os parâmetros de inicialização em uma única imagem imutável.

1. **Sistema de arquivos-raiz somente leitura**: use o Enhanced Read-Only File System (`erofs`) com proteção dm-verity para garantir que o sistema de arquivos-raiz não possa ser modificado e mantenha a verificação da integridade criptográfica.

1. **Sistema de arquivos de sobreposição efêmera**: crie um sistema de arquivos de sobreposição temporário que permita gravações temporárias em diretórios como `/etc`, `/run` e `/var`. Como esse sistema de arquivos de sobreposição existe somente na memória, todas as alterações são perdidas automaticamente quando a instância é reinicializada, garantindo que o sistema retorne ao estado confiável original.

1. **Métodos de acesso remoto desabilitados**: remova os seguintes mecanismos de acesso remoto para evitar acesso remoto:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/al2023-isolated-compute-recipe.html)

   \$1 Para obter mais informações, consulte [Elementos da descrição de imagem](https://osinside.github.io/kiwi/image_description/elements.html#packages-ignore).

# Personalize o exemplo de descrição de imagem do Amazon Linux 2023 para a workload
<a name="customize-sample-ami"></a>

É possível personalizar o exemplo de descrição de imagem do Amazon Linux 2023 e incluir os pacotes de software, os scripts e os arquivos necessários para a workload específica. As personalizações são realizadas adicionando ou modificando vários elementos da descrição de imagem do KIWI NG.

**Topics**
+ [Gerenciamento de repositórios](#prepare-custom-image-repos)
+ [Gerenciamento de pacotes](#customize-sample-ami-packages)
+ [Adicionar arquivos e diretórios](#customize-sample-ami-overlay)
+ [Adicionar scripts personalizados](#customize-sample-ami-script)

## Gerenciamento de repositórios
<a name="prepare-custom-image-repos"></a>

Por padrão, o exemplo de descrição de imagem inclui um único elemento `<repository>` que aponta para um endpoint-espelho para os principais repositórios do Amazon Linux 2023. Se necessário, você pode adicionar referências a outros repositórios a partir dos quais o software necessário será instalado.

O exemplo de descrição de imagem usa o gerenciador de pacotes `dnf`, conforme definido no elemento `<packagemanager>`.

Para obter mais informações sobre a adição de repositórios, consulte [Setting up Repositories](https://osinside.github.io/kiwi/concept_and_workflow/repository_setup.html).

## Gerenciamento de pacotes
<a name="customize-sample-ami-packages"></a>

Por padrão, o exemplo de descrição de imagem inclui todos os pacotes necessários para criar uma AMI atestável do Amazon Linux 2023 para um ambiente computacional isolado com um sistema de arquivos somente leitura `erofs`.

É possível incluir pacotes de software adicionais na descrição da imagem adicionando-os ao elemento `<packages>` da descrição da imagem. O elemento `<packages>` define todo o software que deve estar instalado na AMI.

Você também pode usar o elemento `<packages>` para desinstalar ou excluir pacotes de software específicos.

Para obter mais informações sobre como adicionar ou remover pacotes da descrição de imagem, consulte [Adding and Removing Packages](https://osinside.github.io/kiwi/concept_and_workflow/packages.html#).

## Adicionar arquivos e diretórios
<a name="customize-sample-ami-overlay"></a>

O exemplo de descrição de imagem inclui um diretório de árvore de sobreposição (`/root/`). O diretório da árvore de sobreposição é um diretório que contém arquivos e diretórios que serão copiados na imagem durante o processo de criação da imagem. Todos os arquivos e diretórios que você colocar no diretório da árvore de sobreposição serão copiados diretamente no sistema de arquivos raiz da imagem durante o processo de criação da imagem.

O diretório da árvore de sobreposição é copiado na imagem após todos os pacotes serem instalados. Os arquivos novos são adicionados e os arquivos existentes são sobrescritos.

## Adicionar scripts personalizados
<a name="customize-sample-ami-script"></a>

O exemplo de descrição de imagem inclui um único script personalizado, `edit_boot_install.sh`. Esse script inclui os comandos necessários para executar o utilitário `nitro-tpm-pcr-compute`, que gera as medidas de referência com base no conteúdo da imagem. Esse script é chamado imediatamente após a instalação do bootloader.

Se necessário, você pode incluir seus próprios scripts personalizados na descrição da imagem para realizar tarefas ou configurações durante o processo de criação da imagem ou na sua primeira inicialização. O uso de scripts permite que você personalize as imagens de maneiras que não são possíveis usando apenas a descrição da imagem.

Para incluir scripts personalizados na descrição da imagem, você precisa nomeá-los corretamente segundo o tipo de script e adicioná-los ao mesmo diretório em que está o arquivo `appliance.kiwi`. O KIWI NG detectará e executará os scripts automaticamente se eles forem nomeados corretamente e colocados no local correto, sem ser necessário referenciá-los explicitamente no arquivo da descrição da imagem.

Para obter mais informações sobre os scripts compatíveis com o KIWI NG, consulte [User-Defined Scripts](https://osinside.github.io/kiwi/concept_and_workflow/shell_scripts.html).

# Calcular medidas de PCR para uma AMI personalizada
<a name="create-pcr-compute"></a>

O utilitário `nitro-tpm-pcr-compute` permite gerar as medidas de referência para uma AMI atestável durante a compilação com base na Unified Kernel Image (UKI).

O exemplo de descrição de imagem do Amazon Linux 2023 instala automaticamente o utilitário na imagem compilada no diretório `/usr/bin/`. O exemplo de descrição de imagem também inclui um script com os comandos necessários para executar o utilitário e gerar as medidas de referência durante a criação da imagem. Se você estiver usando o exemplo de descrição de imagem, não precisará instalar ou executar o utilitário manualmente. Para obter mais informações, consulte [Criar o exemplo de descrição de imagem do Amazon Linux 2023](build-sample-ami.md).

## Instalar o utilitário `nitro-tpm-pcr-compute`
<a name="nitro-tpm-compute-install"></a>

Se você estiver usando o Amazon Linux 2023, poderá instalar o utilitário `nitro-tpm-pcr-compute` a partir do repositório Amazon Linux como se segue.

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

As ferramentas são instaladas no diretório `/usr/bin`.

## Usar o utilitário `nitro-tpm-pcr-compute`
<a name="nitro-tpm-compute-use"></a>

O utilitário fornece um único comando, `nitro-tpm-pcr-compute`, para gerar as medidas de referência.

Ao executar o comando, você deve especificar o seguinte:
+ Unified Kernel Image (`UKI.efi`): necessária para inicialização padrão e UEFI.

**Para gerar as medidas de referência para uma AMI atestável:**  
Use o seguinte comando e os seguintes parâmetros:

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

O utilitário retorna as medidas de referência no seguinte formato JSON:

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

Para obter um exemplo prático de como usar o utilitário `nitro-tpm-pcr-compute`, consulte o script `edit_boot_install.sh` incluído no [exemplo de descrição de imagem do Amazon Linux 2023](build-sample-ami.md).