개발 이모저모/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()