실습 목표
- 직접 Hands On을 통해 아래의 아키텍처를 완성 한다.
![](https://velog.velcdn.com/images/dotlike/post/738eabc1-9fba-4c90-8555-0f3748e6ec2c/image.png)
사전 실습 환경
- CloudFormation으로 배포된 AWS 리소스들
- 이후 실습을 통해 하나씩 로그 통합 파이프라인을 구축한다.
![](https://velog.velcdn.com/images/dotlike/post/035d4e94-2b6f-496c-b1a3-c438c5b4ee86/image.png)
OpenSearch 보안구성 수정
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:ap-northeast-2:계정번호:domain/demogo-opensearch/*"
}
]
}
![](https://velog.velcdn.com/images/dotlike/post/74a16936-a159-49fb-acfb-b99d97f49844/image.png)
![](https://velog.velcdn.com/images/dotlike/post/7047e522-cc8e-4d9d-9781-768f3ed6036d/image.png)
![](https://velog.velcdn.com/images/dotlike/post/bf403ded-2237-4451-9eb7-ac96ea3f2625/image.png)
보안 로그 통합 및 파이프라인 구축
![](https://velog.velcdn.com/images/dotlike/post/9b29e499-5cfe-4c37-aad0-cd72ca5269fa/image.png)
CloudTrail
- AWS 계정의 운영 및 위험 감사, 거버넌스 및 규정 준수를 활성화하는 데 도움이 되는 서비스.
- 사용자, 역할 또는 AWS 서비스가 수행하는 작업은 CloudTrail에 이벤트로 기록.
- 이벤트에는 AWS Management Console, AWS Command Line Interface 및 AWS SDK, API에서 수행되는 작업들이 포함됨
CloudTrail to OpenSearch
- CloudTrail → CloudWatch → Lambda → OpenSearch 의 과정을 거친다.
![](https://velog.velcdn.com/images/dotlike/post/0d32cb39-91bb-4dc4-8693-6f8b71d62d15/image.png)
Cloudtrail 추적 생성하기
- 아래와 같이 생성
- 버킷은 cloudformation으로 미리 생성됨.
![](https://velog.velcdn.com/images/dotlike/post/7bd69e57-1323-4108-9433-4f18a43747ba/image.png)
- cloudwatch log를 활성화한다.
![](https://velog.velcdn.com/images/dotlike/post/723bbdff-e98c-4f7e-840f-76665ff04e6f/image.png)
- 관리 이벤트, 데이터 이벤트를 선택하고, 관리 이벤트 또한 읽기와 쓰기 모두 선택
- 데이터 이벤트 유형은 S3를 선택하고, 로그 선택기 템플릿은 모든 이벤트 로깅을 선택
![](https://velog.velcdn.com/images/dotlike/post/42a20e9a-55a9-47b2-adc7-eb5bf087bcae/image.png)
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를 선택
- 앞서 생성한 정책을 할당
![](https://velog.velcdn.com/images/dotlike/post/aa75dfe4-9607-4c9b-86d8-3496fccce8ef/image.png)
OpenSearch 구독필터 설정
- 생성한 로그그룹의 구독필터 탭에서 OpenSearch service 구독필터 생성을 클릭
![](https://velog.velcdn.com/images/dotlike/post/2feec838-e025-4254-9849-e547d6799241/image.png)
- 앞서 생성한것들을 할당
- 로그 형식은 Amazon CloudTrail, 구독 필터 이름에는 demogo-cloudtrail
![](https://velog.velcdn.com/images/dotlike/post/cdffe00c-d43a-4f6d-8496-98c5d5abf9d5/image.png)
- 구독필터를 생성하면 아래 lambda가 자동으로 생성됨
![](https://velog.velcdn.com/images/dotlike/post/29d17139-d335-4672-b16a-2d06c076bfa5/image.png)
OpenSearch에 권한 추가
- security > Roles > all_access 선택
![](https://velog.velcdn.com/images/dotlike/post/32edc2f5-aad4-4c18-9856-7bd8e8a5477d/image.png)
- mapped users 탭에서 add
![](https://velog.velcdn.com/images/dotlike/post/b1ea526a-c6c6-462c-9cdb-dcab47f59a2f/image.png)
- iam role arn을 추가
![](https://velog.velcdn.com/images/dotlike/post/f42edf99-4cd3-41ee-b8ad-e7bb8a5de6ef/image.png)
OpenSearch에서 CloudTrail 확인
- Index Pattern을 생성 한다
![](https://velog.velcdn.com/images/dotlike/post/06293497-7c36-4276-9deb-7db380e35abf/image.png)
- Index pattern name에 cwl-* 을 입력
![](https://velog.velcdn.com/images/dotlike/post/6f05c847-3092-49f3-a4a1-81725f9f9254/image.png)
- time field는 everytime으로.
![](https://velog.velcdn.com/images/dotlike/post/f2d7e4d8-d5cc-4bc7-9662-d030b15e0c9c/image.png)
- discover 탭에서 생성한 인덱스패턴으로 로그를 확인할 수 있다.
![](https://velog.velcdn.com/images/dotlike/post/ae59cd63-ece1-4737-8034-7fcddf85493a/image.png)
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 과정을 거침
![](https://velog.velcdn.com/images/dotlike/post/b111c646-9df3-4664-8614-9dc2dbbc4061/image.png)
Kinesis Data Firehose 생성하기
- 실시간 데이터 처리가 가능한 데이터 저장소.
- kafka의 broker와 역할과 구조가 유사
- 소시는 direct put, 대상은 OpenSearch 선택
![](https://velog.velcdn.com/images/dotlike/post/a3f9f8bb-fbc4-492f-a38d-840ca570dd1d/image.png)
- Opensearch 도메인은 찾아보기로 선택
- 인덱스는 Opensearch에서 인덱스패턴을 만들때 사용하기때문에 알아보기 편하도록 지정
- 버퍼부분은 비용을 잘 생각하여 지정
![](https://velog.velcdn.com/images/dotlike/post/b47412f8-46a7-4aff-ad43-ceb72bfcd717/image.png)
- s3는 미리 만들어진 “demogo-kdf-backup”을 선택
- 이후 KDF관련 백업은 모두 동일하기 때문에 생략.
![](https://velog.velcdn.com/images/dotlike/post/eede9cdd-b979-431e-8315-02369346dbd2/image.png)
Route53 DNS Log 활성화
- Route53 쿼리로깅 탭에서 쿼리로깅 구성 클릭
![](https://velog.velcdn.com/images/dotlike/post/391c0146-017a-4b8f-a92a-b30167459056/image.png)
- 전송스트림은 앞서 만든 kdf 로 지정
- 쿼리를 기록할 vpc를 선택
- 실습에서 생성된 demogo-vpc 선택.
![](https://velog.velcdn.com/images/dotlike/post/6fe2bb5e-782f-4a7d-9638-21c4925c5911/image.png)
OpenSearch에서 DNS Log 확인
- kdf 구성부분에 iam 확인
![](https://velog.velcdn.com/images/dotlike/post/65670ab5-6543-4975-9f30-ca9f2fa252e6/image.png)
- Opensearch all_access 에 role mapping
![](https://velog.velcdn.com/images/dotlike/post/71b60724-ccc1-423f-84c0-03d049d7f9e5/image.png)
- 패턴 추가
- kinesis 만들때 지정한 인덱스 패턴으로 지정
![](https://velog.velcdn.com/images/dotlike/post/05ac1f65-07d1-4d39-a21c-bf299f5aef3d/image.png)
- time field는 query_timestamp
![](https://velog.velcdn.com/images/dotlike/post/a0dafbb9-eae4-43ee-9d3c-1fb4886e2268/image.png)
- discover에서 지정한 인덱스패턴으로 DNS log 확인
![](https://velog.velcdn.com/images/dotlike/post/0ef79fa4-0e84-4cdc-badc-bfdcb07fd14a/image.png)
WAF
- 가용성에 영향을 주거나, 보안을 위협하거나, 리소스를 과도하게 사용하는 일반적인 웹 공격으로부터 웹 애플리케이션이나 API를 보호하는 데 도움이 되는 서비스.
WAF to OpenSearch
- AWS WAF → Kinesis Data Firehose + Lambda → OpenSearch 과정을 거침
![](https://velog.velcdn.com/images/dotlike/post/9da3cdc1-8e48-4846-9c0c-74d4e60d2226/image.png)
KDF 데이터 스트림 생성
![](https://velog.velcdn.com/images/dotlike/post/78b0977a-155c-4e4c-9791-042598b9d07d/image.png)
- 데이터 변환 활성화 선택
- 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}
![](https://velog.velcdn.com/images/dotlike/post/c76290ec-b7e7-448d-a1c6-0ec99d531f6c/image.png)
- opensearch 도메인은 찾아보기로 선택
- 버퍼크기 알맞게 선택
![](https://velog.velcdn.com/images/dotlike/post/d293e7aa-8d9d-4503-b1e7-7497dee53b90/image.png)
- kdf 생성 후 opensearch에 권한 추가하기 위해 iam arn 복사
![](https://velog.velcdn.com/images/dotlike/post/4fe9db87-02c2-4f65-bc00-c23f6c850602/image.png)
- 앞서 진행했던것과 같이 all_access에 권한 추가
![](https://velog.velcdn.com/images/dotlike/post/bc3a1044-7b03-4506-86e4-0828a31fe984/image.png)
Opensearch에서 WAF Log 확인
- Web ACL > Logging 메뉴에서 활성화
![](https://velog.velcdn.com/images/dotlike/post/3e75a736-4334-45e3-8c23-543304c5e8a1/image.png)
- log data는 앞서 생성한 KDF로 설정
![](https://velog.velcdn.com/images/dotlike/post/1f615afe-f991-47ae-bd0c-9b0c58b71d9d/image.png)
- WAF Log가 쌓여있지 않기 때문에 WAF와 연결되어있는 webserver에 트래픽을 발생
- 해당 웹사이트 여러번 새로고침.
![](https://velog.velcdn.com/images/dotlike/post/af1f9c70-e6bc-4dd3-b930-898bf28e3915/image.png)
- Index pattern 추가
- 시간 조금 걸림.
![](https://velog.velcdn.com/images/dotlike/post/3c97b016-f5c6-47ac-8f3d-c278eb98b4c4/image.png)
- timefield는 timestamp
![](https://velog.velcdn.com/images/dotlike/post/8b2dfc76-6dcd-4813-9c25-09599e88ecc5/image.png)
- Discover를 통해 WAF Log 확인
![](https://velog.velcdn.com/images/dotlike/post/2f493d96-536d-450f-93f2-046ffbcfbd2b/image.png)
VPC FlowLog
- VPC의 네트워크 인터페이스에서 IP 트래픽에 대한 정보를 수집할 수 있는 기능.
- FlowLog 데이터는 CloudWatch Logs 또는 Amazon S3에 저장가능.
FlowLog를 to OpenSearch
- VPC FlowLog → Kinesis Data Firehose + Lambda → OpenSearch 과정을 거
![](https://velog.velcdn.com/images/dotlike/post/510974a5-72c4-47e1-ad9c-35e1e835621d/image.png)
KDF 생성하기
- Direct put , opensearch 선택
![](https://velog.velcdn.com/images/dotlike/post/d0b4a9ac-2029-4d6e-bd41-566183573380/image.png)
- 인덱스는 OpenSearch에서 패턴 지정할때 사용.
![](https://velog.velcdn.com/images/dotlike/post/0e67f284-057c-432a-be17-e5e07d943db3/image.png)
VPC FlowLog 생성
- Flowlog를 생성을 해야 수집할수있다.
- 원하는 VPC를 선택하여 플로우 로그를 생성
![](https://velog.velcdn.com/images/dotlike/post/3296a6f5-7a63-4120-8946-7ce2fa26b905/image.png)
- 설정에서 알맞는 값들 선택
- 플로우로그를 게시할 대상으로 생성한 KDF 선택
![](https://velog.velcdn.com/images/dotlike/post/3aded512-6a6d-4c8b-9c7d-32a02c4ac20b/image.png)
- OpenSearch에 KDF IAM ARN 추가
![](https://velog.velcdn.com/images/dotlike/post/7c7e5ae2-e2f5-441e-be78-0304a2d11e94/image.png)
OpenSearch에서 VPC FlowLog 확인
- 인덱스 패턴을 생성한다
![](https://velog.velcdn.com/images/dotlike/post/877e7817-b5d1-4328-bda6-b228b0087dcc/image.png)
- lambda는 미리 생성된 demogo-vpc-flow-log-to-opensearch 선택
![](https://velog.velcdn.com/images/dotlike/post/2f7ebf12-cb7d-439b-9a2b-dc54cba52d7d/image.png)
기존 VPC FlowLog 제거
- timestamp 변형하기 전 log를 Dev Tools에서 명령어 실행하여 제거
![](https://velog.velcdn.com/images/dotlike/post/6fc7fddb-d07d-4bbb-8b60-faae5ca22d68/image.png)
- 이후 인덱스패턴을 아까와 같이 생성해보면 timefield 선택이 활성화됨
- start로 지정
![](https://velog.velcdn.com/images/dotlike/post/11813a15-2094-4abc-badf-5b8b1e547a25/image.png)
- VPC FlowLog 확인
![](https://velog.velcdn.com/images/dotlike/post/658eab6e-6f06-49c2-817d-307c4fcccede/image.png)
Security Hub
- 아래와 같은 구조로 보안서비스 로그 통합 및 데이터 파이프라인 구축을 진행
![](https://velog.velcdn.com/images/dotlike/post/de098f6b-719b-4a27-b7ab-3faa9fb8d61d/image.png)
AWS Config
- Config는 리소스에 대한 규칙 및 규정준수상태를 확인할 수 있다.
- 시작하기 > 단계2 규칙 부분에서 오른쪽 상단의 톱니바퀴 클릭
![](https://velog.velcdn.com/images/dotlike/post/9463055f-a3e9-4e6b-b9a5-0ee22a6a82fd/image.png)
- 페이지 크기를 50으로 늘리고 모두 선택
![](https://velog.velcdn.com/images/dotlike/post/6e7fe5d0-4898-497f-827e-9104da857d51/image.png)
Security hub
- 활성화 클릭
![](https://velog.velcdn.com/images/dotlike/post/e890fc13-3766-4c45-9351-426f53a0aebf/image.png)
Guardduty
- 활성화 클릭
![](https://velog.velcdn.com/images/dotlike/post/9fb08a48-3861-4015-9155-d687072d6a8b/image.png)
- 대시보드 설정 > 결과 내보내기 옵션을 15분으로 설정
![](https://velog.velcdn.com/images/dotlike/post/85e0c4af-d2a9-4a49-9e08-7910b2f9da2a/image.png)
Kinesis Data Firehose 생성
- 생성방법은 앞서 진행했던것과 동일함
- 인덱스 부분만 잘 설정
![](https://velog.velcdn.com/images/dotlike/post/7fc6f482-e72a-48cb-a103-729d32b1b6b7/image.png)
![](https://velog.velcdn.com/images/dotlike/post/1fb0170f-1b08-4890-b394-eead9b0eb975/image.png)
EventBridge에서 Security Hub 이벤트 로그 전송
- security hub에서는 바로 KDF로 보내지 못하고 eventbridge를 이용해서 전송해야함.
![](https://velog.velcdn.com/images/dotlike/post/d68e11ae-0dd9-4ca7-911d-004c63ac743a/image.png)
- 이벤트 패턴은 아래와 같이 설정
- 이렇게 AWS 계정 ID, 제품 ARN, 심각도 레이블 등의 기준으로 이벤트 패턴을 필터링하는 경우 OpenSearch에 저장되는 Index도 별도로 생성되어야 함.
- 그렇지 않을 경우 데이터 혼합, 중복등의 문제가 발생할 수 있음. 따라서 Kinesis Data Firehose를 각각의 이벤트 패턴별로 생성하는 방법 등을 고려하여야 함
![](https://velog.velcdn.com/images/dotlike/post/d1f77ef3-d4dd-48cd-b3f5-1246922f5d5b/image.png)
- 대상을 KDF로 선택
![](https://velog.velcdn.com/images/dotlike/post/e3cf242a-fdee-481b-aa70-66bad836daf6/image.png)
OpenSearch 권한 추가
- KDF의 IAM을 all_access에 mapping
Guardduty Sample 데이터 생성하기
- 설정 > 샘플결과 작성 클릭
![](https://velog.velcdn.com/images/dotlike/post/6a3f787b-6ef2-475c-a671-cbefd48b122f/image.png)
- 결과 탭에서 확인
- 샘플 결과여도 해당 결과들이 securityhub로 수집된다.
![](https://velog.velcdn.com/images/dotlike/post/86efa93b-72ad-4f28-a184-575311183c3a/image.png)
OpenSearch 인덱스 생성 및 데이터 확인
- aws-securityhub-findings-logs*로 인덱스 패턴 생성
![](https://velog.velcdn.com/images/dotlike/post/9d22626c-3bab-4861-8c8c-1c0bb8f2f2ed/image.png)
- CreatedAt 선택
![](https://velog.velcdn.com/images/dotlike/post/8e5a6c2a-e4dd-4141-9ec2-5005a3d537ac/image.png)
- discover에서 SecurityHub 로그 확인
![](https://velog.velcdn.com/images/dotlike/post/62434bed-e773-412d-b87c-5b3b3aa8b01d/image.png)
- 샘플로 생성했던 guardduty도 확인
- Eventbridge에서 detail.findings의 서비스 ARN을 지정하면 각 AWS 서비스별 패턴마다 확인하기 쉬워질듯.
- arn:aws:securityhub:ap-northeast-2::product/aws/config
- arn:aws:securityhub:ap-northeast-2::product/aws/guardduty
![](https://velog.velcdn.com/images/dotlike/post/0a2c7680-3b9f-4956-b8c1-b280db43b63d/image.png)