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.
Habilite Amazon de GuardDuty forma condicional mediante plantillas de AWS CloudFormation
Creado por Ram Kandaswamy (AWS)
Entorno: producción | Tecnologías: seguridad, identidad, cumplimiento; operaciones DevOps | Servicios de AWS: AWS CloudFormation; Amazon GuardDuty; AWS Lambda; AWS Identity and Access Management |
Resumen
Puede activar Amazon GuardDuty en una cuenta de Amazon Web Services (AWS) mediante una CloudFormation plantilla de AWS. De forma predeterminada, si ya GuardDuty está habilitada cuando intentas CloudFormation activarla, se produce un error en la implementación de la pila. Sin embargo, puedes usar las condiciones de tu CloudFormation plantilla para comprobar si ya GuardDuty está habilitada. CloudFormation admite el uso de condiciones que comparen valores estáticos; no admite el uso de la salida de otra propiedad de recurso dentro de la misma plantilla. Para obtener más información, consulte las condiciones en la guía CloudFormation del usuario.
En este patrón, utiliza un recurso CloudFormation personalizado respaldado por una función de AWS Lambda para habilitarlo de forma condicional GuardDuty si aún no está habilitada. Si GuardDuty está habilitada, la pila captura el estado y lo registra en la sección de salida de la pila. Si no GuardDuty está activado, la pila lo habilita.
Requisitos previos y limitaciones
Requisitos previos
Una cuenta de AWS activa
Un rol de AWS Identity and Access Management (IAM) con permisos para crear, actualizar y eliminar pilas CloudFormation
Limitaciones
Si se GuardDuty ha desactivado manualmente para una cuenta o región de AWS, este patrón no se habilita GuardDuty para esa cuenta o región de destino.
Arquitectura
Pila de tecnología de destino
El patrón utiliza CloudFormation Infrastructure as Code (IaC). Utiliza un recurso CloudFormation personalizado respaldado por una función Lambda para lograr la capacidad de habilitación dinámica de servicios.
Arquitectura de destino
El siguiente diagrama de arquitectura de alto nivel muestra el proceso de habilitación GuardDuty mediante la implementación de una plantilla: CloudFormation
Se despliega una CloudFormation plantilla para crear una CloudFormation pila.
La pila crea un rol de IAM y una función de Lambda.
La función de Lambda asume el rol de IAM.
Si aún no GuardDuty está habilitada en la cuenta de AWS de destino, la función Lambda la habilita.
![El proceso de habilitación GuardDuty mediante la implementación de una plantilla CloudFormation](images/pattern-img/3abd7cb7-0937-41fe-8eaa-79aedb182732/images/b2d81a61-31f7-4cb9-9de3-f7db1b92ccd9.png)
Automatizar y escalar
Puede utilizar la CloudFormation StackSet función de AWS para extender esta solución a varias cuentas y regiones de AWS. Para obtener más información, consulte Trabajar con AWS CloudFormation StackSets en la guía del CloudFormation usuario.
Herramientas
La interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en su intérprete de comandos de línea de comandos.
AWS le CloudFormation ayuda a configurar los recursos de AWS, aprovisionarlos de forma rápida y coherente y gestionarlos durante todo su ciclo de vida en todas las cuentas y regiones de AWS.
Amazon GuardDuty es un servicio de supervisión continua de la seguridad que analiza y procesa los registros para identificar actividades inesperadas y potencialmente no autorizadas en su entorno de AWS.
AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos.
AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Crea la CloudFormation plantilla. |
| AWS DevOps |
Crea la CloudFormation pila. |
| AWS DevOps |
Valide que GuardDuty esté habilitado para la cuenta de AWS. |
| Administrador de la nube, administrador de AWS |
Configure cuentas o regiones de AWS adicionales. | Según sea necesario para su caso de uso, utilice la CloudFormation StackSet función de AWS para extender esta solución a varias cuentas de AWS y regiones de AWS. Para obtener más información, consulte Trabajar con AWS CloudFormation StackSets en la guía del CloudFormation usuario. | Administrador de la nube, administrador de AWS |
Recursos relacionados
Referencias
Tutoriales y videos
Simplifique la administración de la infraestructura con AWS CloudFormation
(tutorial) Utilice Amazon GuardDuty y AWS Security Hub para proteger varias cuentas
(AWS re:Invent 2020) Prácticas recomendadas para la creación de AWS CloudFormation (AWS
re:Invent 2019) Detección de amenazas en AWS: introducción a Amazon GuardDuty
(AWS Re:inForce 2019)
Información adicional
CloudFormation plantilla
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
Opción de código alternativa para el recurso Lambda
La CloudFormation plantilla proporcionada utiliza código en línea para hacer referencia al recurso de Lambda, a fin de facilitar la consulta y la orientación. Como alternativa, puede colocar el código Lambda en un bucket de Amazon Simple Storage Service (Amazon S3) y hacer referencia a él en la plantilla. CloudFormation El código en línea no admite bibliotecas ni dependencias de paquetes. Para respaldarlas, coloque el código Lambda en un bucket de S3 y haga referencia a él en la plantilla. CloudFormation
Sustituya las siguientes líneas de código:
Code: ZipFile: |
con las siguientes líneas de código:
Code: S3Bucket: <bucket name> S3Key: <python file name> S3ObjectVersion: <version>
La propiedad S3ObjectVersion
se puede omitir si no usa control de versiones en su bucket de S3. Para más información, consulte Uso de control de versiones en buckets de S3 en la guía de usuario de Amazon S3.