여러 방법이 있겠지만 로그스태시는 다양한 데이터 처리가 가능한 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 길이 측정을 통해 정상과 비정상을 구분하는 것이 목적인 특허를 소개한 적이 있는데, 이런 식으로 데이터를 쌓고 분석하다 보면 비슷한 거 하나 나오지 않을까?
관련 글
ruby는 기특하게도 최종 저장되는 데이터 형식이 숫자이면, 알아서 필드 데이터 형식도 숫자로 지정해주기 때문에 매핑을 따로 건드리지 않아도 된다. 숫자이기 때문에 당연히 그래프도 그릴 수 있다. 다음은 변수 길이의 변화 추이.
전에 인공지능 이상징후 탐지 시스템?이란 글에서 URI 길이 측정을 통해 정상과 비정상을 구분하는 것이 목적인 특허를 소개한 적이 있는데, 이런 식으로 데이터를 쌓고 분석하다 보면 비슷한 거 하나 나오지 않을까?
관련 글
댓글 없음:
댓글 쓰기