Activez Amazon de GuardDuty manière conditionnelle à l'aide de modèles AWS CloudFormation - 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.

Activez Amazon de GuardDuty manière conditionnelle à l'aide de modèles AWS CloudFormation

Créée par Ram Kandaswamy (AWS)

Environnement : Production

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

Services AWS : AWS CloudFormation ; Amazon GuardDuty ; AWS Lambda ; AWS Identity and Access Management

Récapitulatif

Vous pouvez activer Amazon GuardDuty sur un compte Amazon Web Services (AWS) à l'aide d'un CloudFormation modèle AWS. Par défaut, s' GuardDuty il est déjà activé lorsque vous essayez de l' CloudFormation activer, le déploiement de la pile échoue. Toutefois, vous pouvez utiliser les conditions de votre CloudFormation modèle pour vérifier s'il GuardDuty est déjà activé. CloudFormation prend en charge l'utilisation de conditions qui comparent des valeurs statiques ; il ne prend pas en charge l'utilisation de la sortie d'une autre propriété de ressource dans le même modèle. Pour plus d'informations, consultez la section Conditions du guide de CloudFormation l'utilisateur.

Dans ce modèle, vous utilisez une ressource CloudFormation personnalisée soutenue par une fonction AWS Lambda pour l'activer de manière conditionnelle GuardDuty si elle n'est pas déjà activée. Si cette option GuardDuty est activée, la pile capture le statut et l'enregistre dans la section de sortie de la pile. S'il n' GuardDuty est pas activé, la pile l'active.

Conditions préalables et limitations

Prérequis

  • Un compte AWS actif

  • Rôle AWS Identity and Access Management (IAM) autorisé à créer, mettre à jour et supprimer des piles CloudFormation

Limites

  • S'il GuardDuty a été désactivé manuellement pour un compte ou une région AWS, ce modèle ne s'active pas GuardDuty pour ce compte ou cette région cible.

Architecture

Pile technologique cible

Le modèle est utilisé CloudFormation pour l'infrastructure en tant que code (IaC). Vous utilisez une ressource CloudFormation personnalisée soutenue par une fonction Lambda pour obtenir la fonctionnalité d'activation dynamique des services.

Architecture cible

Le schéma d'architecture de haut niveau suivant montre le processus d'activation GuardDuty par le déploiement d'un CloudFormation modèle :

  1. Vous déployez un CloudFormation modèle pour créer une CloudFormation pile.

  2. La pile crée un rôle IAM et une fonction Lambda.

  3. La fonction Lambda assume le rôle IAM.

  4. Si GuardDuty ce n'est pas déjà le cas sur le compte AWS cible, la fonction Lambda l'active.

Le processus d'activation GuardDuty par le déploiement d'un CloudFormation modèle

Automatisation et mise à l'échelle

Vous pouvez utiliser la CloudFormation StackSet fonctionnalité AWS pour étendre cette solution à plusieurs comptes AWS et régions AWS. Pour plus d'informations, consultez la section Travailler avec AWS CloudFormation StackSets dans le guide de CloudFormation l'utilisateur.

Outils

  • L'interface de ligne de commande AWS (AWS CLI) est un outil open source qui vous permet d'interagir avec les services AWS par le biais de commandes dans votre shell de ligne de commande.

  • AWS vous CloudFormation aide à configurer les ressources AWS, à les approvisionner rapidement et de manière cohérente, et à les gérer tout au long de leur cycle de vie sur l'ensemble des comptes et des régions AWS.

  • 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 environnement AWS.

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

  • AWS Lambda est un service de calcul qui vous permet d'exécuter du code sans avoir à provisionner ou à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.

Épopées

TâcheDescriptionCompétences requises

Créez le CloudFormation modèle.

  1. Copiez le code dans le CloudFormation modèle dans la section Informations supplémentaires.

  2. Collez le code dans un éditeur de texte.

  3. Enregistrez le fichier sample.yaml sur votre poste de travail.

AWS DevOps

Créez la CloudFormation pile.

  1. Dans l'AWS CLI, entrez la commande suivante. Cela crée une nouvelle CloudFormation pile à l'aide du sample.yaml fichier. Pour plus d'informations, consultez la section Création d'une pile dans le guide de CloudFormation l'utilisateur.

    aws cloudformation create-stack \ --stack-name guardduty-cf-stack \ --template-body file://sample.yaml
  2. Vérifiez que la valeur suivante apparaît dans l'interface de ligne de commande AWS, indiquant que la pile a été créée avec succès. Le temps nécessaire à la création de la pile peut varier.

    "StackStatus": "CREATE_COMPLETE",
AWS DevOps

Validez que cela GuardDuty est activé pour le compte AWS.

  1. Connectez-vous à l'AWS Management Console et ouvrez-la à l' GuardDuty adresse https://console.aws.amazon.com/guardduty/.

  2. Vérifiez que le GuardDuty service est activé.

Administrateur cloud, administrateur AWS

Configurez des comptes ou des régions AWS supplémentaires.

En fonction de votre cas d'utilisation, utilisez la CloudFormation StackSet fonctionnalité AWS pour étendre cette solution à plusieurs comptes AWS et régions AWS. Pour plus d'informations, consultez la section Travailler avec AWS CloudFormation StackSets dans le guide de CloudFormation l'utilisateur.

Administrateur cloud, administrateur AWS

Ressources connexes

Références

Tutoriels et vidéos

Informations supplémentaires

CloudFormation modèle

AWSTemplateFormatVersion: 2010-09-09 Resources: rLambdaLogGroup: Type: 'AWS::Logs::LogGroup' DeletionPolicy: Delete Properties: RetentionInDays: 7 LogGroupName: /aws/lambda/resource-checker rLambdaCheckerLambdaRole: Type: 'AWS::IAM::Role' Properties: RoleName: !Sub 'resource-checker-lambda-role-${AWS::Region}' AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: 'sts:AssumeRole' Path: / Policies: - PolicyName: !Sub 'resource-checker-lambda-policy-${AWS::Region}' PolicyDocument: Version: 2012-10-17 Statement: - Sid: CreateLogGroup Effect: Allow Action: - 'logs:CreateLogGroup' - 'logs:CreateLogStream' - 'logs:PutLogEvents' - 'iam:CreateServiceLinkedRole' - 'cloudformation:CreateStack' - 'cloudformation:DeleteStack' - 'cloudformation:Desc*' - 'guardduty:CreateDetector' - 'guardduty:ListDetectors' - 'guardduty:DeleteDetector' Resource: '*' resourceCheckerLambda: Type: 'AWS::Lambda::Function' Properties: Description: Checks for resource type enabled and possibly name to exist FunctionName: resource-checker Handler: index.lambda_handler Role: !GetAtt - rLambdaCheckerLambdaRole - Arn Runtime: python3.8 MemorySize: 128 Timeout: 180 Code: ZipFile: | import boto3 import os import json from botocore.exceptions import ClientError import cfnresponse guardduty=boto3.client('guardduty') cfn=boto3.client('cloudformation') def lambda_handler(event, context): print('Event: ', event) if 'RequestType' in event: if event['RequestType'] in ["Create","Update"]: enabled=False try: response=guardduty.list_detectors() if "DetectorIds" in response and len(response["DetectorIds"])>0: enabled="AlreadyEnabled" elif "DetectorIds" in response and len(response["DetectorIds"])==0: cfn_response=cfn.create_stack( StackName='guardduty-cfn-stack', TemplateBody='{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample template", "Resources": { "IRWorkshopGuardDutyDetector": { "Type": "AWS::GuardDuty::Detector", "Properties": { "Enable": true } } } }' ) enabled="True" except Exception as e: print("Exception: ",e) responseData = {} responseData['status'] = enabled cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID" ) elif event['RequestType'] == "Delete": cfn_response=cfn.delete_stack( StackName='guardduty-cfn-stack') cfnresponse.send(event, context, cfnresponse.SUCCESS, {}) CheckResourceExist: Type: 'Custom::LambdaCustomResource' Properties: ServiceToken: !GetAtt - resourceCheckerLambda - Arn Outputs: status: Value: !GetAtt - CheckResourceExist - status

Option de code alternative pour la ressource Lambda

Le CloudFormation modèle fourni utilise un code en ligne pour référencer la ressource Lambda, afin de faciliter les références et les conseils. Vous pouvez également placer le code Lambda dans un bucket Amazon Simple Storage Service (Amazon S3) et le référencer dans le modèle. CloudFormation Le code intégré ne prend pas en charge les dépendances de packages ni les bibliothèques. Vous pouvez les prendre en charge en plaçant le code Lambda dans un compartiment S3 et en le référençant dans le modèle. CloudFormation

Remplacez les lignes de code suivantes :

Code: ZipFile: |

avec les lignes de code suivantes :

Code: S3Bucket: <bucket name> S3Key: <python file name> S3ObjectVersion: <version>

La S3ObjectVersion propriété peut être omise si vous n'utilisez pas le versionnement dans votre compartiment S3. Pour plus d'informations, consultez la section Utilisation du versionnement dans les compartiments S3 dans le guide de l'utilisateur d'Amazon S3.