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

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

Repositorio de código: Terraform EC2 Image Builder Container Hardening Pipeline

Entorno: producción

Origen: Packer, Chef o Pure Ansible

Objetivo: EC2 Image Builder

Tipo R: renovar arquitectura

Carga de trabajo: código abierto

Tecnologías: seguridad, identidad, cumplimiento; DevOps

AWSservicios: Amazon EC2 Container Registry; EC2 Image Builder

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. La receta le ayuda a implementar una imagen de contenedor de Amazon Linux 2 basada en Docker que ha sido reforzada de acuerdo con Red Hat Enterprise Linux RHEL () STIG 7 Version 3 Release 7 ‒ Medium. (Consulte STIG-Build-Linux-Medium versión 2022.2.1 en la sección de componentes de Linux de la documentación STIG de Image Builder). EC2 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 (AmazonECR). La otra regla envía notificaciones a una cola de Amazon Simple Queue Service (AmazonSQS) después de que una imagen se envíe correctamente al ECR repositorio de Amazon, para ayudarte a usar 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 

  • Una AWScuenta en la que puede implementar la infraestructura.

  • AWSSe instaló una interfaz de línea de comandos (AWSCLI) para configurar sus AWS credenciales para la implementación local.

  • Terraform descargado y configurado según las instrucciones de la documentación de Terraform.

  • Git (si aprovisiona desde una máquina local).

  • Un rol dentro de la AWS cuenta que puede usar para crear AWS recursos.

  • Todas las variables definidas en el archivo .tfvars.  También puede definir todas las variables al aplicar la configuración de Terraform.

Limitaciones

Versiones de producto

  • Amazon Linux 2

  • AWSCLIversión 1.1 o posterior

Arquitectura

Pila de tecnología de destino

Este patrón crea 43 recursos, incluidos:

  • Dos depósitos de Amazon Simple Storage Service (Amazon S3): uno para los archivos de los componentes de la canalización y otro para el acceso al servidor y los registros de flujo de Amazon VPC

  • Un ECRrepositorio de Amazon

  • Una nube privada virtual (VPC) que contiene una subred pública, una subred privada, tablas de enrutamiento, una puerta de enlace y una NAT puerta de enlace a Internet

  • Una canalización, una receta y componentes de EC2 Image Builder

  • Una imagen de contenedor

  • Una AWS clave del Servicio de administración de claves (AWSKMS) 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. Aquí también puede añadir YAML archivos 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.tfy dist-config.tf contienen los recursos necesarios para la AWS infraestructura mínima necesaria para generar y distribuir la imagen.

  • infra-network-config.tfcontiene la VPC infraestructura mínima para 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 (AmazonEC2).

  • trigger-build.tfcontiene las EventBridge reglas y los recursos de SQS cola.

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. EC2Image Builder crea una imagen de contenedor mediante la receta definida, que instala las actualizaciones del sistema operativo y aplica RHEL Medium STIG a la imagen base de Amazon Linux 2.

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

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

  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 de varias cuentas, como un entorno de AWSControl Tower with 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 escalonado, despliegue 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 landing zone, y conceda permiso a las cuentas de los consumidores para acceder al ECR repositorio y la AWS KMS clave de Amazon. Para obtener más información sobre la configuración, consulta el artículo de Re:post ¿Cómo puedo permitir que una cuenta secundaria inserte o extraiga imágenes en mi repositorio de imágenes de AmazonECR? Por ejemplo, en una máquina expendedora de cuentas o en Account Factory para Terraform, añade permisos a cada línea base de cuenta o línea base de personalización de la cuenta para proporcionar acceso a ese ECR repositorio de Amazon 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 AWS KMS clave 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.

    • Modificar repository_name para que apunte a un ECR repositorio de Amazon existente. Esto crea otra canalización que despliega un tipo de imagen principal diferente en tu ECR repositorio de Amazon existente.

Herramientas

Herramientas

  • Terraform (aprovisionamiento de iAC)

  • Git (si se aprovisiona localmente)

  • AWSCLIversió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.

Configura tus credenciales AWS temporales.

  1. Comprueba si AWS CLI está instalado:

    $ aws --version aws-cli/1.16.249 Python/3.6.8...
    • AWSCLIla versión debe ser 1.1 o posterior.

    • Si no encuentra el comando, instale el AWS CLI.

  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 AWS cuenta en el que desea implementar la solución.

  • aws_region‒ La AWS región en la que desea implementar la solución.

  • vpc_name‒ El nombre de su VPC infraestructura.

  • kms_key_alias‒ El nombre AWS KMS clave que utilizará la configuración de 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 ECR registro de Amazon 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 (AmazonEBS). 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 un directorio de configuración, se descarga e instala el AWS proveedor, que se define 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.

AWSadministrador
TareaDescripciónHabilidades requeridas

Valide el aprovisionamiento de la AWS infraestructura.

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 de AWS infraestructura individuales.

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

Resolució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 Establecer y ver los ajustes de configuración en la AWS CLI documentación.

Recursos relacionados