AWS Security Workshop - AWS서비스로 SIEM 구축하기(1)

Glen·2023년 8월 27일
0

aws security workshop

목록 보기
9/10

실습 목표

  • 직접 Hands On을 통해 아래의 아키텍처를 완성 한다.

사전 실습 환경

  • CloudFormation으로 배포된 AWS 리소스들
    • 이후 실습을 통해 하나씩 로그 통합 파이프라인을 구축한다.

OpenSearch 보안구성 수정

  • 도메인수준 액세스정책 구성 부분을 수정한다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-2:계정번호:domain/demogo-opensearch/*"
    }
  ]
}

  • 대시보드 url 이미지

  • 제공된 계정으로 로그인
    • 패스워드 이후 수정

보안 로그 통합 및 파이프라인 구축

  • 아래 순서대로 파이프라인을 구축해본다.

CloudTrail

  • AWS 계정의 운영 및 위험 감사, 거버넌스 및 규정 준수를 활성화하는 데 도움이 되는 서비스.
  • 사용자, 역할 또는 AWS 서비스가 수행하는 작업은 CloudTrail에 이벤트로 기록.
    • 이벤트에는 AWS Management Console, AWS Command Line Interface 및 AWS SDK, API에서 수행되는 작업들이 포함됨

CloudTrail to OpenSearch

  • CloudTrail → CloudWatch → Lambda → OpenSearch 의 과정을 거친다.

Cloudtrail 추적 생성하기

  • 아래와 같이 생성
    - 버킷은 cloudformation으로 미리 생성됨.
  • cloudwatch log를 활성화한다.
  • 관리 이벤트, 데이터 이벤트를 선택하고, 관리 이벤트 또한 읽기와 쓰기 모두 선택
  • 데이터 이벤트 유형은 S3를 선택하고, 로그 선택기 템플릿은 모든 이벤트 로깅을 선택

CloudWatch 설정

IAM 생성

정책

  • cloudwatch에서 opensearch로 데이터를 전송하기 위해서는 중간에 lambda가 필요.
    • lambda가 opensearch의 권한을 가지고있어야함.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "es:*",
            "Resource": "arn:aws:es:ap-northeast-2:<account id>:domain/demogo-opensearch/*"
        }
    ]
}

역할

  • 역할 만들기 > AWS 서비스, Lambda를 선택
  • 앞서 생성한 정책을 할당

OpenSearch 구독필터 설정

  • 생성한 로그그룹의 구독필터 탭에서 OpenSearch service 구독필터 생성을 클릭
  • 앞서 생성한것들을 할당
  • 로그 형식은 Amazon CloudTrail, 구독 필터 이름에는 demogo-cloudtrail
  • 구독필터를 생성하면 아래 lambda가 자동으로 생성됨

OpenSearch에 권한 추가

  • security > Roles > all_access 선택
  • mapped users 탭에서 add
  • iam role arn을 추가

OpenSearch에서 CloudTrail 확인

  • Index Pattern을 생성 한다
  • Index pattern name에 cwl-* 을 입력
  • time field는 everytime으로.
  • discover 탭에서 생성한 인덱스패턴으로 로그를 확인할 수 있다.

Route53 DNS Log

  • 수신하는 퍼블릭 DNS 쿼리에 대한 정보를 로깅하도록 Amazon Route 53을 구성
    • 요청된 도메인 또는 하위 도메인
    • 요청의 날짜 및 시간
    • DNS 레코드 유형(예: A 또는 AAAA)
    • DNS 쿼리에 응답한 Route 53 엣지 로케이션
    • DNS 응답 코드(예: NoError 또는 ServFail)

DNS Log to OpenSearch

  • Route53 DNS Log → Kinesis Data Firehose → OpenSearch 과정을 거침

Kinesis Data Firehose 생성하기

  • 실시간 데이터 처리가 가능한 데이터 저장소.
    • kafka의 broker와 역할과 구조가 유사
  • 소시는 direct put, 대상은 OpenSearch 선택
  • Opensearch 도메인은 찾아보기로 선택
  • 인덱스는 Opensearch에서 인덱스패턴을 만들때 사용하기때문에 알아보기 편하도록 지정
  • 버퍼부분은 비용을 잘 생각하여 지정
  • s3는 미리 만들어진 “demogo-kdf-backup”을 선택
    - 이후 KDF관련 백업은 모두 동일하기 때문에 생략.

Route53 DNS Log 활성화

  • Route53 쿼리로깅 탭에서 쿼리로깅 구성 클릭
  • 전송스트림은 앞서 만든 kdf 로 지정
  • 쿼리를 기록할 vpc를 선택
    - 실습에서 생성된 demogo-vpc 선택.

OpenSearch에서 DNS Log 확인

  • kdf 구성부분에 iam 확인
  • Opensearch all_access 에 role mapping
  • 패턴 추가
    - kinesis 만들때 지정한 인덱스 패턴으로 지정
  • time field는 query_timestamp
  • discover에서 지정한 인덱스패턴으로 DNS log 확인

WAF

  • 가용성에 영향을 주거나, 보안을 위협하거나, 리소스를 과도하게 사용하는 일반적인 웹 공격으로부터 웹 애플리케이션이나 API를 보호하는 데 도움이 되는 서비스.

WAF to OpenSearch

  • AWS WAF → Kinesis Data Firehose + Lambda → OpenSearch 과정을 거침

KDF 데이터 스트림 생성

  • 데이터 변환 활성화 선택
  • lambda는 미리 생성된 “demogo-waf-log-to-opensearch” 선택
    • waf log to lambda
      import json
      from datetime import datetime
      import base64
      
      def lambda_handler(event, context):
          output = []
      
          for record in event['records']:
              payload = base64.b64decode(record['data']).decode('utf-8')
              j = json.loads(payload)
      
              # Do custom processing on the payload here
              # print(payload)
              ts = j['timestamp']
              ts /= 1000
      
              timestamp = datetime.utcfromtimestamp(ts).strftime('%Y-%m-%dT%H:%M:%S.%f+0000')
      
              j['timestamp'] = timestamp
      
              # j['action'] = 'BLOCK'
      
              payload = json.dumps(j)
      
              output_record = {
                  'recordId': record['recordId'],
                  'result': 'Ok',
                  'data': base64.b64encode(payload.encode('utf-8')).decode('utf-8')
              }
              output.append(output_record)
      
          print('Successfully processed {} records.'.format(len(event['records'])))
      
          return {'records': output}

  • opensearch 도메인은 찾아보기로 선택
  • 버퍼크기 알맞게 선택
  • kdf 생성 후 opensearch에 권한 추가하기 위해 iam arn 복사
  • 앞서 진행했던것과 같이 all_access에 권한 추가

Opensearch에서 WAF Log 확인

  • Web ACL > Logging 메뉴에서 활성화
  • log data는 앞서 생성한 KDF로 설정
  • WAF Log가 쌓여있지 않기 때문에 WAF와 연결되어있는 webserver에 트래픽을 발생
    - 해당 웹사이트 여러번 새로고침.
  • Index pattern 추가
    - 시간 조금 걸림.
  • timefield는 timestamp
  • Discover를 통해 WAF Log 확인

VPC FlowLog

  • VPC의 네트워크 인터페이스에서 IP 트래픽에 대한 정보를 수집할 수 있는 기능.
  • FlowLog 데이터는 CloudWatch Logs 또는 Amazon S3에 저장가능.

FlowLog를 to OpenSearch

  • VPC FlowLog → Kinesis Data Firehose + Lambda → OpenSearch 과정을 거

KDF 생성하기

  • Direct put , opensearch 선택
  • 인덱스는 OpenSearch에서 패턴 지정할때 사용.

VPC FlowLog 생성

  • Flowlog를 생성을 해야 수집할수있다.
  • 원하는 VPC를 선택하여 플로우 로그를 생성
  • 설정에서 알맞는 값들 선택
  • 플로우로그를 게시할 대상으로 생성한 KDF 선택
  • OpenSearch에 KDF IAM ARN 추가

OpenSearch에서 VPC FlowLog 확인

  • 인덱스 패턴을 생성한다
  • 그러나 Primary time field를 선택하는 드랍박스가 나타나지 않는다.

    • 이유는 VPC FlowLog의 시간타입과 OpenSearch에서 인지하는 시간타입이 맞지 않기때문
    • VPC FlowLog의 시간타입을 일반적인 tiemstamp형식으로 변경해주는 레코드 변환 작업이 필요
    • Lambda를 이용하여 레코드 변환 작업을 진행
  • KDF 구성 > 레코드변환 편집

  • lambda는 미리 생성된 demogo-vpc-flow-log-to-opensearch 선택

기존 VPC FlowLog 제거

  • timestamp 변형하기 전 log를 Dev Tools에서 명령어 실행하여 제거
  • 이후 인덱스패턴을 아까와 같이 생성해보면 timefield 선택이 활성화됨
  • start로 지정
  • VPC FlowLog 확인

Security Hub

  • 아래와 같은 구조로 보안서비스 로그 통합 및 데이터 파이프라인 구축을 진행

AWS Config

  • Config는 리소스에 대한 규칙 및 규정준수상태를 확인할 수 있다.
  • 시작하기 > 단계2 규칙 부분에서 오른쪽 상단의 톱니바퀴 클릭
  • 페이지 크기를 50으로 늘리고 모두 선택

Security hub

  • 활성화 클릭

Guardduty

  • 활성화 클릭
  • 대시보드 설정 > 결과 내보내기 옵션을 15분으로 설정

Kinesis Data Firehose 생성

  • 생성방법은 앞서 진행했던것과 동일함
  • 인덱스 부분만 잘 설정

EventBridge에서 Security Hub 이벤트 로그 전송

  • security hub에서는 바로 KDF로 보내지 못하고 eventbridge를 이용해서 전송해야함.
  • 이벤트 패턴은 아래와 같이 설정
    - 이렇게 AWS 계정 ID, 제품 ARN, 심각도 레이블 등의 기준으로 이벤트 패턴을 필터링하는 경우 OpenSearch에 저장되는 Index도 별도로 생성되어야 함.
    - 그렇지 않을 경우 데이터 혼합, 중복등의 문제가 발생할 수 있음. 따라서 Kinesis Data Firehose를 각각의 이벤트 패턴별로 생성하는 방법 등을 고려하여야 함
  • 대상을 KDF로 선택

OpenSearch 권한 추가

  • KDF의 IAM을 all_access에 mapping
    • 이미지 생략.

Guardduty Sample 데이터 생성하기

  • 설정 > 샘플결과 작성 클릭
  • 결과 탭에서 확인
    - 샘플 결과여도 해당 결과들이 securityhub로 수집된다.

OpenSearch 인덱스 생성 및 데이터 확인

  • aws-securityhub-findings-logs*로 인덱스 패턴 생성
  • CreatedAt 선택
  • discover에서 SecurityHub 로그 확인
  • 샘플로 생성했던 guardduty도 확인
    - Eventbridge에서 detail.findings의 서비스 ARN을 지정하면 각 AWS 서비스별 패턴마다 확인하기 쉬워질듯.
    - arn:aws:securityhub:ap-northeast-2::product/aws/config
    - arn:aws:securityhub:ap-northeast-2::product/aws/guardduty
profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글