본문 바로가기
개인 공부/개발

[logstash] grok filter를 이용한 apache log와 snort log parsing

by 아메리카노와떡볶이 2022. 11. 7.
728x90
grok filter를 이용한 apache log와 snort log parsing

 

logstash의 pipe line을 구성하다보면 log를 parsing 할 수 있는 grok filter plugin 를 만나게 됩니다. 

 

이번 포스트에서는 apache log와 snort log 예시를 가지고 grok filter를 작성해보겠습니다.

grok filter를 작성할 때는 kibana에서 제공해주는 grok debugging 기능이 매우 유용합니다.

 

왼쪽 메뉴에서 공구모양이 dev tools 입니다. dev tools에서 Grok Debugger를 확인할 수 있습니다.

 

Grok filter rules

먼저 Grok 플러그인을 사용할 때 유용한 패턴들을 몇가지 알아봅시다.

 

  • WORD - 단일 단어에 일치하는 패턴
  • NUMBER - 양이나 음의 정수 또는 부동 소수점에 일치하는 패턴.
  • POSINT - 양의 정수와 일치하는 패턴
  • IP - IPv4 또는 IPv6 IP 주소와 일치하는 패턴
  • NOTSPACE - 스페이스가 아닌 모든 것과 일치하는 패턴
  • SPACE - 모든 수의 연속적 스페이스와 일치하는 패턴
  • DATA - 제한된 양의 모든 종류의 데이터와 일치하는 패턴
  • GREEDYDATA - 모든 남아 있는 데이터와 일치하는 패턴

그리고 기본적으로 log parsing은 데이터 정규화 과정입니다. 따라서 공백처리를 위한 \s, escape 처리 등의 개념은 알고 있어야합니다.  

Apache log 

access.log는 apache 서버에 대한 접근 로그로, 서버가 처리하는 모든 요청을 기록합니다.

error.log는 오류로그로 진단정보와 요청을 처리하는 도중 발생한 오류를 기록합니다.

 

아래는 access log 예시입니다.

 

apache의 경우 매우 편리한 "COMBINEDAPACHELOG"  패턴이 존재합니다. 하지만 logstash 7.x 버전에서 해당 패턴이 parsing하는 agent가 다른 값과 충돌하는 오류가 발생하는 것 같아서

"COMMONAPACHELOG" 를 사용하고 브라우저 정보를 식별할 수 있는 요소를 추가했습니다.

 

%{COMMONAPACHELOG} %{QS:referrer} %{QS:browser}+%{GREEDYDATA:extra_fields}

snort log

다음은 snort log입니다. snort는 대표적인 IDS 오픈소스로 네트워크 레벨에서 미리 지정한 룰셋을 감지고 위험 패킷을 탐지합니다.

 

 

먼저 snort 로그에 대한 parsing table입니다.

내용 의미 grok pattern
11/05-03:02:07.338668 timestamp %{NOTSPACE:snort_timestamp}
1 gid %{NUMBER:gid}
60401 sid %{NUMBER:sid}
1 rev %{NUMBER:rev}
MALWARE-CNC Php.Webshell.DToolPro inbound connection attempt event signature %{GREEDYDATA:signature}
A Network Trojan was Detected event classificaiton %{GREEDYDATA:class}
1 Priority %{NUMBER:priority}
TCP proto %{WORD:proto}
192.168.5.131 src_ip %{IP:src_ip}
44964 src_port %{NUMBER:src_port}
192.168.5.129 dest_ip %{IP:dest_ip}
80 dest_port %{NUMBER:dest_port}

 

snort log에 대한 grok filter 예시와 결과 입니다.

 

 

 

복잡해보일 수 있지만 한번만 따라서 작성해보면 이해하기 쉽습니다.

 

감사합니다.

728x90

댓글