Créez un pipeline pour les images de conteneurs renforcées à l'aide d'EC2 Image Builder et de Terraform - Recommandations AWS

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

Créée par Mike Saintcross (AWS) et Andrew Ranes (AWS)

Référentiel de code : Terraform EC2 Image Builder Container Hardening Pipeline

Environnement : Production

Source : Packer, Chef ou Pure Ansible

Cible : EC2 Image Builder

Type R : Ré-architecte

Charge de travail : Open source

Technologies : sécurité, identité, conformité ; DevOps

Services AWS : registre des conteneurs Amazon EC2 ; Amazon EC2 Image Builder

Récapitulatif

Ce modèle crée un pipeline EC2 Image Builder qui produit une image de conteneur de base 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 version 2022.2.1 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. Une règle lance le pipeline d'images du conteneur lorsque le résultat d'Amazon Inspector 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é. L'autre règle envoie des notifications à une file d'attente Amazon Simple Queue Service (Amazon SQS) 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.

Conditions préalables et limitations

Prérequis

  • Un compte AWS dans lequel vous pouvez déployer l'infrastructure.

  • Interface de ligne de commande AWS (AWS CLI) installée pour définir vos informations d'identification AWS pour le déploiement local.

  • Terraform a été téléchargé et configuré en suivant les instructions de la documentation Terraform.

  • Git (si vous effectuez le provisionnement à partir d'une machine locale).

  • Rôle au sein du compte AWS que vous pouvez utiliser pour créer des ressources AWS.

  • Toutes les variables définies dans le fichier .tfvars.  Vous pouvez également définir toutes les variables lorsque vous appliquez la configuration Terraform.

Limites

Versions du produit

  • Amazon Linux 2

  • AWS CLI version 1.1 ou ultérieure

Architecture

Pile technologique cible

Ce modèle crée 43 ressources, dont :

  • Deux compartiments Amazon Simple Storage Service (Amazon S3) : 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

  • 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

  • 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 règles EventBridge

  • Deux EventBridge règles

Structure du module Terraform

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

Détails du module

  • components.tfcontient une ressource de téléchargement Amazon S3 permettant de 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.

  • /filescontient les .yml fichiers qui définissent les composants utilisés danscomponents.tf.

  • image.tfcontient 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.tfet dist-config.tf contiennent les ressources nécessaires à l'infrastructure AWS minimale nécessaire pour créer et distribuer l'image.

  • infra-network-config.tfcontient l'infrastructure VPC minimale dans laquelle déployer l'image du conteneur.

  • hardening-pipeline.tfvarscontient les variables Terraform à utiliser au moment de l'application.

  • pipeline.tfcrée et gère un pipeline EC2 Image Builder dans Terraform.

  • recipes.tfest l'endroit où vous pouvez spécifier différents mélanges de composants pour créer des recettes de conteneurs.

  • roles.tfcontient 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.tfcontient 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

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.

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

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

  4. 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 renforcée.

Automatisation et évolutivité

  • 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 with Account Factory pour Terraform. Dans ce cas, vous devez utiliser un compartiment S3 d'état principal 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 ? Par exemple, dans un distributeur automatique de comptes ou Account 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 d'EC2 Image Builder, telles que les composants, 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

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 Pipeline. Pour utiliser l'exemple de code, suivez les instructions de la section suivante.

Épopées

TâcheDescriptionCompétences requises

Configurez les informations d'identification locales.

Configurez vos informations d'identification temporaires AWS.

  1. Vérifiez si l'AWS CLI est installée :

    $ aws --version aws-cli/1.16.249 Python/3.6.8...
  2. Exécutez aws configure et fournissez les valeurs suivantes :

    $ 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

Pour cloner le référentiel.

  1. Clonez le référentiel fourni avec ce modèle. Vous pouvez utiliser HTTPS ou 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. Accédez à votre répertoire local qui contient cette solution :

    cd terraform-ec2-image-builder-container-hardening-pipeline
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ôtreaccount_id. Cependant, vous devez également modifier le reste des variables en fonction du déploiement souhaité. Toutes les variables sont obligatoires.

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

Voici une description de chaque variable :

  • account_id‒ Le numéro de compte AWS dans lequel vous souhaitez déployer la solution.

  • aws_region‒ La région AWS dans laquelle vous souhaitez déployer la solution.

  • vpc_name‒ Le nom de votre infrastructure VPC.

  • kms_key_alias‒ Le nom de clé AWS KMS à utiliser par la configuration de l'infrastructure EC2 Image Builder.

  • ec2_iam_role_name‒ Nom du rôle qui sera utilisé comme profil d'instance EC2.

  • hardening_pipeline_role_name‒ Nom du rôle qui sera utilisé pour déployer le pipeline de renforcement.

  • aws_s3_ami_resources_bucket‒ Nom d'un compartiment S3 qui hébergera tous les fichiers nécessaires à la création du pipeline et des images du conteneur.

  • image_name‒ Nom de l'image du conteneur. Cette valeur doit être comprise entre 3 et 50 caractères et ne doit contenir que des caractères alphanumériques et des tirets.

  • ecr_name‒ Le nom du registre Amazon ECR dans lequel les images du conteneur seront stockées.

  • recipe_version‒ La version de la recette imagée. La valeur par défaut est 1.0.0.

  • ebs_root_vol_size‒ Taille (en gigaoctets) du volume racine Amazon Elastic Block Store (Amazon EBS). La valeur par défaut est de 10 gigaoctets.

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.

terraform init

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

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

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 dans la documentation d'EC2 Image Builder.

Administrateur AWS
TâcheDescriptionCompé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 :

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

terraform state list

Cette commande renvoie une liste de 43 ressources.

AWS DevOps
TâcheDescriptionCompé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 :

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

Résolution des problèmes

ProblèmeSolution

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 :

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.

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.

Pour résoudre l'erreur, consultez la section Définir et afficher les paramètres de configuration dans la documentation de l'AWS CLI.

Ressources connexes