Utilisez Terraform pour activer automatiquement Amazon GuardDuty pour une organisation - 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.

Utilisez Terraform pour activer automatiquement Amazon GuardDuty pour une organisation

Créée par Aarthi Kannan () AWS

Référentiel de code : amazon-guardduty-for-aws - organizations-with-terraform

Environnement : Production

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

Charge de travail : toutes les autres charges de travail

AWSservices : Amazon GuardDuty ; AWS Organizations

Récapitulatif

Amazon surveille GuardDuty en permanence vos comptes Amazon Web Services (AWS) et utilise les informations sur les menaces pour identifier les activités inattendues et potentiellement malveillantes au sein de votre AWS environnement. L'activation manuelle GuardDuty pour plusieurs comptes ou organisations, dans plusieurs AWS régions ou via la console de AWS gestion peut s'avérer fastidieuse. Vous pouvez automatiser le processus en utilisant un outil d'infrastructure en tant que code (IaC), tel que Terraform, qui peut fournir et gérer des services et des ressources multicomptes et multirégionaux dans le cloud.

AWSrecommande d'utiliser AWS Organizations pour configurer et gérer plusieurs comptes dans GuardDuty. Ce modèle est conforme à cette recommandation. L'un des avantages de cette approche est que, lorsque de nouveaux comptes sont créés ou ajoutés à l'organisation, GuardDuty ils sont automatiquement activés dans ces comptes pour toutes les régions prises en charge, sans intervention manuelle.

Ce modèle montre comment utiliser HashiCorp Terraform pour activer Amazon GuardDuty pour trois comptes Amazon Web Services (AWS) ou plus dans une organisation. L'exemple de code fourni avec ce modèle effectue les opérations suivantes :

  • Active GuardDuty l'accès à tous les AWS comptes actuellement membres de l'organisation cible dans AWS Organizations

  • Active la fonctionnalité d'activation automatique GuardDuty, qui active automatiquement tous GuardDuty les comptes ajoutés à l'organisation cible à l'avenir

  • Vous permet de sélectionner les régions dans lesquelles vous souhaitez activer GuardDuty

  • Utilise le compte de sécurité de l'organisation en tant qu'administrateur GuardDuty délégué

  • Crée un compartiment Amazon Simple Storage Service (Amazon S3) dans le compte de journalisation et le GuardDuty configure pour publier les résultats agrégés de tous les comptes de ce compartiment

  • Attribue une politique de cycle de vie qui transfère les résultats du compartiment S3 vers le stockage flexible de récupération Amazon S3 Glacier après 365 jours, par défaut

Vous pouvez exécuter manuellement cet exemple de code ou l'intégrer dans votre pipeline d'intégration continue et de livraison continue (CI/CD).

Public cible

Ce modèle est recommandé aux utilisateurs expérimentés avec Terraform GuardDuty, Python et AWS Organizations.

Conditions préalables et limitations

Prérequis

  • Un compte AWS actif.

  • Une organisation est configurée dans AWS Organizations et contient au moins les trois comptes suivants :

    • Un compte de gestion — Il s'agit du compte à partir duquel vous déployez le code Terraform, soit de manière autonome, soit dans le cadre du pipeline CI/CD. L'état Terraform est également stocké dans ce compte.

    • Un compte de sécurité — Ce compte est utilisé en tant qu'administrateur GuardDuty délégué. Pour plus d'informations, consultez Considérations importantes pour les administrateurs GuardDuty délégués (GuardDuty documentation).

    • Un compte de journalisation — Ce compte contient le compartiment S3 où sont GuardDuty publiés les résultats agrégés de tous les comptes membres.

    Pour plus d'informations sur la façon de configurer l'organisation avec la configuration requise, voir Créer une structure de compte (AWSWell-Architected Labs).

  • Un compartiment Amazon S3 et une table Amazon DynamoDB qui servent de backend distant pour stocker l'état de Terraform dans le compte de gestion. Pour plus d'informations sur l'utilisation de backends distants pour l'état Terraform, consultez S3 Backends (documentation Terraform). Pour un exemple de code qui configure la gestion de l'état à distance avec un backend S3, voir remote-state-s3-backend (Terraform Registry). Notez les critères suivants :

    • Le compartiment S3 et la table DynamoDB doivent se trouver dans la même région.

    • Lors de la création de la table DynamoDB, la clé de partition doit LockID être (distinguer majuscules et minuscules) et le type de clé de partition doit être String. Tous les autres paramètres du tableau doivent être à leurs valeurs par défaut. Pour plus d'informations, consultez À propos des clés primaires et Création d'une table (documentation DynamoDB).

  • Un compartiment S3 qui sera utilisé pour stocker les journaux d'accès pour le compartiment S3 dans lequel les résultats GuardDuty seront publiés. Pour plus d'informations, consultez Activer la journalisation des accès au serveur Amazon S3 (documentation Amazon S3). Si vous effectuez un déploiement dans une zone d'atterrissage de AWS Control Tower, vous pouvez réutiliser le compartiment S3 dans le compte d'archive du journal à cette fin.

  • La version 0.14.6 ou ultérieure de Terraform est installée et configurée. Pour plus d'informations, consultez Get Started — AWS (documentation Terraform).

  • La version 3.9.6 ou ultérieure de Python est installée et configurée. Pour plus d'informations, consultez la section Sources (site Web de Python).

  • AWSSDKpour Python (Boto3) est installé. Pour plus d'informations, voir Installation (documentation Boto3).

  • jq est installé et configuré. Pour plus d'informations, consultez Télécharger jq (documentation jq).

Limites

  • Ce modèle est compatible avec les systèmes d'exploitation macOS et Amazon Linux 2. Ce modèle n'a pas été testé pour être utilisé dans les systèmes d'exploitation Windows.

    Remarque : le support d'Amazon Linux 2 touche à sa fin. Pour plus d'informations, consultez Amazon Linux 2 FAQs.

  • GuardDuty ne doit pas déjà être activé dans aucun des comptes, dans aucune des régions cibles.

  • Dans ce modèle, la solution IaC ne déploie pas les prérequis.

  • Ce modèle est conçu pour une zone AWS d'atterrissage conforme aux meilleures pratiques suivantes :

    • La zone d'atterrissage a été créée à l'aide AWS de Control Tower.

    • Des AWS comptes distincts sont utilisés pour des raisons de sécurité et de journalisation.

Versions du produit

  • Terraform version 0.14.6 ou ultérieure. L'exemple de code a été testé pour la version 1.2.8.

  • Python version 3.9.6 ou ultérieure.

Architecture

Cette section donne un aperçu général de cette solution et de l'architecture établie par l'exemple de code. Le schéma suivant montre les ressources déployées sur les différents comptes de l'organisation, au sein d'une même AWS région.

Schéma d'architecture illustrant les ressources liées à la gestion, à la sécurité, à la journalisation et aux comptes des membres.
  1. Terraform crée le rôle GuardDutyTerraformOrgRoleAWSIdentity and Access Management (IAM) dans le compte de sécurité et le compte de connexion.

  2. Terraform crée un compartiment S3 dans la AWS région par défaut du compte de journalisation. Ce compartiment est utilisé comme destination de publication pour agréger tous les GuardDuty résultats provenant de toutes les régions et de tous les comptes de l'organisation. Terraform crée également une AWS clé du service de gestion des clés (AWSKMS) dans le compte de sécurité qui est utilisée pour chiffrer les résultats du compartiment S3 et configure l'archivage automatique des résultats du compartiment S3 dans le stockage S3 Glacier Flexible Retrieval.

  3. À partir du compte de gestion, Terraform désigne le compte de sécurité comme administrateur délégué pour. GuardDuty Cela signifie que le compte de sécurité gère désormais le GuardDuty service pour tous les comptes des membres, y compris le compte de gestion. Les comptes de membres individuels ne peuvent pas être suspendus ou GuardDuty désactivés par eux-mêmes.

  4. Terraform crée le GuardDuty détecteur dans le compte de sécurité, pour l'administrateur GuardDuty délégué.

  5. S'il n'est pas déjà activé, Terraform active la protection S3 dans. GuardDuty Pour plus d'informations, consultez la section Protection d'Amazon S3 sur Amazon GuardDuty (GuardDuty documentation).

  6. Terraform inscrit tous les comptes de membres actifs actuels de l'organisation en tant que membres. GuardDuty

  7. Terraform configure l'administrateur GuardDuty délégué pour publier les résultats agrégés de tous les comptes membres dans le compartiment S3 du compte de journalisation.

  8. Terraform répète les étapes 3 à 7 pour chaque AWS région que vous choisissez.

Automatisation et mise à l'échelle

L'exemple de code fourni est modularisé afin que vous puissiez l'intégrer dans votre pipeline CI/CD pour un déploiement automatisé.

Outils

AWSservices

  • Amazon DynamoDB est un service SQL sans base de données entièrement géré qui fournit des performances rapides, prévisibles et évolutives.

  • Amazon GuardDuty est un service de surveillance continue de la sécurité qui analyse et traite les journaux afin d'identifier les activités inattendues et potentiellement non autorisées dans votre AWS environnement.

  • AWSIdentity and Access Management (IAM) vous aide à gérer en toute sécurité l'accès à vos AWS ressources en contrôlant qui est authentifié et autorisé à les utiliser.

  • AWSLe service de gestion des clés (AWSKMS) vous aide à créer et à contrôler des clés cryptographiques pour protéger vos données.

  • AWSOrganizations est un service de gestion de comptes qui vous aide à consolider plusieurs AWS comptes au sein d'une organisation que vous créez et gérez de manière centralisée.

  • Amazon Simple Storage Service (Amazon S3) est un service de stockage d'objets basé sur le cloud qui vous permet de stocker, de protéger et de récupérer n'importe quel volume de données.

  • AWSSDKfor Python (Boto3) est un kit de développement logiciel qui vous aide à intégrer votre application, bibliothèque ou script Python à des AWS services.

Autres outils et services

  • HashiCorp Terraform est une application d'interface en ligne de commande qui vous aide à utiliser du code pour provisionner et gérer l'infrastructure et les ressources du cloud.

  • Python est un langage de programmation polyvalent.

  • jq est un processeur de ligne de commande qui vous permet de travailler avec des fichiers. JSON

Référentiel de code

Le code de ce modèle est disponible sur GitHub, dans le organizations-with-terraform référentiel amazon-guardduty-for-aws-.

Épopées

TâcheDescriptionCompétences requises

Pour cloner le référentiel.

Dans un shell Bash, exécutez la commande suivante. Dans Cloner le référentiel, dans la section Informations supplémentaires, vous pouvez copier la commande complète contenant le URL du GitHub référentiel. Cela clone le organizations-with-terraform référentiel amazon-guardduty-for-aws- à partir de GitHub.

git clone <github-repository-url>
DevOps ingénieur

Modifiez le fichier de configuration Terraform.

  1. Dans le root dossier du référentiel cloné, répliquez le fichier configuration.json.sample en exécutant la commande suivante.

    cp configuration.json.sample configuration.json
  2. Modifiez le nouveau fichier configuration.json et définissez les valeurs pour chacune des variables suivantes :

    • management_acc_id— Numéro de compte du compte de gestion.

    • delegated_admin_acc_id— Numéro de compte du compte de sécurité.

    • logging_acc_id— ID de compte du compte de connexion.

    • target_regions— Liste séparée par des AWS virgules des régions que vous souhaitez activer. GuardDuty

    • organization_id— AWS Organizations ID de l'organisation dans laquelle vous effectuez l'activation GuardDuty.

    • default_region— La région où votre état Terraform est stocké dans le compte de gestion. Il s'agit de la même région où vous avez déployé le compartiment S3 et la table DynamoDB pour le backend Terraform.

    • role_to_assume_for_role_creation— Nom que vous souhaitez attribuer à un nouveau IAM rôle dans les comptes de sécurité et de journalisation. Vous créerez ce nouveau rôle dans l'histoire suivante. Terraform assume ce rôle pour créer le GuardDutyTerraformOrgRole IAM rôle dans les comptes de sécurité et de journalisation.

    • finding_publishing_frequency— Fréquence à laquelle les GuardDuty résultats sont publiés dans le compartiment S3.

    • guardduty_findings_bucket_region— Région préférée dans laquelle vous souhaitez créer le compartiment S3 pour les résultats publiés.

    • logging_acc_s3_bucket_name— Nom préféré pour le compartiment S3 pour les résultats publiés.

    • security_acc_kms_key_alias— AWS KMS alias pour la clé utilisée pour chiffrer les GuardDuty résultats.

    • s3_access_log_bucket_name— Nom d'un compartiment S3 préexistant dans lequel vous souhaitez collecter les journaux d'accès pour le compartiment S3 utilisé pour les GuardDuty résultats. Ce compartiment doit se trouver dans la même AWS région que le compartiment GuardDuty des résultats.

    • tfm_state_backend_s3_bucket— Nom du compartiment S3 préexistant pour stocker l'état du backend distant Terraform.

    • tfm_state_backend_dynamodb_table— Nom de la table DynamoDB préexistante permettant de verrouiller l'état Terraform.

  3. Enregistrez et fermez le fichier de configuration .

DevOps ingénieur, généralAWS, Terraform, Python

Générez CloudFormation des modèles pour les nouveaux IAM rôles.

Ce modèle inclut une solution IaC permettant de créer deux CloudFormation modèles. Ces modèles créent deux IAM rôles que Terraform utilise lors du processus de configuration. Ces modèles respectent les meilleures pratiques de sécurité relatives aux autorisations du moindre privilège.

  1. Dans un shell Bash, dans le root dossier du référentiel, accédez àcfn-templates/. Ce dossier contient des fichiers CloudFormation modèles avec des stubs.

  2. Exécutez la commande suivante. Cela remplace les stubs par les valeurs que vous avez fournies dans le fichier configuration.json.

    bash scripts/replace_config_stubs.sh
  3. Vérifiez que les CloudFormation modèles suivants ont été créés dans le cfn-templates/ dossier :

    • management-account-role.yaml — Ce fichier contient la définition du rôle et les autorisations associées pour le IAM rôle dans le compte de gestion, qui dispose des autorisations minimales requises pour exécuter ce modèle.

    • role-to-assume-for-role-creation.yaml — Ce fichier contient la définition du rôle et les autorisations associées pour le IAM rôle dans les comptes de sécurité et de journalisation. Terraform assume ce rôle afin de créer le GuardDutyTerraformOrgRolerôle dans ces comptes.

DevOps ingénieur, général AWS

Créez les IAM rôles.

En suivant les instructions de la section Création d'une pile (CloudFormation documentation), procédez comme suit :

  1. Déployez la pile role-to-assume-for-role-creation.yaml dans les comptes de sécurité et de journalisation.

  2. Déployez la pile management-account-role.yaml dans le compte de gestion. Lorsque vous créez la pile avec succès et que vous voyez l'état de la CREATE_COMPLETE pile, notez le nom de ressource Amazon (ARN) de ce nouveau rôle dans le résultat.

DevOps ingénieur, général AWS

Assumez le IAM rôle dans le compte de gestion.

Pour des raisons de sécurité, nous vous recommandons d'assumer le nouveau management-account-roleIAMrôle avant de continuer. Dans l'interface de ligne de AWS commande (AWSCLI), entrez la commande dans Assumer le IAM rôle du compte de gestion dans la section Informations supplémentaires.

DevOps ingénieur, général AWS

Exécutez le script de configuration.

Dans le root dossier du référentiel, exécutez la commande suivante pour démarrer le script de configuration.

bash scripts/full-setup.sh

Le script full-setup.sh exécute les actions suivantes :

  • Exporte toutes les valeurs de configuration sous forme de variables d'environnement

  • Génère les fichiers de code backend.tf et terraform.tfvars pour chaque module Terraform

  • Permet un accès fiable au GuardDuty sein de l'organisation via le AWSCLI.

  • Importe l'état de l'organisation dans l'état Terraform

  • Crée le compartiment S3 pour publier les résultats dans le compte de journalisation

  • Crée la AWS KMS clé pour chiffrer les résultats dans le compte de sécurité

  • Activé GuardDuty dans l'ensemble de l'organisation, dans toutes les régions sélectionnées, comme décrit dans la section Architecture

DevOps ingénieur, Python
TâcheDescriptionCompétences requises

Exécutez le script de nettoyage.

Si vous avez utilisé ce modèle pour l'activer GuardDuty pour l'organisation et que vous souhaitez le désactiver GuardDuty, dans le root dossier du référentiel, exécutez la commande suivante pour démarrer le script cleanup-gd.sh.

bash scripts/cleanup-gd.sh

Ce script est désactivé GuardDuty dans l'organisation cible, supprime toutes les ressources déployées et restaure l'organisation à son état antérieur avant d'utiliser Terraform pour l'activer. GuardDuty

Remarque Ce script ne supprime pas les fichiers d'état Terraform ni ne verrouille les fichiers des backends locaux et distants. Si cela est nécessaire, vous devez effectuer ces actions manuellement. En outre, ce script ne supprime pas l'organisation importée ni les comptes qu'elle gère. L'accès sécurisé pour GuardDuty n'est pas désactivé dans le cadre du script de nettoyage.

DevOps ingénieur, généralAWS, Terraform, Python

Supprimez IAM les rôles.

Supprimez les piles créées avec les modèles role-to-assume-for-role-creation.yaml et .yaml. management-account-role CloudFormation Pour plus d'informations, consultez Supprimer une pile (CloudFormation documentation).

DevOps ingénieur, général AWS

Ressources connexes

AWSdocumentation

AWScommercialisation

Autres ressources

Informations supplémentaires

Cloner le référentiel

Exécutez la commande suivante pour cloner le GitHub référentiel.

git clone https://github.com/aws-samples/amazon-guardduty-for-aws-organizations-with-terraform

Assumez le IAM rôle du compte de gestion

Pour assumer le IAM rôle dans le compte de gestion, exécutez la commande suivante. Remplacez <IAM role ARN> par le ARN du IAM rôle.

export ROLE_CREDENTIALS=$(aws sts assume-role --role-arn <IAM role ARN> --role-session-name AWSCLI-Session --output json) export AWS_ACCESS_KEY_ID=$(echo $ROLE_CREDENTIALS | jq .Credentials.AccessKeyId | sed 's/"//g') export AWS_SECRET_ACCESS_KEY=$(echo $ROLE_CREDENTIALS | jq .Credentials.SecretAccessKey | sed 's/"//g') export AWS_SESSION_TOKEN=$(echo $ROLE_CREDENTIALS | jq .Credentials.SessionToken | sed 's/"//g')