지금까지 AWS 클라우드 환경에서 Application의 보안책으로 WAF(Web Application Firewall)를 주로 이용하였다. 대상들이 모두 웹 서비스였기도 했고, WAF와 ALB 정도의 구성으로 비교적 간단하게 문제없이 운영했었다.
이후에 새롭게 맡은 클라우드 서비스의 보안 아키텍쳐 구성 업무에서 L7의 웹 트래픽 뿐만 아니라 L3/4와 같은 네트워크 레벨에서의 트래픽도 커버할 수 있는 구성을 요청받게 되었다.
그리고 유입되는 네트워크 트래픽을 바탕으로 차단을 수행하고 로깅하는 기능까지 요구사항으로 요청하셨다.
원래 이정도 스케일의 요구사항이면 3rd party 어플라이언스를 도입하는 것이 맞다고 생각했으나, 비용 등의 이유로 추진할 수 없었다. 그렇게 찾은 방안이 오늘 소개할 Network Firewall이다.
Network Firewall
AWS에서 제공하는 관리형 네트워크 보호 서비스이다. Network Firewall은 VPC에 적용하는 서비스로, VPC에서 인터넷 게이트웨이와 같은 외부로 나가는 인터넷 엑세스포인트와 내부의 리소스가 존재하는 서브넷 사이에 위치하는 네트워크 트래픽 방화벽으로 IDS/IPS 역할을 한다.
Network Firewall은 방화벽 > 방화벽 정책 > Rule Group의 3개의 단위의 리소스로 이루어져 있다.
가장 큰 단위인 방화벽은 VPC에 연결되어 방화벽 정책을 기반으로 필터링을 수행하는 객체이다.
다음으로 방화벽 정책(Policy)은 방화벽의 필터링 동작을 정의한 것으로, 여기서 동작은 정책(Policy)에 추가하는 Rule Group과 기본 정책 설정에 정의되어있다.
마지막으로 Rule Group은 Network Firewall에서 가장 작은 단위 개념으로 네트워크 트래픽을 필터링하기 위한 방화벽 규칙의 집합이다. Rule Group은 상태 저장(Stateful) Rule Group과 상태 비저장(Stateless) Rule Group으로 구분되며, Network Firewall에서는 이 2가지를 모두 지원한다.
상태 저장(Stateful)과 상태 비저장(Stateless)에 대한 내용은 아래에 연결된 이전 글을 통해서 알아볼 수 있다.
Network Firewall은 Firewall Endpoint라고 하는 엔드포인트가 존재한다.
Firewall Endpoint를 VPC의 서브넷에 배치해 Internet Gateway와 내부 리소스의 사이에서 트래픽 제어를 하는 구조이다.
이를 통해 VPC로 유입되고 나가는 모든 트래픽을 Firewall Endpoint를 통해 필터링되는 것을 볼 수 있다.
첨부된 구조도 같이 Firewall Endpoint가 배치된 별도의 서브넷을 VPC에 생성하여 배치한다.
트래픽 흐름은 적혀있는 번호 순서대로 이어지며, Firewall Endpoint에서 Network Firewall Rule Engine으로 트래픽을 전송하여 검사를 수행한다.
Network Firewall 아키텍쳐 구성
Network Firewall을 도입한 아키텍쳐를 구성해보도록한다.
이번에 구성할 아키텍쳐는 아래와 같다.
2개의 가용영역 상으로 배치되어있는 EC2 인스턴스와 이들을 묶은 ALB를 보호하는 비교적 간단한 아키텍쳐이다.
EC2 / ALB 생성
간단하게 apache를 설치한 인스턴스를 Priv-a와 Priv-c에 각각 올려준다. 그리고 이 둘을 묶는 대상 그룹과 ALB를 생성한다.
Network Firewall 구축
먼저, 가장 작은 단위인 방화벽 Rule Group부터 생성한다. 네트워크 방화벽 > Network Firewall 규칙 그룹
앞서 언급하였듯이 Network Firewall에는 상태저장 규칙과 상태 비저장 규칙을 모두 적용시킬 수 있다.
상태 저장 규칙부터 생성해본다.
다음으로 Rule Group의 이름과 용량을 설정한다.
용량은 말그대로 Rule Group에 저장할 룰의 최대 용량을 말한다. 이 용량 값은 Rule Group 생성 이후에 수정이 불가능하다. 그러므로 최대치인 30000을 바로 지정해주어도 무방하다.
다음은 본격적으로 Rule Group에 규칙을 생성하는 부분이다. 먼저 보이는 2개의 구성은 규칙변수와 IPSet을 지정해주는 선택사항이다.
그 밑으로 보이는 '표준 상태 저장 규칙' 구성에서 규칙을 생성하고, 그 하단의 '규칙' 탭에서 적용된 규칙 목록을 확인할 수 있다.
먼저, ALB를 통해 인스턴스에 Apache 웹서버를 올렸으므로 80포트에 대한 트래픽을 허용해주는 규칙을 생성한다.
'규칙 추가'로 이 규칙을 Rule Group에 추가하고, Rule Group을 생성한다
그리고 다음으로 상태 비저장 규칙도 생성해본다.
상태 비저장 규칙의 경우 앞서 생성한 상태저장 규칙과 포맷이 다르다.
'우선순위'라는 개념이 포함되어있어 이 값이 적은 규칙부터 적용이 되는 구조이다.
먼저, 외부에서 VPC로 전송되는 ICMP 패킷을 차단하도록 규칙을 생성해본다.
반대로 Outbound 방향도 ICMP를 차단하도록 규칙을 추가해준다
이렇게 2개의 Rule Group을 생성하였다.
다음으로, 네트워크 방화벽에 적용시킬 방화벽 정책을 생성한다.
(네트워크 방화벽을 생성하는 과정에서 방화벽 정책을 생성할 수도 있다.)
다음 설정으로 바로 앞서 생성한 2개의 규칙 그룹(상태 저장, 상태 비저장)을 지정해 연결해준다.
그리고 이 두 유형의 규칙 그룹의 기본 작업 행동을 지정해주어야한다.
상태 비저장 규칙 그룹에서는 '조각화된 패킷'에 대한 작업을 지정하고, 상태 저장 규칙 그룹에서는 '규칙 평가 순서'를 지정한다.
규칙 평가 순서
- 엄격한 순서 : 규칙 그룹의 첫번째부터 순서대로 적용
- 작업 순서 : '통과' 하는 규칙부터 적용하고, 그 뒤로 '삭제', '거부', '알림' 규칙 순서대로 적용
삭제 조치 : 상태저장 규칙에 지정되지 않는 패킷들을 어떻게 처리할 것인가의 설정
경고 조치 : 상태저장 규칙에 걸린 패킷들에 알림 메시지를 어떻게 로깅할 것인가의 설정
번역이 매끄럽지 못한 부분이 있어서, 원문 Docs를 읽어보는 것이 좋다.
마지막으로 VPC > 네트워크 방화벽 > 네트워크 방화벽 메뉴에서 네트워크 방화벽을 생성한다.
다음 설정은 실수로 방화벽과 서브넷을 변경하는 일을 방지하기 위한 설정으로, 이를 확인하고 넘어간다.
마지막 설정으로 앞에서 생성한 방화벽 정책을 연결해주면 방화벽이 생성된다.
이렇게 네트워크 방화벽을 생성하면 설정한 서브넷 2개에 각각 Firewall Endpoint가 생성되는 것을 볼 수 있다.
Endpoint의 생성과 활성화까지는 몇 분 정도 걸린다.
Firewall Endpoint를 생성한 순간부터 요금 측정이 시작되며, Network Firewall에서는 Firewall Endpoint의 가동시간과 처리용량만큼 요금이 부과된다.
여전히 서비스 비용이 살벌하므로 사용하지 않을 때에는 리소스가 모두 삭제되었는지 반드시 확인해야한다.
이렇게 Network Firewall 테스트 환경과 방화벽을 구축하는 과정까지 알아보았다.
아직 VPC의 네트워킹(서브넷 연결) 설정하는 과정이 남아있다. 이 부분은 바로 다음 글을 통해 정리해보도록한다.