Cloud/Cloud 공부일기

Day 76 - 세미프로젝트

갬미 2022. 4. 28. 23:59

오늘 한 내용

- WAF 공격시 슬랙 알림

 

WAF 공격시 슬랙 알림

어제도, 오늘도 참고한 고마운 블로그 ,,

https://longtermsad.tistory.com/49

 

AWS Monitoring[CloudWatch] - 1. CloudWatch Alarm을 Slack 연동하기

AWS에서는 Amazon CloudWatch Alarm(경보)를 사용하여 모니터링 할 수 있으며 Alarm(경보)를 설정하고 해당 내용에 대해서 알람을 받을 수 있습니다. https://docs.aws.amazon.com/ko_kr/AmazonC..

longtermsad.tistory.com

 

할수있을까 걱정을 많이 했는데 ! 생각보다 간단했다

 

1. WAF 설정에서 Log만기기를 Enable한다

이때 log group를 만들어 CloudWatch에서 보이게 한다

 

2. SNS 토픽 만들기

3. Lambda함수 구성

    블루 프린터 > cloudwatch-alarm-to-slack-python 선택

    SNS 트리거 > 방금 만든 SNS 선택

cloudwatch-alarm-to-slack-python를 사용하면 같은 포멧으로 데이터를 받아오는 것 같다 그래서 어제 썼던 코드를 조금만 수정했다

import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

import time
from datetime import datetime, timedelta

HOOK_URL = os.environ['HOOK_URL']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))
    
    alarm_name = message['AlarmName'] # 경보 - cloudwatch 경보 이름
    state_time = message['StateChangeTime'][:19]  # 시간 (형식 '%Y-%m-%dT%H:%M:%S')
    kst_time = datetime.strptime(state_time, '%Y-%m-%dT%H:%M:%S') - timedelta(hours=-9) #KST 시간 변환
    sec = message['Trigger']['Period']
    count = message['Trigger']['Threshold']
    detail_reason = message['NewStateReason'] 
    cause = str(sec)+'초 동안 Web Application 공격이 '+ str(int(count))+'회 이상 발생하였습니다'
      
    
    slack_message = {
            'text': "*[%s]*\n\n*발생시간*\n%s \n *원인*\n%s\n*상세 내용*\n%s" \
            % (alarm_name, str(kst_time), cause ,detail_reason )
        }
    

    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
        logger.info("Message posted")
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

환경변수는 다음과 같이 설정한다

4. 클라우드 경보 생성

지표 선택 > AWS namespaces > WAFV2 > Resion, Rule, WebACL

웹 공격으로 Block 당한 데이터가 있음을 Slack으로 알려야 하기 때문에 다음을 선택한다

이후는 자기 입맛에 맞게 설정~

 

** cloudwatch-alarm-to-slack-python 를 사용할때 testcase로 다음을 넣어줘야 한다 안그러면 오류남

https://github.com/blueimp/aws-lambda/blob/master/cloudwatch-alarm-to-slack/test-event.json

 

GitHub - blueimp/aws-lambda: Collection of functions for AWS Lambda

Collection of functions for AWS Lambda. Contribute to blueimp/aws-lambda development by creating an account on GitHub.

github.com

여기서 복붙 ,,

 

아무튼 모든 과정을 다 하고 웹 공격을 시도하면 다음과 같은 알림이 온다

 

++

람다함수를 조작할때 

cloudwatch-alarm-to-slack-python watch 지표는 Records > Sns > Message 로 들어오기때문에 여기를 먼저 체크 한다

Message 내용은 지표에따라 다르니까 일단 Lambda 함수 에서 Message 변수 받아오는 부분을 주석처리 해두고 경보가 울리게끔한다 (웹 공격을 한다던지 ,,)

그 후 Cloudwatch > log > log group 을 확인한다

Lambda 함수에 대한 로그 그룹이 생겨 함수 로그가 쌓이는것을 볼 수있다

폴더에 들어가 로그스트림을 누른다 -> [INFO]로 시작하는 로그 클릭하면 람다가 어떤 데이터를 받아오는지 확인 가능하다~

로그를 복사하고 json 형식으로 잘 변환해서 message를 확인하고 내가 사용하고자 하는 람다함수를 만들면 됨

 

구성도 ,, 최최종