AWS 기술 블로그

Amazon Network Firewall Suricata 규칙에서 HOME_NET 변수 사용하기

이 게시물에서는 AWS Network Firewall(이하 “ANF”) 모범 사례 시리즈의 첫 번째 게시물인 “AWS Network Firewall Suricata 규칙에서 Flow 키워드 사용하기”에 이어서 두 번째 게시물로 ANF의 규칙 그룹을 생성할 때 “HOME_NET 변수 설정”을 사용해야 하는 이유와 특징 및 활용 사례에 대해서 알아보도록 하겠습니다.

ANF는 Suricata Engine을 사용하는 정책 기반의 네트워크 보안 서비스로, VPC 환경에서 트래픽을 필터링하고 위협을 방지하는데 사용됩니다. 그리고 관리자는 보안 규칙의 집합인 Rule Group(규칙 그룹)과 규칙 그룹의 집합인 Policy(정책)과 같은 구성 요소들을 이용하여 다양한 트래픽 패턴들을 검사하고 유해하거나 차단하고자 하는 트래픽들을 탐지하고 차단할 수 있습니다. 그리고, 각 ANF에서 지원하는 Domain List 규칙 그룹과 Suricata 규칙 그룹, 그리고 정책에서 HOME_NET의 변수를 활용하여 네트워크 트래픽을 효율적으로 필터링하고, AWS 환경에서 강력한 보안 체계를 구축할 수 있습니다.

정책과 규칙 그룹에 대한 간단한 설명은 다음과 같습니다.

  • 정책
    • 여러 Rule Group을 포함하는 최상위 보안 정책 단위입니다.
    • VPC의 특정 서브넷에 적용되며, 트래픽이 Rule Group을 거쳐 처리되도록 설정합니다.
  • 규칙 그룹
    • 네트워크 트래픽을 필터링하기 위한 보안 규칙들의 집합입니다.
    • Stateful 및 Stateless 규칙을 포함할 수 있으며, 여러 Rule Group을 조합하여 Policy를 구성합니다.

ANF의 정책과 규칙 그룹에 대한 보다 자세한 사항은 AWS 공식 문서를 참고하시기 바랍니다.

ANF의 정책과 규칙 그룹에서 사용하는 HOME_NET 변수는 “출발지가 되는 내부 네트워크”의 IP 범위를 정의하는 변수입니다. 그리고, 이 HOME_NET 변수는 ANF의 여러가지 규칙 그룹(Domain List 규칙 그룹과 Suricata Compatible Rule String 규칙 그룹)을 사용할 때 자동적으로 적용되거나 관리자의 설정에 의해 사용될 수 있습니다. 예를 들어, Domain List 규칙 그룹을 사용할 때 관리자는 허용하거나 차단하고자하는 도메인 설정 과정에서 별도의 HOME_NET 변수 설정을 할 수 없지만, 기본값으로 적용되는 HOME_NET 변수값의 적용을 받게 됩니다. 그리고, Suricata 규칙 그룹을 사용할 때에는 Suricata 규칙에 명시적으로 HOME_NET 변수를 지정함으로써 출발지 IP나 목적지 IP에 HOME_NET으로 지정된 네트워크 대역을 매칭시키는 규칙을 작성할 수 있습니다. 이와 같은 HOME_NET 변수는 특히 다수의 VPC(Virtual Private Cloud)를 기반으로 구성된 ANF 네트워크 환경이라면 규칙 그룹을 사용할 때 더욱 유의하여 사용하여야 합니다.

1. HOME_NET 변수의 특징

Domain List 규칙 그룹과 Suricata 규칙 그룹에서 사용하는 HOME_NET은 몇 가지 특징을 가지고 있습니다. 각 규칙 그룹에서 HOME_NET 변수를 적절하게 사용하는 방법에 대해 살펴보기에 앞서 HOME_NET 변수가 갖는 각각의 특징들을 먼저 살펴 보도록 하겠습니다.

1.1 ANF가 배포된 VPC의 CIDR

ANF는 ANF가 배포된 VPC의 CIDR를 HOME_NET의 기본값으로 설정합니다. 예를 들어, ANF가 배포된 VPC가 10.1.0.0/16의 CIDR 값을 가지고 있다면 해당 ANF에서 사용하는 규칙 그룹들의 HOME_NET은 자동으로 “10.1.0.0/16”으로 설정됩니다.

1.2 HOME_NET 설정의 우선 순위

ANF 배포 시 자동적으로 설정되는 HOME_NET의 기본값은 규칙 그룹에 적용되는 HOME_NET의 설정과 방화벽 정책에 적용되는 HOME_NET의 설정을 통해 변경될 수 있습니다. 단, 방화벽 정책과 규칙 그룹에 모두 HOME_NET이 설정되어 있는 경우에는 규칙 그룹의 HOME_NET 설정이 적용됩니다.

예를 들어, 정책에는 HOME_NET 변수가 10.0.0.0/16으로 설정되어 있고, 규칙 그룹에는 HOME_NET 변수가 10.1.0.0/16으로 설정되어 있는 경우, 규칙 그룹이 우선 순위가 높아서 HOME_NET은 10.1.0.0/16이 변수로 적용됩니다.

  • 정책에 사용된 HOME_NET 변수(10.0.0.0/16)
  • Suricata 규칙 그룹의 HOME_NET 변수(10.1.0.0/16)

그림1. Policy와 Rule Group 적용 우선 순위

1.3 HOME_NET과 EXTERNAL_NET

HOME_NET 변수는 EXTERNAL_NET 변수와 연관되어 있습니다. HOME_NET은 기본값으로 VPC의 CIDR를 따르지만 관리자의 설정에 따라 규칙 그룹이나 방화벽 정책을 통해 수정될 수 있습니다. 이와 다르게 EXTERNAL_NET은 HOME_NET 변수의 Negate 적용된 값을 따르게 됩니다. 예를 들면, HOME_NET이 “10.0.0.0/16“ 으로 설정된 상태이고 EXTERNAL_NET을 별도로 설정하지 않았다면 EXTERNAL_NET은 자동으로 ”!10.0.0.0/16“와 같이 10.0.0.0/16 을 제외한 네트워크를 지정하는 값을 가지게 됩니다.

그림2. HOME_NET과 EXTERNAL_NET간의 관계

2.HOME_NET 변수의 사용(Domain List 규칙 그룹)

그림3. 다중 VPC 환경

위 그림은 다중 VPC 환경을 나타낸 것으로 모든 인터넷 트래픽과 VPC간 트래픽을 처리하는 Security VPC를 별도로 구성하여 Transit Gateway에 연결되어 있는 각 VPC에서 발생하는 트래픽을 ANF를 통하여 처리하고도록 구성한 네트워크 아키텍처 예시입니다. 이와 같은 네트워크 환경에서 VPC A와 VPC B에서 발생되는 아웃바운드 트래픽을 Domain 기반으로 제어하기 위해서는 ANF 의 Domain List 규칙 그룹과 Suricata 규칙 그룹의 사용이 필요합니다. 이 게시물에서는 이와 같은 네트워크 아키텍처에서 Domain List 규칙 그룹을 사용하는 경우, 왜 HOME_NET 변수 설정이 중요한지 살펴보도록 하겠습니다.

ANF에서 아웃바운드 Domain을 허용/차단하기 위해서는 아래 그림과 같이 Domain List 규칙 그룹을 생성해야 합니다. 아래 그림의 예시는 “.amazon.com”과 “.amazonaws.com”을 허용하도록 하는 규칙 그룹입니다. 이 예시와 같이 규칙 그룹을 작성하고 적용하게 되면 별도의 추가 규칙이 적용되어 있지 않는 상태라면, VPC A와 VPC B에서 출발하는 HTTP/S 트래픽 중 “.amazon.com”과 “.amazonaws.com”을 포함하는 모든 트래픽은 허용되고 그 외의 모든 HTTP/S 트래픽은 차단되게 됩니다.

그림4. Domain List 규칙 그룹 설정

하지만, 실제로 위 규칙 그룹을 적용하여도 VPC A와 VPC B에서 출발하는 아웃바운드 HTTP/S 트래픽이 규칙 그룹의 의도대로 허용되지 않는 것을 확인할 수 있습니다. 그 이유는 바로 우리가 이 게시물에서 강조하고자 하는 HOME_NET 설정때문입니다.

ANF는 기본적으로 ANF가 배포되어 있는 VPC의 CIDR를 HOME_NET 값으로 할당합니다. 즉, 위 다이어그램에서는 Security VPC의 CIDR가 10.0.0.0/16이므로 ANF의 HOME_NET에 할당되어 있는 값은 “10.0.0.0/16” 입니다.

이 설정 상황에서 VPC A와 VPC B에서 아웃바운드 HTTP/S 트래픽이 ANF를 경유하게 되면 ANF는 Stateful 엔진을 통해 트래픽을 검사하게 되고 Domain List 규칙 그룹의 규칙의 매칭 여부를 판단하게 됩니다. 이 때, ANF로 유입되는 VPC A/B의 Source IP는 “10.1.0.0/16”과 “10.2.0.0/16”의 범위에 있을 것입니다. 즉, ANF의 HOME_NET에 설정되어 있는 CIDR 값과 매칭되지 않는 IP 대역이라는 것입니다. 따라서, ANF는 VPC A/B에서 트래픽이 유입되더라도 HOME_NET에 할당된 IP 범위와 Source IP의 IP 범위가 매칭되지 않기 때문에 Domain List 규칙 그룹에 설정된 Domain 허용 규칙을 적용하지 않게 되는 것입니다.

이 처럼 통제하고자 하는 트래픽의 출발지와 ANF가 배포된 VPC가 다른 경우에는 HOME_NET이 적용되어 있는 규칙 그룹의 적용을 위해서 반드시 HOME_NET을 적절하게 수정해줘야 합니다.

참고로, Domain List 규칙 그룹의 HOME_NET 설정은 AWS 관리 콘솔에서 “Source IPs” 메뉴로 표현되어 있습니다. 해당 메뉴는 AWS Network Firewall → Network Firewall Rule Group → “규칙 그룹명” → “Source IPs” 메뉴를 이용해 수정할 수 있습니다.

그림5. Domain List의 HOME_NET 수정

위와 같이 ANF의 Domain List 규칙 그룹을 적용하게 되면 ANF는 Domain List 규칙 그룹 내의 규칙을 검사할 때 HOME_NET(출발지 IP) 영역을 지정된 Source IP의 CIDR를 기준으로 규칙 검사를 수행하게 됩니다. 따라서, 위 네트워크 아키텍처 처럼 ANF가 배포된 VPC와 출발지 VPC가 다른 경우에는 반드시 Domain List 규칙 그룹의 Source IPs(HOME_NET에 해당)설정을 출발지가 속한 VPC의 CIDR로 변경해야 합니다.

3. Suricata 규칙 그룹에서 HOME_NET 변수 활용

Domain List 규칙 그룹과 달리 Suricata 규칙 그룹은 관리자가 HOME_NET 변수를 Suricata 규칙을 작성할 때 HOME_NET 이라는 변수명 그대로 명시적으로 사용할 수 있습니다. 일반적으로 Suricata 규칙을 작성할 때에는 네트워크 트래픽이 내부에서 발생한 것인지, 외부에서 들어온 것인지 구분하는 것이 중요합니다. 즉, 정의한 규칙이 외부에서 유입되는 트래픽을 제어하기 위함인지, 혹은 반대로 내부에서 외부로 향하는 트래픽을 제어하기 위함인지를 구분하여 작성하는 것이 필요합니다. 이와 같은 목적을 위해 Suricata 규칙의 출발지 IP 에 해당하는 부분에 특정 IP 혹은 CIDR 를 지정하는 것이 가능하지만, 우리는 HOME_NET과 같은 변수를 이용하여 내부 네트워크 범위를 설정함으로써 규칙을 작성하는 과정에서 발생할 수 있는 오류을 최소화하고 내부 트래픽과 외부 트래픽을 트래픽 흐름에 따라 규칙을 작성하고 처리할 수 있도록 하는 것을 가능하게 할 수 있습니다.

ANF 의 Suricata 그룹 규칙에서 아래 그림과 같이 HOME_NET 변수를 설정할 수 있습니다. 그림에서 HOME_NET을 10.1.0.0/16으로 설정하였습니다. 참고로, 필요에 따라 HOME_NET 이외의 변수를 추가하여 설정할 수 있습니다.

그림6. Suricata 규칙 그룹에서의 HOME_NET설정

또한, 위의 다중 VPC 그림 처럼 HOME_NET 대역이 여러 개일 경우는 콤마(,)를 이용하여 10.1.0.0/16과 10.2.0.0/16을 아래의 그림처럼 설정할 수 있습니다.

그림7. Suricata 규칙 그룹에서의 HOME_NET 여러 대역 설정

위와 같이 HOME_NET을 설정하게 되면 아래 그림과 같이 해당 규칙 그룹에서 HOME_NET에 대해서 변수 설정이 된 것을 확인할 수 있습니다.

그림8. Suricata 규칙 그룹에서의 HOME_NET변수 확인

이제 우리는 HOME_NET 변수가 규칙에서 어떻게 활용되는지 알아보도록 하겠습니다.

참고. HOME_NET 변수를 위와 같이 10.1.0.0/16, 10.2.0.0/16으로 설정 했다고 가정해보도록 하겠습니다.

아래와 같이 비정상적인 http 요청 여부를 확인하기 위한 두 가지 예제 규칙이 있습니다. 이 2개의 규칙은 다른 목적지를 확인 하는 규칙으로 봐야할까요?

alert http $HOME_NET any → $EXTERNAL_NET any (msg:"[ALERT] Outbound HTTP Request Detected"; content:"User-Agent"; http_header; sid:1000003; rev:1;)
Bash
alert http $HOME_NET any → !$HOME_NET any (msg:"[ALERT] Outbound HTTP Request Detected"; content:"User-Agent"; http_header; sid:1000004; rev:1;)
Bash

아닙니다. 2개의 규칙은 목적지에 대해서는 다른 변수를 사용하고 있지만 실제로는 동일한 효과를 갖고 있습니다. 첫번째 규칙에서의 EXTERNAL_NET은 HOME_NET의 Negate 적용된 값을 따르기 때문에(HOME_NET 변수의 특징.C 참고) 10.1.0.0/16, 10.2.0.0/16(HOME_NET) → !(10.1.0.0/16, 10.2.0.0/16)으로 트래픽에 대해 규칙이 적용됩니다. 그리고 두번째 규칙도 !$HOME_NET를 사용하여 목적지에 대해 HOME_NET 이 아닌 대역을 지정하였으므로 결과적으로 첫번째 규칙과 동일하게 HOME_NET에서 HOME_NET에 포함되지 않은 대역으로 향하는 트래픽에 대해 규칙이 적용됩니다.

즉, Suricata 규칙을 사용할 때 “$EXTERNAL_NET” 과 “!$HOME_NET” 은 동일한 효과를 갖는다는 것을 알 수 있습니다. 하지만, 일반적으로는 “!$HOME_NET” 보다는 “$HOME_NET” 과 “$EXTERNAL_NET” 을 함께 사용하여 규칙을 생성합니다.

아래는 “$HOME_NET” 과 “$EXTERNAL_NET” 을 함께 사용하여 작성한 규칙들의 예시입니다.

drop tcp $HOME_NET any -> $EXTERNAL_NET 1024: (msg:"Backdoor.Win32.Arhost.D Checkin 2";flow:to_server,established;dsize:44<>160;content:"|03 01 03 1b 07 d0 41 1e 51 39 b5|";depth:11;reference:url,www.securelist.com/en/descriptions/24296755/Backdoor.Win32.IRCBot.tiz;classtype:command-and-control;sid:2803153;rev:1;metadata:created_at 2011_07_12,confidence Medium,signature_severity Major;)
drop tcp $HOME_NET any -> $EXTERNAL_NET [80,443,8080] (msg:"Backdoor.Win32.Wisscmd.A Checkin 1";flow:to_server,established;content:"P2PCMD.Local!";offset:10;depth:13;nocase;content:"P2PCMD.hello!";distance:3;within:13;nocase;reference:url,www.securelist.com/en/descriptions/16181661/Worm.Win32.AutoRun.hcg;reference:url,www.microsoft.com/security/portal/Threat/Encyclopedia/Entry.aspx?Name=Worm%3aWin32%2fAutorun.ABS;classtype:command-and-control;sid:2803177;rev:1;metadata:created_at 2011_07_15,signature_severity Major;)
drop tcp $HOME_NET any -> $EXTERNAL_NET 1024: (msg:"Backdoor.Win32.Wisscmd.A Checkin 2";flow:to_server,established;content:"P2PCMD.Local!";offset:10;depth:13;nocase;content:"P2PCMD.hello!";distance:3;within:13;nocase;reference:url,www.securelist.com/en/descriptions/16181661/Worm.Win32.AutoRun.hcg;reference:url,www.microsoft.com/security/portal/Threat/Encyclopedia/Entry.aspx?Name=Worm%3aWin32%2fAutorun.ABS;classtype:command-and-control;sid:2803178;rev:1;metadata:created_at 2011_07_15,signature_severity Major;)
Bash

보안담당자는 이처럼 Suricata 규칙을 작성할 때, $HOME_NET 과 “$EXTERNAL_NET” 을 사용하여 출발지와 목적지에 대한 반복적인 CIDR 입력을 최소화 할 수 있습니다.

Suricata 규칙 그룹에서는 HOME_NET 이외에도 다양한 변수를 사용할 수 있습니다. 그리고 각각의 변수는 조직의 요구사항에 따라 다양하게 활용될 수 있습니다. 그리고, 여러가지 변수 중 HOME_NET 변수를 지정하는 것을 통해 얻을 수 있는 주요 이점은 아래와 같습니다.

  1. 내부 네트워크 지정 : 내부 네트워크(HOME_NET)와 외부 네트워크(EXTERNAL_NET)를 구분하여 규칙을 더 효율적으로 적용할 수 있습니다. 예를 들어, 내부 사용자 IP(예: 10.0.0.0/8, 192.168.1.0/24)와 외부 트래픽을 구분하여 탐지 규칙을 설정할 수 있습니다.
  2. 네트워크 정책을 효과적으로 적용: 특정 네트워크만 보호 대상으로 설정하여 불필요한 트래픽을 분석하지 않도록 최적화할 수 있습니다.

맺음말

이 게시물에서는 ANF를 배포할 때 사용해야 하는 HOME_NET 변수의 사용 방법과 사용해야하는 이유에 대해 알아보았습니다. ANF의 HOME_NET 변수는 각 규칙에서 사용하는 출발지의 IP 범위를 하나 하나 수동으로 지정하는 대신 단일 변수를 사용하여 대상 네트워크의 범위를 정의할 수 있기 때문에 특히 Domain List 규칙과 Suricata 규칙에서는 아주 유용하게 사용할 수 있습니다. 또한, 보호 대상이 되는 모든 VPC CIDR 블록을 포함하도록 HOME_NET을 적절히 구성하면 별도의 수정없이 모든 보호 대상 네트워크가 자동으로 ANF 규칙의 적용을 받을 수 있는 환경을 설정할 수 있습니다.

다만, 이 게시물에서 살펴본 바와 같이 HOME_NET은 ANF가 배포되는 VPC의 CIDR를 기본값으로 할당하기 때문에 여러 VPC를 사용하는 네트워킹 환경에서는 반드시 적절한 HOME_NET 변수를 설정하여 다수의 규칙들을 사용하는 환경에서 예상치 못한 규칙간 오류의 가능성을 최소화하는 것이 필요합니다. 반대로 이야기하면, 적절한 HOME_NET 변수의 설정은 여러 VPC 가 배포되어 있는 환경에서 ANF에 사용된 규칙에서 발생되는 오류의 위험을 방지하고 일관된 보안 정책을 시행할 수 있는 환경을 제공합니다.

참고문서

Eunsu Shin

Eunsu Shin

신은수 Security Specialist Solutions Architect 는 보안 담당 SA로서 다양한 산업군의 고객들이 AWS 환경에서 수행해야하는 규정 준수 및 인증획득(개인정보보호법, 전자금융감독규정, ISMS-P 인증 등)을 위한 기술적인 도움을 제공해드리고 있습니다. 또한, 고객이 보다 안전하게 AWS 클라우드를 구성하고 운영할 수 있도록 다양한 모범 사례 공유, AWS 보안 서비스 교육 및 기술자문 등의 업무를 수행하고 있습니다.

Jaehyuk Yoo

Jaehyuk Yoo

유재혁 Technical Account Manager는 현재 게임 고객들이 AWS 클라우드에서 효율적인 운영과 최적화된 가이드를 제공함으로써 필요한 도움을 드리고 있습니다. 다양한 규모의 프로젝트에 참여했던 경험을 기반으로 고객에게 최적의 가이드를 제공함으로써 고객 비즈니스가 성장할 수 있도록 지원하고 있습니다.