2017년 10월 26일 목요일

Logstash 필터 ruby

이상징후 분석은 로그의 특정 상태를 숫자로 바꾼 후, 그 숫자를 측정하는 것이라고 했는데, 숫자로 바꾸기 어려운 상태도 있을 것이다. 예를 들면 웹로그의 URI 중 변수 길이 같은 거. 어떻게 하면 해당 데이터의 길이를 잴 수 있을까?


여러 방법이 있겠지만 로그스태시는 다양한 데이터 처리가 가능한 ruby 필터를 제공한다. 다음은 해당 필터를 이용해서 URI 변수 길이를 측정하는 Logstash 필터 설정.
filter {
 if [message] =~ "^#" {
  drop {}
 }

 grok {
  match => { "message" => "(?<timestamp>^.{19})\s\S+\s\S+\s(?<method>\S+)\s(?<w_path>\S*\/)(?<file>\S*)\s(?<var>\S+?)(\s|(\|.+\|)(?<error>\S+)\s)(?<dport>\S+)\s\S\s(?<sip>\S+)\s(?<agent>\S+)\s(?<status>\S+).+" }
 }

 grok {
  match => { "file" => ".+\.(?<ext>\S+)" }
 }

 if [var] == "-" {
 ruby {
  code => "event.set('var_len', 0)"
  }
 } else {
 ruby {
  code => "event.set('var_len', event.get('var').length)"
  }
 }

 mutate {
  add_field => { "var_decode" => "%{var}" }
 }

 urldecode { field => "var_decode" }
 date { match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ] }
 geoip { source => "sip" }
}

ruby는 event 객체를 이용해서 데이터에 접근하며, 스크립트 언어인 ruby의 (length 등) 메서드 기능을 이용해서 정말 다양하게 데이터를 지지고 볶을 수 있다. 다음은 변수 길이를 측정한 결과.


ruby는 기특하게도 최종 저장되는 데이터 형식이 숫자이면, 알아서 필드 데이터 형식도 숫자로 지정해주기 때문에 매핑을 따로 건드리지 않아도 된다. 숫자이기 때문에 당연히 그래프도 그릴 수 있다. 다음은 변수 길이의 변화 추이.


전에 인공지능 이상징후 탐지 시스템?이란 글에서 URI 길이 측정을 통해 정상과 비정상을 구분하는 것이 목적인 특허를 소개한 적이 있는데, 이런 식으로 데이터를 쌓고 분석하다 보면 비슷한 거 하나 나오지 않을까?

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스