개발 이모저모/Python

[Python] CloudFront, ALB WAF 미연결 리소스 찾기

Kobby 2022. 12. 29. 23:59

Python을 활용한 업무의 일부를 공유하는 게시물입니다.

아직 공부하는 입장이기에 부족한 부분이 있을 수 있습니다. 지적해주시면 적극 반영하도록 하겠습니다.
퍼가시거나, 업무에서 도움이 되었다면 댓글 하나씩 부탁드립니다 :) 감사합니다.


Summary

대외에 공개하는 CloudFront 또는 ALB는 WAF 등으로 접근제한 또는 Managed Rule을 사용하는 경우가 많다. 이때 각 리소스별로 WAF 연결이 누락된게 없는지 확인하기 위한 코드이다.

-  최종적으로는 아래 코드로 WAF 연결이 누락된 CloudFront 또는 ALB 리소스를 확인해서 Slack으로 알람을 받고 알람을 받을 때 대응을 해주는 프로세스로 가면 될 것 같다.

- check_alb_waf_usage 함수의 경우 WAFv2에서 리소스에 대해서만 확인이 가능합니다. WAF Classic은 관련 함수가 없다..

#! /usr/bin/ python3
# -*- coding: utf-8 -*-

import boto3

# Define AWS Account Profile
PROFILES='service-prod'  <<< 상황에 맞게 수정하시면 됩니다.
AWS_REGION='ap-northeast-2'  <<< 상황에 맞게 수정하시면 됩니다.

session = boto3.Session(profile_name=PROFILES,region_name=AWS_REGION)

#CloudFron info
cf_file=session.client('cloudfront')
cf_data=cf_file.list_distributions()

#WAFv2 Info(SEOUL)
waf2_file=session.client('wafv2')
waf2_data=waf2_file.list_web_acls(Scope='REGIONAL')

#WAFv2 Info(CLOUDFRONT)
session_us_east = boto3.Session(profile_name=PROFILES,region_name='us-east-1')
waf2_file_cf=session_us_east.client('wafv2')
waf2_data_cf=waf2_file_cf.list_web_acls(Scope='CLOUDFRONT')

#ELB INFO
elb_file=session.client('elbv2')

def check_cloudfront_usage():
    '''
    ' 현재 AWS Credential에서 CloudFront 정보를 읽어서 WAF Webacl 연결 여부를 확인합니다.
    '''
    for num in range(len(cf_data['DistributionList']['Items'])) : 
        cf_id =cf_data['DistributionList']['Items'][num]['Id']
        try:
            cf_domain=cf_data['DistributionList']['Items'][num]['Aliases']['Items'][0]
        except:
            cf_domain='no doamin'
        cf_waf=cf_data['DistributionList']['Items'][num]['WebACLId']
        cf_except = ['']
        for cf_info in cf_except:
            if (cf_info not in cf_id) and (cf_waf==""):
                print(f'{cf_domain} ({cf_id})은 WAF 연결이 없습니다. 확인이 필요합니다.')

def check_alb_waf_usage():
    '''
    ' 현재 AWS Credential에서 ELB 정보를 읽어서 WAFv2 리소스 할당 여부를 확인합니다.
    '''
    elb_info = elb_file.describe_load_balancers()
    for num in range(len(elb_info['LoadBalancers'])):
        if (elb_info['LoadBalancers'][num]['Type'] == "application") and (elb_info['LoadBalancers'][num]['Scheme'] == "internet-facing"):
            wafv2_usage = waf2_file.get_web_acl_for_resource(ResourceArn=elb_info['LoadBalancers'][num]['LoadBalancerArn'])
            try: 
                usage = wafv2_usage['WebACL']
            except:
                elb_dns=elb_info['LoadBalancers'][num]['DNSName']
                print(f'{elb_dns}은 WAF 연결이 없습니다. 확인이 필요합니다.')


if __name__ == "__main__":
    check_cloudfront_usage()
    check_alb_waf_usage()