2018년 10월 7일 일요일

Logstash 필터 ruby - 2nd

다음은 윈도우 로그온 이벤트의 로그온 타입 분류.


로그온 타입 유형이 숫자로 기록되기 때문에 실제 로그를 보면 무슨 유형인지 한눈에 파악하기 어려운데, 이때 로그스태시의 다양한 필터 기능을 이용하면 가독성을 높일 수 있다.

filter { 
  if [event_data][LogonType] == "0" {
    mutate { replace => { "[event_data][LogonType]" => "system_start" } }
  }

  if [event_data][LogonType] == "2" {
    mutate { replace => { "[event_data][LogonType]" => "interactive" } }
  }

  if [event_data][LogonType] == "3" {
    mutate { replace => { "[event_data][LogonType]" => "network" } }
  }

  if [event_data][LogonType] == "4" {
    mutate { replace => { "[event_data][LogonType]" => "batch" } }
  }

  if [event_data][LogonType] == "5" {
    mutate { replace => { "[event_data][LogonType]" => "service" } }
  }

  if [event_data][LogonType] == "7" {
    mutate { replace => { "[event_data][LogonType]" => "unlock" } }
  }

  if [event_data][LogonType] == "8" {
    mutate { replace => { "[event_data][LogonType]" => "network_cleartext" } }
  }

  if [event_data][LogonType] == "9" {
    mutate { replace => { "[event_data][LogonType]" => "new_credentials" } }
  }

  if [event_data][LogonType] == "10" {
    mutate { replace => { "[event_data][LogonType]" => "rdp" } }
  }

  if [event_data][LogonType] == "11" {
    mutate { replace => { "[event_data][LogonType]" => "cache_interactive" } }
  }
}

문제는 로그스태시가 if 조건문만을 지원한다는 것. 조건에 따라 다양한 설정 변경이 필요할 때 부득이하게 설정이 길어질 수 있다는 얘기. 이때 ruby 필터를 이용하면 좀 더 간결한 설정이 가능하다. 

filter {
  ruby {
    code => '
      num = 0
      for i in ["system_start","unknown","interactive","network","batch","service","unknown","unlock","network_cleartext","new_credentials","rdp","cache_interactive"]
        if event.get("[event_data][LogonType]").match("#{num}")
          event.set("logon_type","#{i}")
        end
        num += 1
      end
    ' 
  }
}

num 변수가 0에서 시작, 1씩 증가할 때마다 해당 순서에 맞는 문자열을 for문 리스트에서 하나씩 가져와 새로 만든 logon_type 필드에 추가하는 방식.

ruby 스크립트를 잘 몰라서 좀 헤맸는데 'if event.get("[event_data][LogonType]") == num' 구문은 동작하지 않는다. == 연산자는 숫자만 연산하는 모양. 변수 'num'의 값은 숫자이지만 로그스태시가 문자로 인식하기 때문에(..) 결국 'match' 메서드로 해결.

댓글 없음:

댓글 쓰기

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