View a markdown version of this page

AWS CloudFormation 템플릿을 사용하여 조건부로 Amazon GuardDuty 활성화 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS CloudFormation 템플릿을 사용하여 조건부로 Amazon GuardDuty 활성화

Ram Kandaswamy, Amazon Web Services

요약

AWS CloudFormation코드형 인프라(IaC) 도구인는 템플릿 기반 배포를 통해 AWS 리소스를 관리하는 데 도움이 됩니다. CloudFormation은 일반적으로 AWS 리소스를 관리하는 데 사용됩니다. 이를 사용하여 Amazon GuardDuty AWS 서비스와 같은를 활성화하면 고유한 문제가 발생할 수 있습니다. GuardDuty는 AWS 계정 악의적인 활동 및 무단 행동을 지속적으로 모니터링하는 위협 탐지 서비스입니다. 여러 번 생성할 수 있는 일반적인 리소스와 달리 GuardDuty는 계정당 한 번 활성화해야 하는 서비스입니다 AWS 리전. 기존 CloudFormation 조건은 정적 값 비교만 지원하므로 GuardDuty와 같은 서비스의 현재 상태를 확인하기가 어렵습니다. 이미 활성 상태인 계정에서 CloudFormation을 통해 GuardDuty를 활성화하려고 하면 스택 배포가 실패합니다. 이렇게 하면 다중 계정 환경을 관리하는 DevOps 팀에 운영 문제가 발생할 수 있습니다.

이 패턴은이 문제에 대한 솔루션을 도입합니다. AWS Lambda 함수가 지원하는 CloudFormation 사용자 지정 리소스를 사용하여 동적 상태 확인을 수행합니다. 조건부 로직은 아직 활성화되지 않은 경우에만 GuardDuty를 활성화합니다. 스택 출력을 사용하여 향후 참조를 위해 GuardDuty 상태를 기록합니다.

이 패턴을 따르면 AWS 인프라 전반의 GuardDuty 배포를 자동화하는 동시에 깔끔하고 예측 가능한 CloudFormation 스택 작업을 유지할 수 있습니다. 이 접근 방식은 다음과 같은 조직에 특히 유용합니다.

  • IaC AWS 계정 를 통해 여러 관리

  • 대규모 보안 서비스 구현

  • 멱등성 인프라 배포 필요

  • 보안 서비스 배포 자동화

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정

  • CloudFormation 스택을 생성, 업데이트 및 삭제할 수 있는 권한이 있는 AWS Identity and Access Management (IAM) 역할

  • AWS Command Line Interface (AWS CLI), 설치구성

제한 사항

AWS 계정 또는에 대해 GuardDuty가 수동으로 비활성화된 경우 AWS 리전이 패턴은 해당 대상 계정 또는 리전에 대해 GuardDuty를 활성화하지 않습니다.

아키텍처

대상 기술 스택

이 패턴은 코드형 인프라(IaC)용 CloudFormation을 사용합니다. Lambda 함수가 지원하는 CloudFormation 사용자 지정 리소스를 사용하여 동적 서비스 지원 기능을 구현할 수 있습니다.

대상 아키텍처

아래의 상위 아키텍처 다이어그램은 CloudFormation 템플릿을 배포하여 GuardDuty를 활성화하는 프로세스를 보여줍니다.

CloudFormation 스택을 사용하여 AWS 계정에서 GuardDuty를 활성화합니다.
  1. CloudFormation 템플릿을 배포하여 CloudFormation 스택을 생성합니다.

  2. 스택은 IAM 역할과 Lambda 함수를 생성합니다.

  3. Lambda 함수는 IAM 역할을 맡습니다.

  4. 대상에서 GuardDuty가 아직 활성화되지 않은 경우 Lambda 함수 AWS 계정가 이를 활성화합니다.

자동화 및 규모 조정

AWS CloudFormation StackSet 기능을 사용하여이 솔루션을 여러 AWS 계정 및 로 확장할 수 있습니다 AWS 리전. 자세한 내용은 CloudFormation 설명서의AWS CloudFormation StackSets 작업을 참조하세요.

도구

  • AWS Command Line Interface (AWS CLI)는 명령줄 셸의 명령을 AWS 서비스 통해와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다.

  • AWS CloudFormation를 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및 리전의 수명 주기 동안 리소스를 관리할 수 있습니다.

  • Amazon GuardDuty는 로그를 분석하고 처리하여 AWS 환경에서 예기치 않고 잠재적으로 승인되지 않은 활동을 식별하는 지속적인 보안 모니터링 서비스입니다.

  • AWS Identity and Access Management (IAM)는 AWS 리소스에 대한 액세스를 인증하고 사용할 권한이 있는 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

에픽

작업설명필요한 기술

Amazon S3에 코드를 저장합니다.

  1. 이 패턴의 추가 정보 섹션에서 Python 코드를 복사합니다.

  2. 텍스트 편집기에 코드를 붙여넣습니다.

  3. 파일을 index.py(으)로 저장합니다.

  4. 파일을 Amazon Simple Storage Service(Amazon S3) 버킷에 업로드합니다. 이에 관한 지침은 Amazon S3 설명서의 객체 업로드를 참조하세요.

DevOps

CloudFormation 템플릿을 생성합니다.

  1. CloudFormation 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 Infrastructure Composer를 선택합니다.

  3. 빈 캔버스가 보이지 않으면 새 프로젝트를 생성합니다.

  4. AWS Lambda 함수를 캔버스로 끌어서 놓습니다.

  5. 템플릿 보기에서 Lambda 함수와 로그 그룹이 있는지 확인합니다.

  6. Lambda 함수Runtime의를 최신 버전의 Python으로 수정합니다.

  7. Handler 속성의 값이 인지 확인합니다. index.lambda_handler.

  8. Python 코드를 업로드한 Amazon S3 위치로 CodeUri 속성을 구성합니다. 예시 값은 s3://amzn-s3-demo-bucket/key-name입니다.

  9. 리소스에 대한 Policies 속성을 추가합니다. 보안 모범 사례에 따라 CloudFormation 및 GuardDuty 작업을 허용하는 최소 권한 액세스 권한을 제공합니다. 예를 들어 로그에는 AWSLambdaExecute 관리형 정책을 사용하고 GuardDutyiam:CreateServiceLinkedRole에는 사용자 지정를 사용할 수 있습니다.

  10. 템플릿 보기로 이동하여 코드 조각에 사용자 지정 리소스 정의를 추가합니다.

    CheckResourceExist: Type: 'Custom::LambdaCustomResource' Properties: ServiceToken: !GetAtt Function.Arn
  11. 템플릿을 로 저장합니다sample.yaml.

DevOps

CloudFormation 스택을 생성하세요.

  1. 에 다음 명령을 AWS CLI입력합니다. 그러면 sample.yaml 파일을 사용하여 새 CloudFormation 스택이 생성됩니다. 자세한 내용은 스택 생성(CloudFormation 설명서)을 참조하세요.

    aws cloudformation create-stack \ --stack-name guardduty-cf-stack \ --template-body file://sample.yaml
  2. 스택이 성공적으로 생성되었음을 AWS CLI나타내는 다음 값이에 나타나는지 확인합니다. 스택을 생성하는 데 필요한 시간은 다를 수 있습니다.

    "StackStatus": "CREATE_COMPLETE",
DevOps

AWS 계정에 GuardDuty가 활성화되어 있는지 확인합니다.

  1. 에 로그인 AWS Management Console 하고 GuardDuty 콘솔을 엽니다.

  2. GuardDuty 서비스가 활성화되어 있는지 확인합니다.

클라우드 관리자, AWS 관리자

추가 계정 또는 리전을 구성합니다.

사용 사례에 필요한 경우 CloudFormation StackSet 기능을 사용하여이 솔루션을 여러 AWS 계정 및 로 확장합니다 AWS 리전. 자세한 내용은 CloudFormation 설명서의AWS CloudFormation StackSets 작업을 참조하세요.

클라우드 관리자, AWS 관리자

관련 리소스

참조

자습서 및 동영상

추가 정보

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, {})