AWS 기술 블로그

AWS Network Firewall 모범 사례 #3 : Suricata 규칙 그룹 사용

1. 시작하며

이 게시물은 AWS Network Firewall(이하 “ANF”) 모범 사례 시리즈의 세 번째 게시물로 ANF에서 사용할 수 있는 여러가지 규칙 그룹 중 Suricata Compatible Rule String 규칙 그룹(이하 “Suricata 규칙 그룹”)을 사용해야 하는 이유와 특징 및 활용 사례에 대해서 알아보도록 하겠습니다.

ANF는 이를 사용하는 보안관리자가 ANF를 통과하는 트래픽을 제어하고자 하는 목적에 따라 다양한 규칙 작성 방법을 제공합니다. 간단한 Protocol + IP + Port 수준의 제어가 필요하다면, Standard 규칙 그룹을 사용할 수 있고, HTTP/S에 대한 특정 도메인을 제어하고자 하는 경우라면, Domain List 규칙 그룹을 사용할 수 있습니다. 하지만, 제어의 범위가 이 두가지 영역을 넘어서게 된다면 필수적으로 Suricata 규칙 그룹을 사용해야 합니다. 물론, 관리자가 원한다면 Standard 규칙 그룹과 Domain List 규칙 그룹, 그리고 Suricata 규칙 그룹을 하나의 ANF 정책에서 혼용하여 사용하는 것도 가능합니다. 하지만, 하나의 정책에서 여러가지 유형의 규칙 그룹을 혼용하여 사용하다 보면, 경우에 따라 각 규칙 그룹에 속해 있는 규칙들의 특성이 반영되어 관리자가 의도하지 않았던 트래픽 처리 패턴을 보이는 경우가 나타날 수도 있습니다. 따라서, 여러가지 규칙 그룹이 사용되어야 하고 ANF에 적용될 규칙의 수가 많거나 복잡하다면 가급적 여러가지 규칙 그룹을 혼용해서 사용하는 것보다 Suricata 규칙 그룹 한 가지로 통일하여 규칙을 작성하고 적용하는 것을 권장합니다. 이 게시글에서는 각 규칙 그룹의 설정 방법과 특징을 살펴보고, 왜 Suricata 규칙 그룹을 사용해야 하는지 그 이유와 Suricata 규칙을 작성하는 방법에 대해 설명하도록 하겠습니다.

2. Suricata 규칙 그룹의 사용

ANF의 정책에 여러 가지 규칙 그룹을 혼용해서 사용하는 것보다 Suricata 규칙 그룹 하나만 사용하는 것이 효율적이라는 것을 설명하기 위해 각 규칙 그룹이 어떻게 동작 하는지 예시를 통해 살펴 보도록 하겠습니다.

2.1 Standard 규칙 그룹

먼저, 가장 간단하고 범용적으로 사용될 수 있는 Standard 규칙 그룹에 대해 살펴보도록 하겠습니다.

Standard 규칙 그룹은 ANF의 Stateful Engine에서 제공하는 규칙 그룹 중 하나로 Stateful한 트래픽 처리를 기본으로 합니다. 그리고, 보안 관리자는 API 혹은 아래와 같은 AWS 관리 콘솔을 통해 “국가”, “프로토콜”, “IP”, “Port”에 대한 기본 규칙을 작성한 후 추가적으로 옵션을 통해 “sid”, “msg”, “flow” 등을 설정할 수 있습니다.

그림 1. Standard 규칙 그룹 설정 화면

예를 들어, Standard 규칙 그룹을 이용해 인터넷에서 유입되는 특정 출발지 IP 혹은 출발지 IP 대역에 대해서만 HTTPS 트래픽을 허용하고자 한다면 아래와 같은 규칙을 생성할 수 있습니다.

그림 2. Standard 규칙 예시

위 예시에 사용된 규칙을 Suricata 규칙으로 변환해 본다면 다음과 같이 변환이 가능합니다.

pass tls 12.12.12.12/32 any 10.0.0.0/16 443 (sid:1;)
Bash

주의) Suricata 규칙으로 변환된 규칙 예시는 Standard 규칙 그룹의 이해를 돕기 위한 것으로 ANF 내부적으로 사용되는 실제 규칙과는 차이가 있을 수 있습니다.

위 규칙 예시에서는 사용되지 않았지만 Standard 규칙에서도 옵션을 통해 몇 가지 Suricata 키워드를 지원하고 있습니다. 즉, AWS 관리 콘솔을 통해 Standard 규칙을 생성할 때 옵션을 이용하면 다음과 같은 규칙을 생성할 수도 있습니다.

pass tls 12.12.12.12/32 any 10.0.0.0/16 443 (msg:”demo standard rule; flow:to_server, established; sid:1;)
Bash

참고로, AWS 관리 콘솔에서 사용 가능한 Suricata 규칙의 Keyword는 아래와 같습니다.

  • sid – 규칙의 고유 id를 부여하는 것으로 로그에서 특정 규칙을 검색하는데 활용하실 수 있습니다.
  • msg – 규칙에 대한 설명을 부여하는 키워드로 특정 규칙에 대한 내용을 관리자가 관리 콘솔이나 로그에서 직관적으로 확인할 수 있도록 사용하실 수 있습니다.
  • flow – 트래픽의 연결 상태에 따라 규칙의 처리 순서를 결정하는데 사용하실 수 있습니다.

우리가 살펴본 바와 같이 Standard 규칙 그룹은 API 혹은 AWS 관리 콘솔을 통해 제공되며 간단한 요구 사항을 만족하기 위해 간편하게 사용할 수 있는 규칙 그룹입니다. 그리고, Standard 규칙 그룹은 ANF 내부적으로는 Suricata 규칙을 이용하여 구현되어 있으며 Standard 규칙이 생성되면 내부적으로는 이를 구현하는 Suricata 규칙이 생성되어 Standard 규칙 그룹에 적용되도록 동작하고 있습니다.

2.2 Domain List 규칙 그룹

이번에는 VPC에서 아웃바운드 도메인 통제를 위해 사용하는 Domain List 규칙 그룹에 대해 살펴보도록 하겠습니다.
Domain List 규칙 그룹은 HTTP/S에 대한 VPC 내 자원들의 도메인을 이용한 아웃바운드 통신 제어를 위해 만들어진 규칙 그룹으로, 아래 그림과 같이 Standard 규칙 그룹에 비해 규칙 작성을 위한 옵션이 아주 단순합니다.

그림 3. Domain List 규칙 그룹 설정 화면

관리자는 아웃바운드 트래픽의 검사 대상이 되는 프로토콜의 종류(HTTP or HTTPS)를 선택하고 허용(Allow)하거나 차단(Deny) 여부를 결정한 후 대상 도메인을 등록하면 규칙 등록이 완료됩니다.

참고) Domain List 규칙 그룹은 VPC에서 아웃바운드로 나가는 트래픽에 대한 검사만 수행하며 인바운드 트래픽은 Domain List의 검사 대상이 아닙니다.

허용 규칙 예시

아래 그림은 Domain List 의 허용 규칙 예시입니다. 이 예시는 “.amazon.com”과 “.amazonaws.com” 도메인을 등록하여 이 두 도메인을 포함하는 모든 하위 도메인을 허용하도록 작성한 규칙입니다.

참고) “.”으로 시작하는 도메인을 등록하면 해당 도메인과 그 하위 도메인 모두가 규칙에 적용됩니다.

그림 4. Domain List 허용 규칙

Domain List 규칙 그룹에 적용된 예시 규칙을 Suricata 규칙으로 변환해보면 다음과 같습니다.

pass http $HOME_NET any -> $EXTERNAL_NET any (http.host; content:".amazon.com"; endswith; nocase; flow: to_server; sid:6;)
pass tls $HOME_NET any -> $EXTERNAL_NET any (ssl_state:client_hello; tls.sni; content:".amazon.com"; endswith; nocase; flow: to_server; sid:5;)
pass http $HOME_NET any -> $EXTERNAL_NET any (http.host; content:".amazonaws.com"; endswith; nocase; flow: to_server; sid:4;)
pass tls $HOME_NET any -> $EXTERNAL_NET any (ssl_state:client_hello; tls.sni; content:".amazonaws.com"; endswith; nocase; flow: to_server; sid:3;)
drop http any any any any (sid:2;rev:1;)
drop tls any any any any (sid:1;rev:1;)
Bash

Suricata 규칙으로 변환된 규칙 내용을 보면 특이한 사항이 하나 있습니다. 바로 “Drop” 규칙이 추가되어 있다는 것인데요. Domain List 규칙 그룹에는 별도로 Drop 규칙을 설정하는 항목이 없습니다. 하지만, Suricata로 변환했을 때는 Drop 규칙이 생겼는데요. 이렇게 Suricata 규칙으로 변환했을 때 Drop 규칙이 추가된 것은 Domain List의 Allow 동작 방식 때문입니다. Domain List 규칙 그룹을 생성할 때 Action을 “Allow”로 선택했다는 것은 매칭된 도메인은 허용하고, 그렇지 않은 도메인은 차단한다는 것을 의미합니다. 즉, 매칭되지 않은 트래픽을 처리할 무엇인가가 필요하다는 것인데요. 관리자가 직접 눈으로 확인할 수는 없지만 ANF는 이 차단 규칙을 내부적으로 별도로 생성하여 관리자가 생성한 규칙에 매칭되지 않는 트래픽을 차단하는 용도로 사용합니다.

차단 규칙 예시

아래 그림은 Domain List의 차단 규칙 예시입니다. 이 예시는 “chatgpt.com” 도메인을 등록하여 이 도메인에 대한 접속을 차단하도록 작성한 규칙입니다.

그림 5. Domain List 차단 규칙

Domain List 규칙 그룹에 적용된 예시 규칙을 Suricata 규칙으로 변환해보면 다음과 같습니다.

drop http $HOME_NET any -> $EXTERNAL_NET any (http.host; content:"chatgpt.com"; nocase; flow: to_server; sid:2;)
drop tls $HOME_NET any -> $EXTERNAL_NET any (ssl_state:client_hello; tls.sni; content:"chatgpt.com"; nocase; flow: to_server; sid:1;)
Bash

이 예시 규칙은 “허용 규칙”과는 다르게 규칙의 목적 자체가 차단이므로 관리자가 작성한 규칙 이외에 추가적으로 생성되는 내부 규칙은 없습니다.

Domain List 규칙 사용 시 고려 사항

Domain List 규칙 그룹은 Standard 규칙 그룹이나 Suricata 규칙 그룹에 비해 사용할 수 있는 옵션이 많지 않습니다. 이로 인해 다음과 같은 상황을 고려해야 합니다.
A. 로깅 – ANF는 이 게시글의 작성 시점인 2025년 3월에는 Pass 규칙에 대한 로그를 지원하지 않습니다. 따라서, Domain List 규칙 그룹의 허용 규칙에 매칭되는 로그를 수집할 수 없습니다.
B. 차단 시 Drop 사용 – Domain List 규칙 그룹은 트래픽 차단 시 Drop 액션만 사용합니다. 따라서, 차단 시 Reset을 보내는 Reject 액션을 사용할 수 없습니다.

2.3 Suricata 규칙 그룹

마지막으로, Suricata 규칙 그룹에 대해 살펴보도록 하겠습니다.

Suricata 규칙 그룹은 모든 트래픽에 대해 보안관리자가 원하는 거의 모든 규칙들을 생성하여 사용할 수 있는 환경을 제공합니다. 규칙 작성 시에는 아래 그림과 같이 변수에 대한 등록화면과 함께 빈 칸에 Suricata 규칙을 입력하여 다양한 규칙들을 구현할 수 있습니다.

그림 6. Suricata 규칙 그룹 설정 화면

그럼, 이제 ANF에서 제공하는 규칙 그룹 중 가장 유연하게 규칙을 작성할 수 있는 Suricata 규칙 그룹 사용을 위해 알아야하는 내용들에 대해 살펴보도록 하겠습니다.

Suricata 규칙의 구조

ANF의 Suricata 규칙 그룹에서 사용하는 Suricata 규칙은 아래와 같이 오픈소스 Suricata 엔진에서 사용하는 규칙과 동일한 구조를 사용합니다.

  • Action – ANF에서 지원하는 Pass, Drop, Alert과 Reject 동작 중 하나를 지정합니다.
  • Header – 프로토콜, IP, Port 및 트래픽의 방향성을 지정합니다.
  • Option – 다양한 키워드를 사용하여 규칙의 상세 매칭 조건 등을 지정합니다.
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET Request Containing Rule in URI"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)
Bash

참고) ANF는 Suricata 규칙 작성 시 오픈소스 Suricata 엔진에서 제공하는 대부분의 기능을 지원하지만 일부 기능은 지원하지 않습니다. 보다 자세한 사항은 AWS Network Firewall에서의 Suricata 제약사항을 참고하시기 바랍니다.

Suricata 규칙의 검사 순서

Suricata 규칙은 내부적으로 다양한 조건에 의하여 규칙을 검사하는 알고리즘을 가지고 있습니다. 규칙에 사용되는 모든 헤더나 키워드가 동일한 경우라면, Strict Order 인 경우에는 Top Down 방식으로 규칙이 적용되고 Action Order인 경우에는 사용된 Action에 따라 규칙 검사가 결정됩니다. 하지만, 규칙에서 사용하는 프로토콜이나 각종 키워드의 사용이 다를 경우에는 Strict Order나 Action Order 내에서도 다양한 규칙 검사 조건이 적용될 수 있습니다.

  • Protocol에 따른 우선 순위 – 규칙에 사용된 Protocol에 따라 우선 순위가 적용됩니다. Strict Order를 사용하는 환경에서 낮은 순위의 규칙이 있다고 하더라도, 해당 규칙이 낮은 레이어의 프로토콜을 사용하는 경우 높은 레이어의 프토토콜이 정의된 규칙 보다 먼저 검사가 수행됩니다.
  • Flow 키워드에 따른 우선 순위 – 낮은 레이어의 프로토콜이 적용된 규칙이라고 하더라도, “flow: established” 와 같은 키워드 옵션을 사용하는 경우 높은 레이어의 프로토콜을 사용하는 규칙과 동일한 규칙 적용 순서를 가지게 할 수 있습니다.
  • 이외에도 여러가지 키워드의 조합에 따라 규칙 검사 조건이 변경될 수 있습니다.

Pass 규칙 매칭 시 로깅

아웃바운드 트래픽에 대한 도메인 통제를 가능하게 하는 Domain List 규칙 그룹은 제공되는 UI 를 통해 편리하게 규칙을 정의할 수 있으나, 허용된 트래픽에 대해서 로깅을 할 수 없다는 단점을 가지고 있습니다. 하지만, Suricata 규칙 그룹에서는 아래와 같이 Pass 규칙보다 Alert 규칙이 먼저 검사되도록 구성함으로써 허용된 트래픽에 대해서도 로그를 남기도록 할 수 있습니다.

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET Request Containing Rule in URI"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:2; rev:1;)
pass http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET Request Containing Rule in URI"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:1; rev:1;)
Bash

SID를 이용한 문제 해결

ANF는 “Flow Log”와 “Alert Log”를 통해 관리자에게 ANF 운영에 대한 다양한 정보와 함께 인사이트를 제공합니다. 특히 “Alert Log”의 경우 Stateful 엔진에서 처리되는 규칙 중 “Drop”, “Alert”, “Reject” 액션을 사용하는 규칙에 대한 매칭 로그를 제공합니다. 따라서, ANF 운영 중 다양한 문제해결을 위해 이러한 로그들을 활용할 수 있습니다. 특히, 특정 규칙에 매칭되는 트래픽에 대한 정보를 로그로 확인하고자 하는 경우 “Alert Log”는 유용하게 사용될 수 있습니다. Amazon CloudWatch나 Amazon S3에 저장된 로그는 다양한 쿼리/분석 서비스를 통해 활용될 수 있으며, 이 과정에서 “sid” 키워드를 사용하면 관리자는 자신이 원하는 특정 규칙과 관련한 로그를 손쉽게 찾아내고, 그 내용을 확인할 수 있습니다.

  • Standard 규칙 그룹에서의 sid – sid가 자동으로 할당됩니다. 필요한 경우 옵션에서 수정할 수 있습니다.
  • Domain List 규칙 그룹에서의 sid – sid가 자동으로 할당됩니다.
  • Suricata 규칙 그룹에서의 sid – 관리자가 sid를 설정해야 합니다. 따라서, Suricata 규칙 그룹을 사용하는 경우 관리자는 항상 명시적인 sid를 관리해야 하므로 sid 키워드에 대한 통합적인 관리가 가능합니다.

복잡한 요구 사항의 예시 및 이를 만족할 수 있는 Suricata 규칙 예시

위에서 설명한 Standard 및 Domain List 규칙으로는 구현할 수 없는 다소 복잡한 요구사항이 있는 경우, Suricata 규칙을 활용하면 구현할 수 있습니다. 몇 가지 복잡한 요구 사항에 대해 Suricata 규칙으로 구현한 예제를 살펴보도록 하겠습니다.

(예시 1) HTTP 헤더와 메소드 복합 검사

요구사항: 특정 User-Agent를 사용하면서 동시에 비정상적인 HTTP 메소드를 사용하는 요청 차단

Standard/Domain list로 불가능한 이유

  • HTTP 헤더 필드 검사와 HTTP 메소드를 동시에 검사할 수 없음
  • 복합 조건 설정 불가

Suricata 규칙 예시

alert http any any -> any any (
    msg:"Suspicious HTTP Request with Custom User-Agent";
    flow:established,to_server;
    http.method; content:"CONNECT";
    http.header; content:"User-Agent: MaliciousBot"; 
    sid:1;
    rev:1;
)
Bash

규칙 설명

  • http.method; content:"CONNECT" – HTTP CONNECT 메소드 사용을 탐지합니다. CONNECT 메소드는 일반적으로 프록시 서버를 통한 터널링에 사용되며, 악의적인 용도로 사용될 수 있습니다.
  • http.header; content:"User-Agent: MaliciousBot" – HTTP 헤더에서 특정 User-Agent 문자열을 검사합니다. 악성 봇이나 자동화된 공격 도구들은 종종 특정 User-Agent를 사용하므로, 이를 탐지하여 차단하는 데 사용할 수 있습니다.
  • flow:established,to_server – 클라이언트에서 서버로 향하는 established 상태의 연결만을 검사합니다.

(예시 2) 포트 범위 및 페이로드 패턴 검사

요구사항: 특정 포트 범위(예: 1024-65535)에서 발생하는 악성 payload 패턴을 포함한 트래픽 차단

Standard/Domain list로 불가능한 이유

  • 포트 범위와 payload 패턴을 동시에 검사할 수 없음
  • 정교한 payload 검사 기능 제한

Suricata 규칙 예시

alert tcp any any -> any 1024:65535 (
    msg:"Malicious Payload Detection on ephemeral ports";
    flow:established;
    content:"|00 00 FF FF|evil_pattern";
    pcre:"/^.{4}evil_pattern/";
    sid:2;
    rev:1;
)
Bash

(예시 3) DDoS 공격 탐지

요구사항: 다양한 유형의 DDoS 공격 탐지 및 차단 (LOIC, SYN Flood, HTTP Flood)

Standard/Domain list로 불가능한 이유

  • 특정 시간 동안의 트래픽 양을 측정하고 임계값 기반 탐지 불가
  • 패킷의 페이로드 내용과 크기를 동시에 검사할 수 없음
  • 복잡한 탐지 필터 설정 불가

Suricata 규칙 예시 1 (LOIC DDoS)

drop udp $HOME_NET any -> $EXTERNAL_NET any (
    msg:"UDP Based DDoS LOIC Attack Detection";
    dsize:12;
    content:"U dun goofed";
    detection_filter: track by_src, count 5, seconds 30;
    sid:3;
    rev:4;
    metadata:created_at 2025_03_01,confidence Medium,signature_severity Major;
)
Bash

규칙 설명

  • drop udp – UDP 트래픽을 차단하는 규칙입니다.
  • dsize:12 – 패킷 페이로드 크기가 정확히 12바이트인 패킷만 매칭합니다.
  • content:"U dun goofed" – LOIC 공격 도구의 기본 시그니처를 탐지합니다.
  • detection_filter: track by_src, count 5, seconds 30 – 30초 동안 동일한 출발지에서 5회 이상 발생할 경우에만 규칙이 트리거됩니다.

Suricata 규칙 예시 2 (SYN Flood)

alert tcp any any -> $HOME_NET any (
    msg:"Possible SYN Flood - TCP SYN Attack Detected";
    flags:S,12;
    flow:stateless;
    threshold: type both, track by_dst, count 5000, seconds 5;
    sid:4;
    rev:1;
)
Bash

규칙 설명

  • flags:S,12 – SYN 플래그만 설정된 TCP 패킷을 탐지합니다.
  • flow:stateless – 상태를 추적하지 않고 모든 패킷을 검사합니다.
  • threshold: type both, track by_dst, count 5000, seconds 5 – 5초 동안 동일한 목적지로 5000개 이상의 SYN 패킷이 발생할 경우 알림을 생성합니다.

Suricata 규칙 예시 3 (HTTP Flood)

alert http any any -> $HOME_NET any (
    msg:"HTTP Flood Attack Detected";
    flow:established,to_server;
    http.method; content:"GET";
    threshold: type both, track by_src, count 300, seconds 60;
    classtype:attempted-dos;
    sid:5;
    rev:1;
)
Bash

규칙 설명

  • http.method; content:"GET" – HTTP GET 요청을 탐지합니다.
  • flow:established,to_server – 서버로 향하는 정상적으로 수립된 연결만 검사합니다.
  • threshold: type both, track by_src, count 300, seconds 60 – 60초 동안 동일한 출발지에서 300회 이상의 GET 요청이 발생할 경우 알림을 생성합니다.

참고) threshold 키워드는 ANF에서 공식적으로 지원되지는 않습니다. 다만, 일부 환경의 경우 제한적으로 사용하실 수 있습니다. “threshold 키워드의 사용”과 관련한 자세한 사항은 AWS에 문의 바랍니다.

3. 맺음말

지금까지 살펴본 것처럼 AWS Network Firewall의 규칙 그룹들은 각각 고유한 특성과 장단점을 가지고 있습니다. Standard 규칙 그룹과 Domain List 규칙 그룹은 간단한 트래픽 제어에 특화되어 있어 사용이 간편하지만, 복잡한 보안 요구사항을 충족시키기에는 다소 제한적일 수 있습니다. 반면, Suricata 규칙 그룹은 HTTP 헤더 검사, 페이로드 패턴 매칭, DNS 쿼리 분석 등 고급 기능을 구현할 수 있으며, Pass 규칙에 대한 로깅이 가능하고 SID를 통한 효율적인 트러블슈팅도 가능한 장점이 있습니다. 특히, 여러 규칙 그룹을 혼용할 경우 발생할 수 있는 예기치 않은 동작을 방지하기 위해, 복잡한 네트워크 환경에서는 Suricata 규칙 그룹으로 통합하여 관리하는 것이 바람직합니다. 결과적으로, 세밀한 트래픽 제어와 높은 요구사항의 보안 정책 구현이 필요한 엔터프라이즈 환경에서는 Suricata 규칙 그룹의 활용을 적극적으로 활용하는 것이 권장됩니다.

참고 자료

Eunsu Shin

Eunsu Shin

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

Seungryel Sim

Seungryel Sim

심승렬 Cloud Support Engineer는 다양한 AWS 네트워크 서비스들에 대해 Subject Matter Expert로서 기술지원을 드리며 고객분들에게 AWS 서비스들을 정확히 이해하고 불편함 없이 사용하실 수 있도록 다양한 팀과 함께 기술 세션등을 진행하고 있습니다.