실습 목표
- 직접 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/*"
}
]
}



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

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)
ts = j['timestamp']
ts /= 1000
timestamp = datetime.utcfromtimestamp(ts).strftime('%Y-%m-%dT%H:%M:%S.%f+0000')
j['timestamp'] = timestamp
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 확인
- 인덱스 패턴을 생성한다

- 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
