Cree una canalización para imágenes de contenedores reforzadas con EC2 Image Builder y Terraform - Recomendaciones de AWS

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

Creado por Mike Saintcross (AWS) y Andrew Ranes (AWS)

Resumen

Este patrón crea una canalización de EC2 Image Builder que produce una imagen de contenedor base de 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 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. Una regla inicia el proceso de imágenes de contenedor cuando el resultado de Amazon Inspector es Alto o Crítico, con el fin de sustituir las imágenes no seguras. Esta regla requiere que se habilite el escaneo mejorado de Amazon Inspector y Amazon Elastic Container Registry (Amazon ECR). La otra regla envía las notificaciones a una cola 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

Amazon Linux 2 está a punto de finalizar el soporte. Para obtener más información, consulte Amazon Linux 2 FAQs.

Requisitos previos y limitaciones

Requisitos previos 

Limitaciones

Versiones de producto

  • Amazon Linux 2

  • Versión 1.1 o posterior de la CLI de AWS

Arquitectura

Pila de tecnología de destino

Este patrón crea 43 recursos, incluidos:

  • Dos buckets 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

  • 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 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 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.tfcrea 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.tfcontiene 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.tfcontiene 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

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.

  2. 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.

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

  4. 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 con Account Factory para Terraform. En ese caso, deberá usar un bucket de S3 con estado de backend 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? Por ejemplo, en una máquina expendedora de cuentas 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, 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.

Herramientas

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 Pipeline. Para usar el código de muestra, realice los pasos de la siguiente sección.

Epics

TareaDescripciónHabilidades requeridas

Configure las credenciales locales.

Configure sus credenciales temporales de AWS.

  1. Compruebe si la CLI de AWS está instalada:

    $ aws --version aws-cli/1.16.249 Python/3.6.8...
  2. Ejecute aws configure y proporcione los siguientes valores:

    $ aws configure AWS Access Key ID [*************xxxx]: <Your AWS access key ID> AWS Secret Access Key [**************xxxx]: <Your AWS secret access key> Default region name: [us-east-1]: <Your desired Region for deployment> Default output format [None]: <Your desired output format>
AWS DevOps

Clonar el repositorio.

  1. Clonar el repositorio proporcionado con este patrón: Puede usar HTTPS o Secure Shell (SSH).

    HTTPS:

    git clone https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline

    SSH:

    git clone git@github.com:aws-samples/terraform-ec2-image-builder-container-hardening-pipeline.git
  2. Navegue hasta el directorio local que contiene esta solución:

    cd terraform-ec2-image-builder-container-hardening-pipeline
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.

account_id = "<DEPLOYMENT-ACCOUNT-ID>" aws_region = "us-east-1" vpc_name = "example-hardening-pipeline-vpc" kms_key_alias = "image-builder-container-key" ec2_iam_role_name = "example-hardening-instance-role" hardening_pipeline_role_name = "example-hardening-pipeline-role" aws_s3_ami_resources_bucket = "example-hardening-ami-resources-bucket-0123" image_name = "example-hardening-al2-container-image" ecr_name = "example-hardening-container-repo" recipe_version = "1.0.0" ebs_root_vol_size = 10

Aquí tiene una descripción de cada variable:

  • account_id ‒ El número de cuenta de AWS en el que desea implementar la solución.

  • aws_region: la Región de AWS en la que desea implementar la solución.

  • vpc_name ‒ El nombre de su infraestructura de VPC.

  • kms_key_alias‒ El nombre de la clave de AWS KMS que utilizará la configuración de la infraestructura de EC2 Image Builder.

  • ec2_iam_role_name‒ El nombre del rol que se utilizará como perfil de la EC2 instancia.

  • hardening_pipeline_role_name ‒ El nombre del rol que se usará para implementar el proceso de refuerzo.

  • aws_s3_ami_resources_bucket ‒ El nombre del bucket de S3 que alojará todos los archivos necesarios para crear las imágenes del proceso y el contenedor.

  • image_name ‒ El nombre de la imagen del contenedor. Este valor debe tener entre 3 y 50 caracteres, y solo puede contener caracteres alfanuméricos y guiones.

  • ecr_name ‒ El nombre del registro de Amazon ECR en el que se almacenan las imágenes del contenedor.

  • recipe_version: la versión de la receta de la imagen. El valor predeterminado es 1.0.0.

  • ebs_root_vol_size ‒ El tamaño (en gigabytes) del volumen raíz de Amazon Elastic Block Store (Amazon EBS). El valor predeterminado es 10 gigabytes.

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.

terraform init

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:

terraform init && terraform validate && terraform apply -var-file *.tfvars -auto-approve
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.

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 en la documentación de EC2 Image Builder.

Administrador de AWS
TareaDescripciónHabilidades 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:

Apply complete! Resources: 43 added, 0 changed, 0 destroyed.
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:

terraform state list

Este comando devuelve una lista de 43 recursos.

AWS DevOps
TareaDescripciónHabilidades 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:

terraform init && terraform validate && terraform destroy -var-file *.tfvars -auto-approve
AWS DevOps

Solución de problemas

ProblemaSolució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:

Error: configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 123456a9-fbc1-40ed-b8d8-513d0133ba7f, api error InvalidClientTokenId: The security token included in the request is invalid.

Este error se debe a la caducidad del token de seguridad de las credenciales usadas en la configuración de la máquina local.

Para resolver el error, consulte Cómo establecer y ver ajustes de configuración en la documentación de la CLI de AWS.

Recursos relacionados