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

Glen·2023년 8월 27일
0

aws security workshop

목록 보기
10/10

위협 탐지를 위한 대시보드

  • Opensearch Dashboard의 다양한 데이터 분석과 시각화 기능을 통해 로그 탐색부터 대시보드 구성을 진행한다.
  • 내장된 Alerting 기능을 통해 다양한 외부 채널과 연동하여 알람을 구성

로그 탐색

  • 조회되는 각 도큐먼트의 좌측 드롭다운 버튼을 누르면 좀더 자세히 살펴볼 수 있다.
  • 특정 필드에 대해 검색하기 위해 key-value형태로 조회.
    - "eventSource":"s3.amazonaws.com"

시각화 해보기

    1. Pie chart
    1. Horizontal bar
    1. Line Chart
    1. Tag Cloud
    1. 누적 막대그래프
    1. 데이터 테이블
  • 각 인덱스별 보안 로그를 활용하여 시각화

1. pie chart(cloudtrail Log 이용)

  • visualizaion > create > pie 선택
  • 인덱스 패턴은 cwl-* 선택
  • Metrics는 카운트/평균값/최소값/최대값등을 선택할수있음.
  • buckets은 특정 기준으로 데이터를 나누는 역할을 함.
  • buckets add 클릭
  • 필드의 유니크한 값을 기준으로 구분하여 집계하기 위해 [Terms]를 선택
  • 필드는 어떤 API 호출인지 확인하기 위해 [eventName.keyword]를 선택
  • show labels 활성화 후 update하고 저장
    - save name : CloudTrail-Top5event
  • pie chart 완성

2. horizontal bar 만들기

  • 인덱스패턴은 동일하게 cwl-* 선택
  • buckests에서 x-axis를 add
  • 아래와 같이 설정
  • panel setting에서 show value 선택후 저장
    - save : CloudTrail-Top5Regions

3. 라인 차트 만들기(WAF log활용)

  • 라인 차트 선택
  • 인덱스 패턴을 aws-waf-* 선택
  • x-axis를 선택하고 아래 스크린샷과 같이 설정
    • Aggregation : Date Histogram,
    • Field: timestamp
    • Minimum interval : Minute
  • 그래프가 잘 안나타나면 상단에 시간을 변경.
  • 현재는 모든 Request를 Count하도록 되어 있기 때문에 Allow, Block 여부를 구분하기 위해 Sub-Bucket을 추가

  • 라인 차트 완성
    - save : WAF-Allowed and Blocked Request

4. 태그 클라우드 만들기(DNS Log활용)

  • 태그 클라우드 선택
  • 인덱스 패턴을 aws-dns-logs-* 선택
  • buckets add를 아래와 같이 설정
  • AWS 내부 DNS 호출을 제외시키고 싶다면 Filter를 사용
  • 태그클라우드 완성
    - save : DNS Names

5. 누적 막대그래프 만들기 (Security hub log 활용)

  • vertical bar
  • aws-securityhub-findings-logs-*
  • 누적그래프를 표현하기때문에 y축의 aggregation을 cumulative sum으로 변환
  • Buckets를 추가하기 위해 add를 클릭하고 Split series
  • detail.findings.Severity선택
  • 맨 하단의 add를 클릭하여 sub-bucket으로 x축 설정
    • Sub aggregation은 Date Histogram
    • Field는 time
    • Minimum interval은 분으로 설정
      • log가 쌓인지 얼마 되지 않아서 구분된 그래프를 보기 위해 분으로 설정.
  • Panel settings 탭을 클릭하고 Show values on chart 활성

6. 데이터 테이블 만들기 (SecurityHub log 활용)

  • 데이터테이블
  • aws-securityhub-findings-logs-*
  • Buckets >Split rows를 클릭.
    - Aggregation은 Terms, Field는 detail.findings.ProductName.keyword
  • sub-bucket을 3개 생성
    - Split rows >**detail.findings.Types.keyword , detail.findings.Severity.Label.keyword,** detail.findings.Description.keyword
  • 규정 준수 상태가 Failed인 경우만 확인할 것이기 때문에 필터를 적용합니다.
    - Field는 detail.findings.Compliance.Status.keyword
    - Operator는 is
    - Value는 FAILED로 설정
  • 심각도가 Critical, High, Medium만 볼 수 있도록 필터 적용
    - Field는 detail.findings.Severity.Label.keyword
    - Operator는 is one of
    - Values는 MEDIUMHIGHCRITICAL 세 가지를 클릭
  • data table 결과를 보기 좋게 다듬겠습니다. 데이터 테이블의 필드명이 너무 길기 때문에 Custom label를 설정하여 간결하게 수정하겠습니다
  • 첫번째 버킷의 Custom label을 Product name, 두번째 버킷의 custom label을 Compliance type, 세번째 버킷의 custom label을 Severity, 네번째 버킷을 Description으로 작성 후 우측 하단의 Update를 눌러 반영합니다.

  • Count 기준으로 내림차순 정렬하기 위해 Count 열을 클릭합니다. 그리고 한 페이지에 너무 많은 목록이 노출되므로 Options탭으로 이동해 페이지당 5개 로우만 보이도록 설정하며, 각 항목 개수에 대한 비율을 표현하기 위해 Percentage column을 Count로 설정합니다. 완성된 데이터 테이블을 확인하고 우측 상단의 Save를 클릭한 뒤, 생성한 Visualize를 구별할 수 있도록 이름을 작성한 뒤 저장합니다.

대시보드 구성하기

  • add an existing 또는 오른쪽 상단 add 클릭
  • cloudtrail으로 검색된 두개 각각 클릭
  • 대시보드 상단 부분 클릭하여 위치 변경 가능
  • 왼쪽 상단의 add를 클릭하여 waf와 dns도 추가
    - 이런식으로 앞서 생성했던 차트들을 대시보드에 등록
    - 분석에 필요한 로그들을 가시성있게 구성하는것이 관건 일듯

경고 알림 설정

  • OpenSearch 대시보드에는 알림 기능의 플러그인이 있음. 데이터가 특정 상태를 충족하면 알림을 발송가능
  • Slack, 커스텀 웹훅, Amazon Chime, SNS, Email, lambda 등으로 알림을 보낼수있음.

SNS 설정

  • SNS을 생성한다. 표준 선택
  • 생성후 구독생성 클릭
  • 구독 부분에 주제를 선택하고 프로토콜은 이메일
  • 적어논 메일로 승인 메일이 왔으면 확인 후 승인

OpenSearch가 SNS에 메시지를 게시할 수 있는 권한 부여하기

  • 권한이 있어야 알람 발송이 가능. IAM Role을 생성해보자.

  • 사용자 지정 신뢰정책으로 해당 정책 추가

  • 권한 추가. 정책 생성을 누르고 똑같이 복붙
  • demogo-alert-sns-policy로 생성
  • 위에서 생성한 정책을 역할에 추가.
  • name : demogo-alert-sns-role
  • 생성된 arn 복사

Alerting 설정

  • Destination 추가
  • Edit destination
  • 앞서 생성했던 SNS와 IAM의 ARN을 추가
  • 어떤걸 모니터링할껀지 추가
  • SQL Injection 공격에 대한 모니터를 구성
  • data source는 aws-waf-logs-*로
  • query
    {
        "size": 1,
        "query": {
            "bool": {
                "filter": [
                    {
                        "range": {
                            "timestamp": {
                                "from": "{{period_end}}||-5m",
                                "to": "{{period_end}}",
                                "include_lower": true,
                                "include_upper": true,
                                "format": "epoch_millis",
                                "boost": 1
                            }
                        }
                    },
                    {
                        "match_phrase": {
                            "terminatingRuleId": {
                                "query": "AWS-AWSManagedRulesSQLiRuleSet",
                                "slop": 0,
                                "zero_terms_query": "NONE",
                                "boost": 1
                            }
                        }
                    }
                ],
                "adjust_pure_negative": true,
                "boost": 1
            }
        },
        "aggregations": {}
    }

  • 아래와 같이 동작을 설정함
  • 목적지는 앞에서 생성한것, subject, message
  • 메시지 제목과 본문은 Mustache 문법을 따름.
  • 우측에 Send test message를 눌러서 테스트 알람 발송가능. 단, Query를 Run했을때 조회된 건수가 존재해야지만 Mustache문법 내에 ctx값을 불러올 수 있음.
  • 지난 5분 간 SQLi 공격이 없었다면 테스트 발송 시 Mustache 에러가 발생.

리포트 생성하기

  • Notebook을 활용하면 Reporting을 템플릿화하여 정기적으로 생성가능

  • Code block에는 MarkDown, SQL, PPL(Piped processsing language)를 입력.
  • 실습에서는 MarkDown으로 작성. 아래 내용을 복사하여 붙여넣고 Run을 클릭
  • Add paragraph를 클릭하고 Visualization을 클릭
  • 기존에 생성했던 TopRegions를 찾아서 선택하고 Date range는 지난 1주일로 세팅


  • 이와 같은 과정을 반복하여 원하는 형태의 보고서 템플릿을 작성할 수 있음.
  • 상단의 Reporting actions를 클릭하고 Download PDF를 누르면 PDF파일로 다운로드 받을 수 있음.
    - 테스트 해봤을때는 파일크기 0으로 안되긴함..

정기보고서 생성

  • 규칙적인 일정을 정해서 report 추출 가능.
    • mail이나 slack같은 곳에 주기적으로 공유 해도 될거같고…
    • lambda같은걸로 이용해서 s3에 업로드 하고 web으로 보는것도 괜찮을듯?
  • report definition


보안위협 탐지 시나리오

CryptoCurrency Mining Activity

  • 비트코인 도메인을 호출하였을 때 GuardDuty를 활용한 위협 탐지 테스트

  • EC2에 접속해서 해당명령을 실행

    echo "Calling bitcoin wallets to download mining toolkits"
    curl -s http://pool.minergate.com/dkjdjkjdlsajdkljalsskajdksakjdksajkllalkdjsalkjdsalkjdlkasj  > /dev/null &
    curl -s http://xmr.pool.minergate.com/dhdhjkhdjkhdjkhajkhdjskahhjkhjkahdsjkakjasdhkjahdjk  > /dev/null &
  • guardduty에서 로그 확인
    - 시간 좀 걸림…

다수의 비정상적인 로그인 시도 탐지하기

  • AWS Login페이지 (https://alais.signin.aws.amazon.com/console ) 에서 계정 ID(Account ID), 사용자 이름(IAM User)을 입력하고, 틀린 비밀번호를 입력
    - AWS Manage Console에서 URL의 가장 앞부분이 ap-northeat-2인 것을 확인
  • Cloudtrail에서 로그인 시도 로그 확인
  • 이벤트 클릭해서 실패한 기록 확인
  • Opensearch에서 아래와같이 검색했을때에도 확인할 수 있다.
    - eventName:ConsoleLogin

SQL Injection 공격 탐지하기

  • 배포되어있는 alb의 주소 확인

  • 배포되어있는 ec2 인스턴스에 ssm으로 접속한다.

  • SQL Injection attack test

  • ALB_URL을 위에서 확인한 도메인주소로 변경하여 curl을 날린다

    ```bash
    curl -X POST http://$ALB_URL -F "user='AND 1=1;" 
    curl -X POST http://$ALB_URL -F "user='<script><alert>Hello></alert></script>'"
    ```

  • OpenSearch에서 SQL Injection 공격이 waf에서 차단된 log를 확인 할 수 있다.
profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글