기존 AWS에 구성된 리소스로의 접근 제어는 보안 그룹을 통해 설정하는 것이 일반적이며,
추가로 방화벽 등의 서비스를 사용하고 싶은 경우 마켓플레이스를 통해 서드파티 제품(EC2 AMI 형태)을 이용하는 방법 밖에 없었습니다.
하지만 최근 신규 서비스로 추가된 AWS Network Firewall 서비스를 통해 보안 그룹과 유사한 방식으로 접근 제어 설정이 가능하여, AWS Network Firewall 서비스를 소개해드리며 간단한 사용 방법도 공유하고자합니다.
1. AWS Network Firewall 이란
AWS Network Firewall 서비스는 인터넷 게이트웨이, VPN, Direct Connect, Transit Gateway 등 외부로 통하는 액세스 포인트와 사용자의 퍼블릭 서브넷 사이에 위치하여 상태 저장 및 상태 비저장 규칙 그룹을 통해 트래픽을 필터링/감시하는 서비스이며, 오픈 소스 IPS인 Suricata를 기반으로 구성되었습니다.
참고 링크1. 2021년 4월 29일 서울 리전 정식 지원 시작
https://aws.amazon.com/ko/about-aws/whats-new/2021/04/aws-network-firewall-is-now-available-in-more-regions/
참고 링크2. AWS 한국 공식 블로그 network firewall 소개 및 생성
https://aws.amazon.com/ko/blogs/korea/aws-network-firewall-new-managed-firewall-service-in-vpc/
2. AWS Network Firewall 생성 및 설정
1) 방화벽 전용 서브넷 생성
기존 서브넷과 별도로 방화벽을 생성할 서브넷을 생성해줍니다. 라우팅 테이블을 통해 모든 트래픽이 방화벽을 거치도록 구성할 것이기 때문에 기존 EC2 등이 위치한 서브넷은 사용이 불가합니다. 먼저 아래는 방화벽 구성 전 서브넷 리스트로 퍼블릭 서브넷 2개와 프라이빗 서브넷 2개로 구성되어 있으며, 프라이빗 서브넷은 퍼블릭 서브넷에 구성된 NAT GW를 통해 외부와 통신합니다.
아래와 같이 방화벽 전용 서브넷(premisan-test-dmz1, premisan-test-dmz2)을 생성합니다. 방화벽 서브넷에는 방화벽만 위치할 것이기 때문에 대역을 크게 설정할 필요는 없습니다.
2) 방화벽 생성
VPC -> 네트워크 방화벽 -> 방화벽 메뉴로 이동하여 방화벽을 생성합니다.
방화벽 생성 페이지에 Network Firewall 이 사용하는 주요 리소스(방화벽, 방화벽 정책, 규칙 그룹)에 대한 간단한 설명이 있으니 참고하면 좋을 것 같습니다.
방화벽이 위치할 VPC와 서브넷을 골라줍니다. 서브넷은 최소 1개 이상 선택 가능하며, 다중 AZ로 구성된 경우 가용 영역 당 1개 서브넷씩 선택 가능합니다. 테스트 환경의 VPC는 2개 가용 영역에 구성되었기 때문에 가용성을 위해 2개 서브넷을 선택해줬습니다.
모든 방화벽은 1개의 방화벽 정책을 가지며, 방화벽 정책에는 다수 규칙 그룹이 포함될 수 있습니다. 새로 생성할 방화벽에 연결할 빈 방화벽 정책을 생성합니다. 삭제 방지 등의 설정은 필요 시 체크합니다.
최하단의 방화벽 생성 버튼을 누르면 방화벽이 생성되기 시작합니다. 약 10분 내외의 시간이 소요되므로, 기다리는 동안 방화벽에 적용할 규칙 그룹을 설정하러 가보겠습니다.
3) 방화벽 규칙 그룹 구성
아래의 경로로 이동하여 새 상태 저장 규칙 그룹을 생성합니다.
VPC -> 네트워크 방화벽 -> 방화벽 정책 -> 방화벽 생성 시 함께 생성한 빈 방화벽 정책(premisan-test-fw-policy) 선택 -> 상태 저장 규칙 그룹 -> 새 상태 저장 규칙 그룹 생성 및 추가
규칙 그룹의 이름 및 용량을 지정합니다. 용량은 해당 규칙 그룹이 가질 수 있는 규칙 개수의 최댓값입니다. 규칙 그룹 생성 후 용량 수정이 불가하니 해당 규칙 그룹에 생성할 것으로 예상되는 최댓값으로 지정해줍니다. 상태 저장 규칙 그룹 옵션은 5-tuple(프로토콜, 소스/대상 아이피, 소스/대상 포트), 도메인 리스트(도메인 기반), Suricata 규칙(고급 IPS 룰셋) 중 하나를 선택합니다. 테스트 환경에서는 간단하게 설정 가능한 5-tuple을 선택했습니다.
5-tuple 규칙은 보안 그룹과 매우 흡사합니다. VPC 대역의 모든 아웃바운드 트래픽을 허용하는 설정과 제 PC에서 특정 EC2 인스턴스로 SSH 트래픽을 허용하도록 설정을 추가하였으며, 그 외의 모든 트래픽은 차단하도록 설정하였습니다.(IP는 모든 프로토콜을 의미하며, 규칙은 통과 -> 삭제 -> 알림의 순으로 적용됩니다) 상태 저장 규칙 그룹이기 때문에 허용된 트래픽에 대한 응답으로 전송되는 아웃바운드 트래픽은 자동적으로 허용됩니다. (SSH 허용을 위해 SSH 프로토콜을 선택하면 통신이 되지 않는데 Suricata 규칙에 대해 좀 더 확인해볼 필요가 있을 것 같습니다)
4) 방화벽 로깅 설정
방화벽을 통해 허용/차단된 트래픽을 모니터링하기 위해 로깅 설정을 추가해보겠습니다.
먼저 방화벽 메뉴로 이동하여 이전 단계에서 생성한 방화벽이 정상적으로 생성되었는지 확인합니다.
방화벽 세부 정보 탭으로 이동하여 로깅 섹션의 편집 버튼을 눌러줍니다.
로깅을 원하는 로그의 유형을 선택하고 로그를 저장할 장소를 지정합니다. 테스트 환경에서는 생성되는 로그를 바로 확인해보고 싶어 Cloudwatch Logs 의 로그 그룹을 생성하여 지정해 줬습니다.
5) 라우팅 테이블 설정
VPC 내부/외부에서 유입되는 모든 트래픽이 방화벽을 통해 전달되도록 라우팅 테이블을 구성합니다. 아래는 방화벽 적용 전 라우팅 테이블 구성으로 심플하게 퍼블릭 라우팅 테이블과 프라이빗 라우팅 테이블로 구성되어 있습니다.
여기서 프라이빗 라우팅 테이블은 별도로 변경할 필요가 없지만, 퍼블릭 라우팅 테이블은 가용 영역 별로 라우팅 테이블을 생성해야하며, 방화벽 서브넷을 위한 라우팅 테이블과 인터넷 게이트웨이로부터 방화벽으로 트래픽을 라우팅할 IGW 라우팅 테이블을 추가로 생성해줘야 합니다.
먼저 퍼블릭 라우팅 테이블을 가용 영역 별로 구성하기 위해 방화벽 세부 정보에서 가용 영역별 방화벽의 엔드포인트를 확인합니다.
퍼블릭 라우팅 테이블1과 퍼블릭 라우팅 테이블2의 0.0.0.0/0 경로 대상을 게이트웨이 로드밸런서 유형의 방화벽 엔드포인트로 각각 연결해줍니다. 가용 영역별로 방화벽 엔드포인트가 다르게 구성되어 있으니 유의하여 선택합니다.
아래와 같이 방화벽 전용 서브넷에 대한 라우팅 테이블(premisan-test-dmz-rtb)를 생성하여 방화벽이 위치한 2개 서브넷을 연결하고 인터넷 게이트웨이를 대상으로 하는 경로를 추가해줍니다.
마지막으로 인터넷 게이트웨이를 위한 라우팅 테이블(premisan-test-igw-rtb)를 생성하여 엣지 연결 탭에서 기존 인터넷 게이트웨이를 선택해줍니다. 또한 라우팅 설정에서 서브넷 아이피 대역에 따라 다른 방화벽 엔드포인트로 연결되도록 경로를 설정해줍니다.
6) 통신 테스트
이제 라우팅 설정까지 방화벽을 위한 모든 설정을 마쳤습니다. 설정한 방화벽 규칙이 정상적으로 적용되는지 테스트를 진행합니다. (제 PC 아이피의 경우 보안 그룹에서 모든 프로토콜로 허용되어 있는 상태입니다) 먼저 SSH 접속이 정상적으로 허용 되는지 확인합니다.
이번에는 Ping을 통해 ICMP 트래픽이 차단되는지 확인합니다.
또한 HTTP 등 허용하지 않은 트래픽이 차단되는지 확인합니다.
이제 방화벽 허용/차단 내역을 Cloudwatch Logs 를 통해 확인합니다. 방화벽 허용/차단 로그는 로그 스트림의 이름을 통해 flow/alert로 구분되어 아래와 같은 형태로 보여집니다.
3. 결론
AWS Network Firewall 서비스를 통해 보안 그룹과 별도로 추가 보안 설정을 해보았습니다. 테스트 환경에서는 5-tuple 규칙을 통해 프로토콜과 아이피주소, 포트만으로 접근 제어를 설정하였으나, Suricata 고급 규칙을 구성하여 IPS와 같이 패킷 심층 검사가 가능한 것으로 보입니다. 하지만 해당 설정을 위해서는 Suricata의 규칙 구성 방법과 문법을 어느정도 숙지해야 원하는 대로 설정이 가능할 것으로 보여 초심자에게는 조금 어려울 것으로 보입니다. 오픈 소스 IPS인 Suricata 규칙 구성에 관한 공식 가이드 주소를 첨부해드리며 이상으로 AWS Network Firewall 서비스 소개를 마칩니다.
https://suricata.readthedocs.io/en/suricata-6.0.3/rules/index.html
'AWS' 카테고리의 다른 글
CloudFront 필드 레벨 암호화 (0) | 2023.03.18 |
---|---|
AWS Transfer Family(관리형 FTP 서버) (0) | 2023.03.18 |
AWS Global Accelerator (0) | 2023.03.17 |
AWS DocumentDB(MongoDB 호환) (0) | 2023.03.16 |
AWS 예약 인스턴스(RI) 구매 방법 (0) | 2023.03.15 |