

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cree una canalización para imágenes de contenedores reforzadas con EC2 Image Builder y Terraform
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform"></a>

*Mike Saintcross y Andrew Ranes, Amazon Web Services*

## Resumen
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-summary"></a>

Este patrón crea una [canalización de EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html) que produce una imagen de contenedor base de [Amazon Linux 2](https://aws.amazon.com/amazon-linux-2/) reforzada. Terraform es una herramienta de infraestructura como código (IaC) para configurar y aprovisionar la infraestructura que se usa para crear imágenes de contenedores reforzadas. Esta receta le ayuda a implementar una imagen de contenedor de Amazon Linux 2 basada en Docker y reforzada según Red Hat Enterprise Linux (RHEL) 7 STIG versión 3 lanzamiento 7 ‒ Medium. (Consulte la [STIG-Build-Linux-Medium versión 2022.2.1](https://docs.aws.amazon.com/imagebuilder/latest/userguide/toe-stig.html#linux-os-stig) en la sección de *componentes de Linux STIG* de la documentación de EC2 Image Builder). Esta imagen se conoce como imagen *dorada* de contenedor.

La versión incluye dos [ EventBridge reglas de Amazon](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html). Una regla inicia el proceso de imágenes de contenedor cuando el [resultado de Amazon Inspector](https://docs.aws.amazon.com/inspector/latest/user/findings-managing.html) es **Alto** o **Crítico**, con el fin de sustituir las imágenes no seguras. Esta regla requiere que se habilite el [escaneo mejorado](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning-enhanced.html) de Amazon Inspector y Amazon Elastic Container Registry (Amazon ECR). La otra regla envía las notificaciones a una [cola](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-types.html) de Amazon Simple Queue Service (Amazon SQS) tras una inserción correcta de las imágenes en el repositorio de Amazon ECR, con el fin de que use siempre las últimas imágenes del contenedor.

**nota**  
Se acerca el fin de la compatibilidad de Amazon Linux 2. Para obtener más información, consulte [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/).

## Requisitos previos y limitaciones
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-prereqs"></a>

**Requisitos previos **
+ Una [cuenta de AWS](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) en la que pueda implementar la infraestructura.
+ [Interfaz de la línea de comandos de AWS (AWS CLI) instalada](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) para configurar sus credenciales de AWS para la implementación local.
+ Terraform [descargado](https://developer.hashicorp.com/terraform/downloads) y configurado según las [instrucciones](https://developer.hashicorp.com/terraform/tutorials/aws-get-started) de la documentación de Terraform.
+ [Git](https://git-scm.com/) (si aprovisiona desde una máquina local).
+ Un [rol](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) en la cuenta de AWS que pueda usar para crear recursos de AWS.
+ Todas las variables definidas en el archivo [.tfvars.](https://developer.hashicorp.com/terraform/tutorials/configuration-language/variables)  También puede definir todas las variables al aplicar la configuración de Terraform.

**Limitaciones**
+ Esta solución crea una infraestructura de Amazon Virtual Private Cloud (Amazon VPC) que incluye una [puerta de enlace NAT](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) y una [puerta de enlace de Internet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html) para la conectividad a Internet desde su subred privada. No puede usar [puntos de enlace de VPC](https://docs.aws.amazon.com/whitepapers/latest/aws-privatelink/what-are-vpc-endpoints.html), ya que el [proceso de arranque de AWS Task Orchestrator and Executor () AWSTOE](https://aws.amazon.com/premiumsupport/knowledge-center/image-builder-pipeline-execution-error/) instala la versión 2 de la CLI de AWS desde Internet.

**Versiones de producto**
+ Amazon Linux 2
+ Versión 1.1 o posterior de la CLI de AWS

## Arquitectura
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-architecture"></a>

**Pila de tecnología de destino**

Este patrón crea 43 recursos, incluidos:
+ Dos [buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html) de Amazon Simple Storage Service (Amazon S3): uno para los archivos de los componentes del proceso y otro para el acceso al servidor y los registros de flujo de Amazon VPC
+ Un [repositorio de Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)
+ Una nube privada virtual (VPC) que contiene una subred pública, una subred privada, tablas de enrutamiento, una puerta de enlace NAT y una puerta de enlace de Internet
+ Una canalización, una receta y componentes de EC2 Image Builder
+ Una imagen de contenedor
+ Una [clave](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) de AWS Key Management Service (AWS KMS) para el cifrado de imágenes
+ Una cola de SQS
+ Tres funciones: una para ejecutar la canalización de EC2 Image Builder, una para el perfil de instancia para EC2 Image Builder y otra para EventBridge las reglas
+ Dos EventBridge reglas

**Estructura del módulo Terraform**

Para ver el código fuente, consulte el GitHub repositorio [Terraform EC2 Image Builder Container Hardening](https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline) Pipeline.

```
├── components.tf
├── config.tf
├── dist-config.tf
├── files
│   └──assumption-policy.json
├── hardening-pipeline.tfvars
├── image.tf
├── infr-config.tf
├── infra-network-config.tf
├── kms-key.tf
├── main.tf
├── outputs.tf
├── pipeline.tf
├── recipes.tf
├── roles.tf
├── sec-groups.tf
├── trigger-build.tf
└── variables.tf
```

**Detalles del módulo**
+ `components.tf` contiene un recurso de carga de Amazon S3 para cargar el contenido del directorio `/files`. También puede añadir aquí archivos YAML de componentes personalizados de forma modular.
+ `/files` contiene los archivos `.yml` que definen los componentes usados en `components.tf`.
+ `image.tf` contiene las definiciones del sistema operativo de la imagen base. Aquí es donde puede modificar las definiciones para crear un proceso de imagen base diferente.
+ `infr-config.tf` y `dist-config.tf` contienen los recursos de la infraestructura de AWS mínima necesaria para crear y distribuir la imagen.
+ `infra-network-config.tf` contiene la infraestructura de VPC mínima en la que implementar la imagen del contenedor.
+ `hardening-pipeline.tfvars` contiene las variables de Terraform que se usarán en el momento de la aplicación.
+ `pipeline.tf`crea y administra una canalización EC2 de Image Builder en Terraform.
+ `recipes.tf` es donde puede especificar diferentes combinaciones de componentes para crear recetas de contenedores.
+ `roles.tf`contiene las definiciones de la política de AWS Identity and Access Management (IAM) para el perfil de instancia y la función de implementación de canalización de Amazon Elastic Compute Cloud (Amazon EC2).
+ `trigger-build.tf`contiene las EventBridge reglas y los recursos de colas de SQS.

**Arquitectura de destino**

![Arquitectura y flujo de trabajo para crear un proceso de imágenes de contenedores reforzadas](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/4b16bdfa-4f34-41e9-a69a-d023253c8585/images/23443eca-132f-46ac-98bd-32a9e9359a77.png)


El diagrama ilustra el flujo de trabajo siguiente:

1. EC2 Image Builder crea una imagen de contenedor mediante la receta definida, que instala las actualizaciones del sistema operativo y aplica el STIG de RHEL Medium a la imagen base de Amazon Linux 2.

1. La imagen reforzada se publica en un registro privado de Amazon ECR y una EventBridge regla envía un mensaje a una cola de SQS cuando la imagen se ha publicado correctamente.

1. Si Amazon Inspector está configurado para un escaneo mejorado, escanea el registro de Amazon ECR.

1. Si Amazon Inspector genera un resultado de gravedad **crítica** o **alta** para la imagen, una EventBridge regla activa la canalización de EC2 Image Builder para que se ejecute de nuevo y publique una imagen recién reforzada.

**Automatizar y escalar**
+ Este patrón describe cómo aprovisionar la infraestructura y construir el proceso en su equipo. Sin embargo, está pensado para ser utilizado a escala. En lugar de implementar los módulos de Terraform de forma local, puede usarlos en un entorno multicuenta, como un entorno de [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html) con [Account Factory para Terraform](https://aws.amazon.com/blogs/aws/new-aws-control-tower-account-factory-for-terraform/). En ese caso, deberá usar un [bucket de S3 con estado de backend](https://developer.hashicorp.com/terraform/language/settings/backends/s3) para administrar los archivos de estado de Terraform en lugar de gestionar el estado de configuración de forma local.
+ Para un uso a gran escala, implemente la solución en una cuenta central, como una cuenta de Shared Services o Common Services, desde un modelo de cuenta de Control Tower o zona de aterrizaje, y conceda permiso a las cuentas de los consumidores para acceder al repositorio de Amazon ECR y a la clave de AWS KMS. Para obtener más información sobre la configuración, consulte el artículo de Re:post [¿Cómo puedo permitir que una cuenta secundaria inserte o extraiga imágenes de mi repositorio de imágenes de Amazon ECR?](https://repost.aws/knowledge-center/secondary-account-access-ecr) Por ejemplo, en una [máquina expendedora de cuentas](https://www.hashicorp.com/resources/terraform-landing-zones-for-self-service-multi-aws-at-eventbrite) o en Account Factory para Terraform, añada permisos a cada línea base de cuenta o línea base de personalización de cuenta para proporcionar acceso a ese repositorio de Amazon ECR y a la clave de cifrado.
+ Una vez desplegada la canalización de imágenes del contenedor, puede modificarla mediante las funciones de EC2 Image Builder, como [los componentes](https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-components.html), que le ayudan a empaquetar más componentes en la compilación de Docker.
+ La clave de AWS KMS que se usa para cifrar la imagen del contenedor debe compartirse entre las cuentas en las que se va a usar la imagen.
+ Puede añadir compatibilidad con otras imágenes duplicando todo el módulo Terraform y modificando los siguientes atributos `recipes.tf`:
  + Modifique `parent_image = "amazonlinux:latest"` a otro tipo de imagen.
  + Modifique `repository_name` para que apunte a un repositorio de Amazon ECR existente. Esto crea otro proceso que implementa un tipo de imagen principal diferente en su repositorio de Amazon ECR existente.

## Tools (Herramientas)
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-tools"></a>

**Herramientas**
+ Terraform (aprovisionamiento de iAC)
+ Git (si se aprovisiona localmente)
+ CLI de AWS versión 1 o versión 2 (si se aprovisiona localmente)

**Código**

El código de este patrón se encuentra en el GitHub repositorio [Terraform EC2 Image Builder Container Hardening](https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline) Pipeline. Para usar el código de muestra, realice los pasos de la siguiente sección.

## Epics
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-epics"></a>

### Aprovisione la infraestructura
<a name="provision-the-infrastructure"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Configure las credenciales locales. | Configure sus credenciales temporales de AWS.[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform.html) | AWS DevOps | 
| Clonar el repositorio. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform.html) | AWS DevOps | 
| Actualice variables. | Actualice las variables del archivo `hardening-pipeline.tfvars` para adecuarlas a su entorno y configuración. Debe proporcionar su `account_id`. También debe modificar el resto de las variables para adaptarlas a la implementación deseada. Todas las variables son obligatorias.<pre>account_id     = "<DEPLOYMENT-ACCOUNT-ID>"<br />aws_region     = "us-east-1"<br />vpc_name       = "example-hardening-pipeline-vpc"<br />kms_key_alias = "image-builder-container-key"<br />ec2_iam_role_name = "example-hardening-instance-role"<br />hardening_pipeline_role_name = "example-hardening-pipeline-role"<br />aws_s3_ami_resources_bucket = "example-hardening-ami-resources-bucket-0123"<br />image_name = "example-hardening-al2-container-image"<br />ecr_name = "example-hardening-container-repo"<br />recipe_version = "1.0.0" <br />ebs_root_vol_size = 10</pre><br />Aquí tiene una descripción de cada variable:[See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform.html) | AWS DevOps | 
| Inicialice Terraform. | Tras actualizar los valores de las variables, puede inicializar el directorio de configuración de Terraform. Al inicializar el directorio de configuración, se descarga e instala el proveedor de AWS definido en la configuración.<pre>terraform init</pre><br />Aparecerá un mensaje indicando que Terraform se ha inicializado correctamente e identificando la versión del proveedor instalada. | AWS DevOps | 
| Implemente la infraestructura y cree una imagen de contenedor. | Use el siguiente comando para inicializar, validar y aplicar los módulos de Terraform al entorno mediante las variables definidas en su archivo `.tfvars`:<pre>terraform init && terraform validate && terraform apply -var-file *.tfvars -auto-approve</pre> | AWS DevOps | 
| Personalice el contenedor. | Puede crear una nueva versión de una receta de contenedor después de que EC2 Image Builder haya implementado la canalización y la receta inicial.<br />Puede añadir cualquiera de los más de 31 componentes disponibles en EC2 Image Builder para personalizar la construcción del contenedor. Para obtener más información, consulte la sección *Componentes* de [Crear una nueva versión de una receta de contenedor](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-container-recipes.html) en la documentación de EC2 Image Builder. | Administrador de AWS | 

### Valide los recursos
<a name="validate-resources"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Valide el aprovisionamiento de la infraestructura de AWS. | Una vez que haya completado correctamente su primer comando `apply` de Terraform, si está aprovisionando localmente, debería ver este fragmento en la terminal de su máquina local:<pre>Apply complete! Resources: 43 added, 0 changed, 0 destroyed.</pre> | AWS DevOps | 
| Valide los recursos individuales de la infraestructura de AWS. | Para validar los recursos individuales implementados, si aprovisiona de forma local, puede ejecutar el siguiente comando:<pre>terraform state list</pre><br />Este comando devuelve una lista de 43 recursos. | AWS DevOps | 

### Eliminar recursos
<a name="remove-resources"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Elimine la imagen de la infraestructura y el contenedor. | Cuando haya terminado de trabajar con la configuración de Terraform, puede ejecutar el siguiente comando para eliminar los recursos:<pre>terraform init && terraform validate && terraform destroy -var-file *.tfvars -auto-approve</pre> | AWS DevOps | 

## Resolución de problemas
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-troubleshooting"></a>


| Problema | Solución | 
| --- | --- | 
| Error al validar las credenciales del proveedor | Al ejecutar los comandos `apply` o `destroy` de Terraform desde su equipo local, es posible que se produzca un error similar al siguiente:<pre>Error: configuring Terraform AWS Provider: error validating provider <br />credentials: error calling sts:GetCallerIdentity: operation error STS: <br />GetCallerIdentity, https response error StatusCode: 403, RequestID: <br />123456a9-fbc1-40ed-b8d8-513d0133ba7f, api error InvalidClientTokenId: <br />The security token included in the request is invalid.</pre><br />Este error se debe a la caducidad del token de seguridad de las credenciales usadas en la configuración de la máquina local.<br />Para resolver el error, consulte [Cómo establecer y ver ajustes de configuración](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods) en la documentación de la CLI de AWS. | 

## Recursos relacionados
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-resources"></a>
+ [Terraform EC2 Image Builder Container Hardening Pipeline (repositorio](https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline)) GitHub 
+ [EC2 Documentación de Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)
+ [Fábrica de cuentas de AWS Control Tower para Terraform](https://aws.amazon.com/blogs/aws/new-aws-control-tower-account-factory-for-terraform/) (publicación del blog de AWS)
+ [Bucket de S3 de estado de backend](https://developer.hashicorp.com/terraform/language/settings/backends/s3) (documentación de Terraform)
+ [Instalación o actualización de la versión más reciente de la CLI de AWS](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) (documentación de la CLI de AWS)
+ [Descargar Terraform](https://developer.hashicorp.com/terraform/downloads)