카테고리 없음

Snort 룰로 HTTP GET Flooding 공격 탐지하기 – 예시와 함께 알아보는 침입 탐지 기법

호호녕 2025. 2. 4. 22:52

네트워크 침입 탐지 시스템(IDS)인 Snort는 다양한 공격 패턴을 탐지하기 위해 강력한 룰(rule) 구문을 제공합니다. 이 글에서는 Snort 룰의 기본 문법과 키워드에 대해 자세히 설명하고, HTTP GET Flooding 공격뿐만 아니라 다른 공격 예시를 통해 실제 환경에서 어떻게 활용할 수 있는지 알아보겠습니다.

1. Snort 룰 기본 문법

Snort 룰은 기본적으로 다음과 같은 구조를 가집니다:

action protocol source_ip source_port -> destination_ip destination_port (options)

각 요소의 의미는 다음과 같습니다:

  • action: 룰이 일치할 경우 수행할 동작을 지정합니다. (예: alert, log, pass 등)
  • protocol: 검사할 프로토콜을 지정합니다. (예: tcp, udp, icmp 등)
  • source_ipsource_port: 패킷의 출발지 IP와 포트를 지정합니다. any를 사용하면 모든 주소/포트에 대해 적용됩니다.
  • destination_ipdestination_port: 패킷의 목적지 IP와 포트를 지정합니다.
  • options: 룰의 세부 조건과 동작을 설정합니다. 여기에는 메시지, 컨텐츠 검사, 임계값, SID 등 다양한 키워드가 포함됩니다.

2. 주요 Snort 키워드 및 옵션 설명

옵션 부분에서 자주 사용되는 키워드는 아래와 같습니다:

  • msg:"메시지": 룰이 트리거될 때 출력할 설명 메시지를 설정합니다.
  • content:"문자열": 패킷 내에 특정 문자열이 포함되어 있는지 검사합니다.
  • http_method: HTTP 요청 메서드를 검사하며, 주로 GET이나 POST 요청을 탐지하는 데 사용됩니다.
  • flow:to_server,established: 서버로 향하는, 이미 확립된 연결에 대해서만 룰을 적용합니다.
  • threshold:type threshold, track by_src, count X, seconds Y: 특정 시간(Y초) 동안 동일 출발지에서 X개 이상의 이벤트가 발생하면 경고를 발생시키도록 설정합니다.
  • classtype: 탐지된 이벤트의 유형을 지정합니다. (예: attempted-dos, policy-violation 등)
  • sid: 룰의 고유 식별자입니다.
  • rev: 룰의 개정 번호를 나타냅니다.

3. HTTP GET Flooding 공격 탐지 예시

HTTP GET Flooding은 단기간에 대량의 GET 요청을 전송하여 웹 서버에 과부하를 일으키는 공격입니다. 아래는 이 공격을 탐지하기 위한 Snort 룰 예시입니다:

alert tcp any any -> any 80 (msg:"HTTP GET Flooding Attack Detected"; 
  flow:to_server,established; content:"GET"; http_method; threshold:type threshold, track by_src, count 50, seconds 10; 
  classtype:attempted-dos; sid:1000001; rev:1;)

룰 해설:

  • alert tcp any any -> any 80: 모든 TCP 트래픽 중 포트 80(HTTP)을 대상으로 합니다.
  • msg:"HTTP GET Flooding Attack Detected": 공격 탐지 시 출력될 메시지입니다.
  • flow:to_server,established: 이미 설정된 연결을 통한 서버로 향하는 트래픽만 검사합니다.
  • content:"GET"; http_method: HTTP GET 요청이 포함된 패킷을 식별합니다.
  • threshold:type threshold, track by_src, count 50, seconds 10: 10초 동안 동일 출발지 IP로부터 50개 이상의 GET 요청이 있을 경우 경고를 발생시킵니다.
  • classtype:attempted-dos: 서비스 거부 공격(DoS) 시도를 나타냅니다.
  • sid:1000001; rev:1;: 이 룰의 고유 식별자와 버전 정보입니다.

4. 추가 공격 탐지 예시 – TCP SYN Flood

TCP SYN Flood는 클라이언트가 다량의 SYN 패킷을 전송하여 서버의 연결 자원을 고갈시키는 공격입니다. 아래는 TCP SYN Flood 공격을 탐지하기 위한 간단한 Snort 룰 예시입니다:

alert tcp any any -> any 80 (msg:"TCP SYN Flood Attack Detected"; 
  flags:S; threshold:type threshold, track by_src, count 100, seconds 5; 
  classtype:attempted-dos; sid:1000002; rev:1;)

룰 해설:

  • alert tcp any any -> any 80: TCP 트래픽을 대상으로 하며, 목적지 포트는 80으로 설정되어 있습니다.
  • flags:S: TCP SYN 플래그가 설정된 패킷을 탐지합니다.
  • threshold:type threshold, track by_src, count 100, seconds 5: 5초 내 동일 출발지 IP에서 100개 이상의 SYN 패킷이 감지되면 경고를 발생시킵니다.
  • classtype:attempted-dos: DoS 공격으로 분류됩니다.
  • sid:1000002; rev:1;: 고유 식별자 및 버전 정보를 나타냅니다.

5. 키워드와 옵션의 중요성 및 활용

Snort 룰의 키워드와 옵션은 탐지의 정밀도를 결정하는 핵심 요소입니다. 예를 들어, content 키워드는 패킷 내 특정 문자열을 찾아내어 공격 패턴을 확인하고, threshold 옵션은 오탐지를 줄이면서도 실제 공격 상황에 맞춰 경고를 발생시킬 수 있도록 돕습니다. 이와 같이 각 키워드를 적절히 조합하면, 복잡한 공격 패턴도 효과적으로 탐지할 수 있습니다.

6. 결론

Snort 룰을 통해 네트워크 침입 탐지는 보다 정교하게 이루어질 수 있습니다. 이번 글에서는 HTTP GET Flooding과 TCP SYN Flood와 같은 대표적인 공격 예시를 소개하고, Snort 룰의 문법 및 주요 키워드에 대해 상세히 설명하였습니다. 여러분은 이 예시들을 참고하여 네트워크 환경에 맞게 룰을 수정 및 적용하고, 지속적인 모니터링을 통해 보안 위협에 효과적으로 대응할 수 있을 것입니다.

❓ 자주 묻는 질문(FAQ)

1. Snort 룰을 작성할 때 가장 중요한 고려 사항은 무엇인가요?

네트워크 트래픽의 특성과 공격 패턴을 정확하게 파악하여, 오탐지를 줄이면서 실제 공격 상황을 효과적으로 탐지할 수 있도록 임계값과 키워드를 설정하는 것이 중요합니다.

2. HTTP GET Flooding과 TCP SYN Flood 외에 어떤 공격을 탐지할 수 있나요?

Snort 룰은 SQL 인젝션, XSS, 포트 스캐닝, ICMP Flood 등 다양한 공격을 탐지할 수 있도록 여러 규칙을 작성할 수 있습니다.

3. Snort 룰에서 사용되는 content 키워드는 무엇을 의미하나요?

content 키워드는 패킷의 페이로드에서 특정 문자열이나 패턴을 찾기 위해 사용되며, 공격 패턴을 식별하는 데 중요한 역할을 합니다.

4. threshold 옵션은 어떻게 동작하나요?

threshold 옵션은 지정된 시간 내에 특정 조건이 몇 번 이상 발생했을 때 경고를 발생시키도록 설정할 수 있으며, 이를 통해 비정상적인 트래픽 폭주를 효과적으로 탐지합니다.

5. Snort 룰을 테스트하려면 어떻게 해야 하나요?

테스트 환경에서 트래픽 시뮬레이터나 실제 공격 패턴을 재현하여 룰을 적용해보고, Snort 로그를 통해 경고가 발생하는지 확인하면 됩니다.