

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Créez un pipeline pour les images de conteneurs renforcées à l'aide d' EC2 Image Builder et de Terraform
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform"></a>

*Mike Saintcross et Andrew Ranes, Amazon Web Services*

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

Ce modèle crée un [pipeline EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html) qui produit une image de conteneur de base [Amazon Linux 2](https://aws.amazon.com/amazon-linux-2/) renforcée. Terraform est utilisé comme outil d'infrastructure en tant que code (IaC) pour configurer et approvisionner l'infrastructure utilisée pour créer des images de conteneurs renforcées. La recette vous aide à déployer une image de conteneur Amazon Linux 2 basée sur Docker qui a été renforcée conformément à Red Hat Enterprise Linux (RHEL) 7 STIG version 3, version 7 ‒ Medium. (Voir [STIG-Build-Linux-Medium la version 2022.2.1](https://docs.aws.amazon.com/imagebuilder/latest/userguide/toe-stig.html#linux-os-stig) dans la section des *composants Linux STIG* de la documentation EC2 Image Builder.) C'est ce que l'on appelle une image de contenant *doré*.

La version inclut deux [ EventBridge règles Amazon](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-rules.html). Une règle lance le pipeline d'images du conteneur lorsque le [résultat d'Amazon Inspector](https://docs.aws.amazon.com/inspector/latest/user/findings-managing.html) est **élevé** ou **critique**, de sorte que les images non sécurisées sont remplacées. Cette règle exige que le scan [amélioré Amazon Inspector et Amazon Elastic Container Registry (Amazon ECR) soit activé](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning-enhanced.html). L'autre règle envoie des notifications à une file d'attente Amazon Simple Queue Service (Amazon [SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-types.html) après un transfert d'image réussi vers le référentiel Amazon ECR, afin de vous aider à utiliser les dernières images de conteneur.

**Note**  
Le support d'Amazon Linux 2 touche à sa fin. Pour plus d'informations, consultez [Amazon Linux 2 FAQs](https://aws.amazon.com/amazon-linux-2/faqs/).

## Conditions préalables et limitations
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-prereqs"></a>

**Conditions préalables**
+ Un [compte AWS](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) dans lequel vous pouvez déployer l'infrastructure.
+ [Interface de ligne de commande AWS (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installée pour définir vos informations d'identification AWS pour le déploiement local.
+ Terraform a été [téléchargé](https://developer.hashicorp.com/terraform/downloads) et configuré en suivant les [instructions de la documentation](https://developer.hashicorp.com/terraform/tutorials/aws-get-started) Terraform.
+ [Git](https://git-scm.com/) (si vous effectuez le provisionnement à partir d'une machine locale).
+ [Rôle](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) au sein du compte AWS que vous pouvez utiliser pour créer des ressources AWS.
+ Toutes les variables définies dans le [fichier .tfvars.](https://developer.hashicorp.com/terraform/tutorials/configuration-language/variables)  Vous pouvez également définir toutes les variables lorsque vous appliquez la configuration Terraform.

**Limites**
+ Cette solution crée une infrastructure Amazon Virtual Private Cloud (Amazon VPC) qui inclut une [passerelle NAT et une passerelle](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) [Internet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html) pour la connectivité Internet depuis son sous-réseau privé. Vous ne pouvez pas utiliser les [points de terminaison VPC](https://docs.aws.amazon.com/whitepapers/latest/aws-privatelink/what-are-vpc-endpoints.html), car le [processus d'amorçage d'AWS Task Orchestrator and Executor () AWSTOE](https://aws.amazon.com/premiumsupport/knowledge-center/image-builder-pipeline-execution-error/) installe la version 2 de l'interface de ligne de commande AWS depuis Internet.

**Versions du produit**
+ Amazon Linux 2
+ AWS CLI version 1.1 ou ultérieure

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

**Pile technologique cible**

Ce modèle crée 43 ressources, dont :
+ Deux compartiments Amazon Simple Storage Service (Amazon [S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html) : un pour les fichiers des composants du pipeline et un pour l'accès au serveur et aux journaux de flux Amazon VPC
+ Un [référentiel Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)
+ Un cloud privé virtuel (VPC) qui contient un sous-réseau public, un sous-réseau privé, des tables de routage, une passerelle NAT et une passerelle Internet
+ Un pipeline, une recette et des composants d' EC2 Image Builder
+ Une image de conteneur
+ [Une clé AWS Key Management Service (AWS KMS) pour le chiffrement des images](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)
+ Une file d'attente SQS
+ Trois rôles : un pour exécuter le pipeline EC2 Image Builder, un profil d'instance pour EC2 Image Builder et un pour les EventBridge règles
+ Deux EventBridge règles

**Structure du module Terraform**

Pour le code source, consultez le GitHub référentiel [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
```

**Détails du module**
+ `components.tf`contient une ressource de téléchargement Amazon S3 pour télécharger le contenu du `/files` répertoire. Vous pouvez également y ajouter des fichiers YAML de composants personnalisés de manière modulaire.
+ `/files`contient les `.yml` fichiers qui définissent les composants utilisés dans`components.tf`.
+ `image.tf`contient les définitions du système d'exploitation de l'image de base. C'est ici que vous pouvez modifier les définitions d'un autre pipeline d'images de base.
+ `infr-config.tf`et `dist-config.tf` contiennent les ressources nécessaires à l'infrastructure AWS minimale nécessaire pour créer et distribuer l'image.
+ `infra-network-config.tf`contient l'infrastructure VPC minimale dans laquelle déployer l'image du conteneur.
+ `hardening-pipeline.tfvars`contient les variables Terraform à utiliser au moment de l'application.
+ `pipeline.tf`crée et gère un pipeline EC2 Image Builder dans Terraform.
+ `recipes.tf`est l'endroit où vous pouvez spécifier différents mélanges de composants pour créer des recettes de conteneurs.
+ `roles.tf`contient les définitions de la politique AWS Identity and Access Management (IAM) pour le profil d'instance Amazon Elastic Compute Cloud (Amazon EC2) et le rôle de déploiement du pipeline.
+ `trigger-build.tf`contient les EventBridge règles et les ressources de file d'attente SQS.

**Architecture cible**

![Architecture et flux de travail pour créer un pipeline pour les images de conteneurs renforcées](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/4b16bdfa-4f34-41e9-a69a-d023253c8585/images/23443eca-132f-46ac-98bd-32a9e9359a77.png)


Le diagramme illustre le flux de travail suivant :

1. EC2 Image Builder crée une image de conteneur en utilisant la recette définie, qui installe les mises à jour du système d'exploitation et applique le RHEL Medium STIG à l'image de base Amazon Linux 2.

1. L'image renforcée est publiée dans un registre Amazon ECR privé, et une EventBridge règle envoie un message à une file d'attente SQS lorsque l'image a été publiée avec succès.

1. Si Amazon Inspector est configuré pour une analyse améliorée, il analyse le registre Amazon ECR.

1. Si Amazon Inspector génère un résultat de gravité **critique** ou **élevé** pour l'image, une EventBridge règle déclenche la réexécution du pipeline EC2 Image Builder et la publication d'une image récemment durcie.

**Automatisation et mise à l'échelle**
+ Ce modèle décrit comment provisionner l'infrastructure et créer le pipeline sur votre ordinateur. Cependant, il est destiné à être utilisé à grande échelle. Au lieu de déployer les modules Terraform localement, vous pouvez les utiliser dans un environnement multi-comptes, tel qu'un environnement [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html) with [Account Factory pour](https://aws.amazon.com/blogs/aws/new-aws-control-tower-account-factory-for-terraform/) Terraform. Dans ce cas, vous devez utiliser un [compartiment S3 d'état principal](https://developer.hashicorp.com/terraform/language/settings/backends/s3) pour gérer les fichiers d'état Terraform au lieu de gérer l'état de configuration localement.
+ Pour une utilisation à grande échelle, déployez la solution sur un compte central, tel qu'un compte Shared Services ou Common Services, à partir d'un modèle de compte Control Tower ou landing zone, et autorisez les comptes clients à accéder au référentiel Amazon ECR et à la clé AWS KMS. Pour plus d'informations sur la configuration, consultez l'article Re:Post [Comment autoriser un compte secondaire à envoyer ou à extraire des images dans mon référentiel d'images Amazon ECR ?](https://repost.aws/knowledge-center/secondary-account-access-ecr) Par exemple, dans un [distributeur automatique de comptes ou Account](https://www.hashicorp.com/resources/terraform-landing-zones-for-self-service-multi-aws-at-eventbrite) Factory for Terraform, ajoutez des autorisations à chaque ligne de base de compte ou à chaque ligne de base de personnalisation du compte pour donner accès à ce référentiel Amazon ECR et à cette clé de chiffrement.
+ Une fois le pipeline d'images de conteneur déployé, vous pouvez le modifier à l'aide des fonctionnalités EC2 d'Image Builder, telles que [les composants](https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-components.html), qui vous aident à intégrer davantage de composants dans la version Docker.
+ La clé AWS KMS utilisée pour chiffrer l'image du conteneur doit être partagée entre les comptes dans lesquels l'image est destinée à être utilisée.
+ Vous pouvez ajouter la prise en charge d'autres images en dupliquant l'intégralité du module Terraform et en modifiant les attributs suivants : `recipes.tf`
  + Passez `parent_image = "amazonlinux:latest"` à un autre type d'image.
  + Modifiez `repository_name` pour pointer vers un référentiel Amazon ECR existant. Cela crée un autre pipeline qui déploie un type d'image parent différent dans votre référentiel Amazon ECR existant.

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

**Outils**
+ Terraform (provisionnement iAC)
+ Git (en cas de provisionnement local)
+ Version 1 ou 2 de l'interface de ligne de commande AWS (en cas de provisionnement local)

**Code**

Le code de ce modèle se trouve dans le GitHub référentiel [Terraform EC2 Image Builder Container Hardening](https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline) Pipeline. Pour utiliser l'exemple de code, suivez les instructions de la section suivante.

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

### Fournir l'infrastructure
<a name="provision-the-infrastructure"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Configurez les informations d'identification locales. | Configurez vos informations d'identification temporaires AWS.[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform.html) | AWS DevOps | 
| Pour cloner le référentiel. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform.html) | AWS DevOps | 
| Mettez à jour les variables. | Mettez à jour les variables du `hardening-pipeline.tfvars` fichier en fonction de votre environnement et de la configuration souhaitée. Vous devez fournir le vôtre`account_id`. Cependant, vous devez également modifier le reste des variables en fonction du déploiement souhaité. Toutes les variables sont obligatoires.<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 />Voici une description de chaque variable :[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform.html) | AWS DevOps | 
| Initialisez Terraform. | Après avoir mis à jour les valeurs de vos variables, vous pouvez initialiser le répertoire de configuration Terraform. L'initialisation d'un répertoire de configuration télécharge et installe le fournisseur AWS, qui est défini dans la configuration.<pre>terraform init</pre><br />Vous devriez voir un message indiquant que Terraform a été correctement initialisé et identifiant la version du fournisseur qui a été installée. | AWS DevOps | 
| Déployez l'infrastructure et créez une image de conteneur. | Utilisez la commande suivante pour initialiser, valider et appliquer les modules Terraform à l'environnement en utilisant les variables définies dans votre fichier : `.tfvars`<pre>terraform init && terraform validate && terraform apply -var-file *.tfvars -auto-approve</pre> | AWS DevOps | 
| Personnalisez le conteneur. | Vous pouvez créer une nouvelle version d'une recette de conteneur une fois qu' EC2 Image Builder a déployé le pipeline et la recette initiale.<br />Vous pouvez ajouter n'importe lequel des 31 composants disponibles dans EC2 Image Builder pour personnaliser la construction du conteneur. Pour plus d'informations, consultez la section *Composants* de la section [Créer une nouvelle version d'une recette de conteneur](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-container-recipes.html) dans la documentation EC2 d'Image Builder. | Administrateur AWS | 

### Valider les ressources
<a name="validate-resources"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Validez le provisionnement de l'infrastructure AWS. | Une fois que vous avez terminé avec succès votre première `apply` commande Terraform, si vous effectuez le provisionnement localement, vous devriez voir cet extrait dans le terminal de votre machine locale :<pre>Apply complete! Resources: 43 added, 0 changed, 0 destroyed.</pre> | AWS DevOps | 
| Validez les ressources individuelles de l'infrastructure AWS. | Pour valider les ressources individuelles qui ont été déployées, si vous approvisionnez localement, vous pouvez exécuter la commande suivante :<pre>terraform state list</pre><br />Cette commande renvoie une liste de 43 ressources. | AWS DevOps | 

### Supprimer des ressources
<a name="remove-resources"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Supprimez l'image de l'infrastructure et du conteneur. | Lorsque vous avez fini de travailler avec votre configuration Terraform, vous pouvez exécuter la commande suivante pour supprimer des ressources :<pre>terraform init && terraform validate && terraform destroy -var-file *.tfvars -auto-approve</pre> | AWS DevOps | 

## Résolution des problèmes
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| Erreur lors de la validation des informations d'identification du fournisseur | Lorsque vous exécutez la `destroy` commande Terraform `apply` ou depuis votre machine locale, vous pouvez rencontrer une erreur similaire à la suivante :<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 />Cette erreur est due à l'expiration du jeton de sécurité pour les informations d'identification utilisées dans la configuration de votre machine locale.<br />Pour résoudre l'erreur, consultez la section [Définir et afficher les paramètres de configuration](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods) dans la documentation de l'AWS CLI. | 

## Ressources connexes
<a name="build-a-pipeline-for-hardened-container-images-using-ec2-image-builder-and-terraform-resources"></a>
+ [Pipeline de renforcement des conteneurs Terraform EC2 Image Builder](https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline) (référentiel) GitHub 
+ [EC2 Documentation d'Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)
+ [AWS Control Tower Account Factory pour Terraform](https://aws.amazon.com/blogs/aws/new-aws-control-tower-account-factory-for-terraform/) (article de blog AWS)
+ [État du compartiment S3 du backend](https://developer.hashicorp.com/terraform/language/settings/backends/s3) (documentation Terraform)
+ [Installation ou mise à jour de la dernière version de l'interface de ligne de commande AWS (documentation de l'](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)interface de ligne de commande AWS)
+ [Télécharger Terraform](https://developer.hashicorp.com/terraform/downloads)