PF-09 · AWS · Python
AWS 방화벽 요청 자동화
방화벽 요청이 이미 열려 있는지 먼저 확인하고, 막힌 것만 미리보기 뒤 적용하며, 실제 트래픽으로 검증하는 CLI입니다.
- 역할
- 설계 · 구현
- 기간
- 개인 프로젝트 · 2026.11 공개
- CSP
- AWS
- 규모
- 3단계 CLI · 입력 형식 4종 · 리소스 4종
- 핵심 기술
- Python · boto3 · AWS · CloudWatch Logs · Athena · Excel
- 3
- 단계: confirm, modify, flowlog
- 4
- 입력 형식
- 4
- 식별하는 리소스 종류
한눈에 보기
문제
방화벽 요청은 이미 열린 통신을 다시 여는 경우가 많아 중복 규칙이 쌓였고, 어떤 리소스와 규칙이 걸리는지 계정마다 콘솔에서 찾아야 했습니다.
접근
netops confirm이 주소를 AWS 리소스로 식별하고 보안그룹 규칙과 라우트를 평가합니다. 막힌 통신만 modify로 넘겨 계획을 먼저 출력합니다. flowlog는 CloudWatch Logs나 Athena에서 실제 트래픽을 찾습니다.
결과
기본 실행은 아무것도 바꾸지 않습니다. 규칙 추가에는 --apply와 apply 입력이 필요하고, 규칙은 추가만 가능하며, 슬롯이 없는 보안그룹은 고르지 않습니다.
자세히 보기
규칙과 라우트로 판정
이 코드가 하는 일: 규칙 위반과 경로 없음을 나눠 판정 이유를 남깁니다.
if any(not c.ok for c in verdict.checks):
verdict.ok = False
verdict.issues.append("Security group rule needed")
if source.resources and not target.resources:
for resource in source.resources:
ec2 = self.sessions.client("ec2", resource.account)
result = route_analysis.evaluate(
route_analysis.find_table(ec2, resource.subnet_id, resource.vpc_id), dst
)
detail = (
f"via {route_analysis.next_hop(result.routes[0])}"
if result.ok
else f"no route in {result.table_id or 'any table'}"
)
verdict.checks.append(Check("route", resource.label, result.ok, detail))
if not result.ok:
verdict.ok = False
verdict.issues.append("Route needed")
return verdict
규칙 추가만 하는 적용
이 코드가 하는 일: 변경은 규칙 추가뿐이며, 이미 있는 규칙은 오류 없이 넘어갑니다.
def apply(self, change: Change) -> str:
ec2 = self.sessions.client("ec2", change.account)
call = (
ec2.authorize_security_group_ingress
if change.direction == "ingress"
else ec2.authorize_security_group_egress
)
try:
call(GroupId=change.sg_id, IpPermissions=change.permissions)
except ClientError as error:
if error.response["Error"]["Code"] == "InvalidPermission.Duplicate":
return "already present"
raise
return "applied"배운 점
안전한 동작을 플래그 없이 되는 기본값으로 두는 것이 중요했습니다. --dry-run 방식은 깜빡하면 위험합니다.
다음에 개선할 점
보안그룹은 자동으로 고르며 다른 그룹을 고르는 메뉴는 아직 없습니다. Prefix list는 평가하지 않고, flowlog 검색은 리팩터링 뒤 실제 로그로 돌려 보지 못했습니다.