Habilite a Amazon GuardDuty condicionalmente usando modelos AWS CloudFormation - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Habilite a Amazon GuardDuty condicionalmente usando modelos AWS CloudFormation

Ram Kandaswamy, Amazon Web Services

Resumo

AWS CloudFormation, uma ferramenta de infraestrutura como código (IaC), ajuda você a gerenciar AWS recursos por meio de implantações baseadas em modelos. CloudFormation normalmente é usado para gerenciar AWS recursos. Usá-lo para habilitar Serviços da AWS, como a Amazon GuardDuty, pode apresentar desafios únicos. GuardDuty é um serviço de detecção de ameaças que monitora continuamente suas Contas da AWS atividades maliciosas e comportamentos não autorizados. Ao contrário dos recursos típicos que podem ser criados várias vezes, GuardDuty é um serviço que precisa ser ativado uma vez por conta Região da AWS e. CloudFormation As condições tradicionais oferecem suporte apenas a comparações de valores estáticos, o que dificulta a verificação do estado atual de serviços como o. GuardDuty Se você tentar fazer a ativação GuardDuty CloudFormation em uma conta em que ela já está ativa, a implantação da pilha falhará. Isso pode criar desafios operacionais para DevOps equipes que gerenciam ambientes com várias contas.

Esse padrão apresenta uma solução para esse desafio. Ele usa recursos CloudFormation personalizados que são apoiados por AWS Lambdafunções para realizar verificações dinâmicas de estado. A lógica condicional é ativada GuardDuty somente se ainda não estiver ativada. Ele usa as saídas da pilha para registrar o GuardDuty status para referência futura.

Seguindo esse padrão, você pode automatizar as GuardDuty implantações em toda a sua AWS infraestrutura e, ao mesmo tempo, manter as operações de CloudFormation pilha limpas e previsíveis. Essa abordagem é particularmente valiosa para organizações que são:

  • Gerenciando vários Contas da AWS por meio do IaC

  • Implementando serviços de segurança em grande escala

  • Exigindo implantações de infraestrutura idempotentes

  • Automatizando implantações de serviços de segurança

Pré-requisitos e limitações

Pré-requisitos

  • Um ativo Conta da AWS

  • Uma função AWS Identity and Access Management (IAM) que tem permissões para criar, atualizar e excluir CloudFormation pilhas

  • AWS Command Line Interface (AWS CLI), instalado e configurado

Limitações

Se GuardDuty tiver sido desativado manualmente para um Conta da AWS ou Região da AWS, esse padrão não é ativado GuardDuty para essa conta ou região de destino.

Arquitetura

Pilha de tecnologias de destino

O padrão é usado CloudFormation para infraestrutura como código (IaC). Você usa um recurso CloudFormation personalizado apoiado por uma função Lambda para obter a capacidade dinâmica de habilitação de serviços.

Arquitetura de destino

O diagrama de arquitetura de alto nível a seguir mostra o processo de habilitação GuardDuty por meio da implantação de um CloudFormation modelo:

Usando uma CloudFormation pilha para habilitar GuardDuty em uma conta da AWS.
  1. Você implanta um CloudFormation modelo para criar uma CloudFormation pilha.

  2. A pilha cria um perfil do IAM e uma função do Lambda.

  3. A função do Lambda assume o perfil do IAM.

  4. Se ainda não GuardDuty estiver habilitado no destino Conta da AWS, a função Lambda o habilita.

Automação e escala

Você pode usar o AWS CloudFormation StackSet recurso para estender essa solução para vários Contas da AWS Regiões da AWS e. Para obter mais informações, consulte Trabalhando com AWS CloudFormation StackSets na CloudFormation documentação.

Ferramentas

  • AWS Command Line Interface (AWS CLI) é uma ferramenta de código aberto que ajuda você a interagir Serviços da AWS por meio de comandos em seu shell de linha de comando.

  • AWS CloudFormationajuda você a configurar AWS recursos, provisioná-los de forma rápida e consistente e gerenciá-los em todo o ciclo de vida em todas Contas da AWS as regiões.

  • GuardDutyA Amazon é um serviço contínuo de monitoramento de segurança que analisa e processa registros para identificar atividades inesperadas e potencialmente não autorizadas em seu AWS ambiente.

  • AWS Identity and Access Management (IAM) ajuda você a gerenciar com segurança o acesso aos seus AWS recursos controlando quem está autenticado e autorizado a usá-los.

  • O AWS Lambda é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.

Épicos

TarefaDescriptionHabilidades necessárias

Armazene o código no Amazon S3.

  1. Copie o código Python na seção Informações adicionais desse padrão.

  2. Cole o código em um editor de textos.

  3. Salve o arquivo como index.py.

  4. Faça upload do arquivo para um bucket do Amazon Simple Storage Service (Amazon S3) Para obter instruções, consulte Fazer uploads de objetos na documentação do Amazon S3.

AWS DevOps

Crie o CloudFormation modelo.

  1. Abra o console do CloudFormation .

  2. No painel de navegação esquerdo, escolha Infrastructure Composer.

  3. Se você não vê uma tela em branco, crie um novo projeto.

  4. Arraste e solte uma AWS Lambda função na tela.

  5. Na visualização do modelo, valide se uma função Lambda e um grupo de registros estão presentes.

  6. Modifique Runtime a função Lambda para a versão mais recente do Python.

  7. Valide se a Handler propriedade tem valor de index.lambda_handler.

  8. Configure a CodeUri propriedade para ser o local do Amazon S3 onde você fez o upload do código Python. Um exemplo de valor é s3://amzn-s3-demo-bucket/key-name.

  9. Adicione uma Policies propriedade para o recurso. Siga as melhores práticas de segurança para fornecer permissões de acesso com privilégios mínimos que permitam GuardDuty ações CloudFormation e ações. Por exemplo, você pode usar a política AWSLambdaExecute gerenciada para registros e uma política personalizada iam:CreateServiceLinkedRole para GuardDuty.

  10. Adicione uma definição de recurso personalizada ao trecho navegando até a visualização do modelo.

    CheckResourceExist: Type: 'Custom::LambdaCustomResource' Properties: ServiceToken: !GetAtt Function.Arn
  11. Salve o modelo comosample.yaml.

AWS DevOps

Crie a CloudFormation pilha.

  1. No AWS CLI, insira o seguinte comando. Isso cria uma nova CloudFormation pilha usando o sample.yaml arquivo. Para obter mais informações, consulte Criação de uma pilha na CloudFormation documentação.

    aws cloudformation create-stack \ --stack-name guardduty-cf-stack \ --template-body file://sample.yaml
  2. Confirme se o valor a seguir aparece no AWS CLI, indicando que a pilha foi criada com sucesso. A quantidade de tempo necessária para criar a pilha pode variar.

    "StackStatus": "CREATE_COMPLETE",
AWS DevOps

Valide se GuardDuty está habilitado para o. Conta da AWS

  1. Faça login no Console de gerenciamento da AWS e abra o GuardDuty console.

  2. Verifique se o GuardDuty serviço está ativado.

Administrador de nuvem, administrador da AWS

Configure contas ou regiões adicionais.

Conforme necessário para seu caso de uso, use o CloudFormation StackSet recurso para estender essa solução para vários Contas da AWS Regiões da AWS e. Para obter mais informações, consulte Trabalhando com AWS CloudFormation StackSets na CloudFormation documentação.

Administrador de nuvem, administrador da AWS

Recursos relacionados

Referências

Tutoriais e vídeos

Mais informações

Código Python

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": "Guard duty creation 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, {})