2020년 11월 16일 월요일

winlogbeat-security.js - 2nd

로그스태시는 사전 정의되지 않은 모든 데이터를 문자열로 인식한다. 전에 로그스태시가 숫자를 인식한다고 했었는데 착각이었음 다음은 winlogbeat가 쏴주는 5156 이벤트(네트워크 연결 허용) 중 목적지 포트가 53인 이벤트만을 dns-request 인덱스에 저장하는 파이프라인 설정.
input { 
 beats { port => 5044 } 
}
  
output {
 stdout {}
 if [winlog][event_data][DestPort] == 53 {  
  elasticsearch {    
   hosts => "192.168.56.1"    
   index => "dns-request"   
  }
 } 
}

하지만 인덱스는 만들어지지 않는다. 로그스태시 실행 결과를 보니 SourcePort, DestPort 모두 값이 큰따옴표가 씌워진 채 전달되고 있음. 숫자가 아닌 문자로 넘어오고 있다는 얘기. 

[2020-11-10T22:33:58,508][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-11-10T22:33:58,576][INFO ][org.logstash.beats.Server][main][f0b7fe9f6237399673b5dbc8719ce2c4ba8f397236df9529f752390bf390b730] Starting server on port: 5044
[2020-11-10T22:33:58,815][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
{
          "tags" => [
        [0] "beats_input_raw_event"
    ],
    "@timestamp" => 2020-11-10T13:33:57.245Z,
      "@version" => "1",
        "winlog" => {
          "event_id" => 5156,
        "event_data" => {
              "SourceAddress" => "192.168.56.1",
                "Application" => "\\device\\harddiskvolume3\\elk\\jdk-14\\bin\\java.exe",
                  "Direction" => "%%14593",
                "DestAddress" => "192.168.56.1",
                  "LayerRTID" => "48",
                  "ProcessID" => "17044",
                 "SourcePort" => "9996",
                 "FilterRTID" => "66198",
                  "LayerName" => "%%14611",
                   "Protocol" => "6",
            "RemoteMachineID" => "S-1-0-0",
               "RemoteUserID" => "S-1-0-0",
                   "DestPort" => "9200"
        }
    }
}

output 조건을 숫자가 아닌 문자를 검사하게끔 바꿔주면 인덱스가 만들어진다. 저장된 데이터형은 모두 문자열.
if [winlog][event_data][DestPort] == "53"

만약 데이터형을 숫자로 바꿔주고 싶다면 파이프라인 설정에 mutate 플러그인 등을 이용한 데이터형 변환 설정을 추가해주면 된다. 

다른 방법은 없나? 

winlogbeat를 엘라스틱과 다이렉트로 연동하면 데이터 형식에 따라 필드별로 다른 데이터형이 지정된다는 사실을 알 수 있다.
 

ECS가 반영되면서 숫자가 저장되는 포트 관련 필드의 데이터형이 모두 숫자형으로 지정된 것. 그런데 왜 로그스태시가 받을 땐 문자열이지? 다음은 winlogbeat 단독 실행 결과.
PS D:\ELK\winlogbeat-7.10.0-windows-x86_64> .\winlogbeat.exe
{
  "@timestamp": "2020-11-10T13:39:10.545Z",
  "@metadata": {
    "beat": "winlogbeat",
    "type": "_doc",
    "version": "7.10.0"
  },
  "winlog": {
    "event_id": 5156,
    "event_data": {
      "RemoteMachineID": "S-1-0-0",
      "DestAddress": "239.255.255.250",
      "FilterRTID": "66199",
      "SourceAddress": "192.168.56.1",
      "SourcePort": "57163",
      "Protocol": "17",
      "ProcessID": "5960",
      "Application": "\\device\\harddiskvolume10\\program files (x86)\\google\\chrome\\application\\chrome.exe",
      "LayerName": "%%14611",
      "Direction": "%%14593",
      "LayerRTID": "48",
      "RemoteUserID": "S-1-0-0",
      "DestPort": "1900"
    }
  }

}

SourcePort, DestPort 모두 숫자가 아닌 문자로 전달되고 있으며, 새로운 필드가 추가되지도 않는다. 알아서 필드 이름 바꿔주고 형식을 변환해주지 않는다는 얘기. 숫자형으로 지정된 포트 관련 필드들은 모두 빈껍데기였던 것.  

해당 작업은 winlogbeat-security.js가 담당하는데, 포트 관련 설정은 로그온 성공을 의미하는 4624 이벤트 하나뿐이다. 
 

winlogbeat-security.js가 제법 많은 이벤트를 처리해주기는 하지만 사용자가 추가한 이벤트까지 알아서 처리해주기를 바라기는 힘들다. 그래서 관련 함수(convertPortFields)를 만들고,
 

실행.


결과는 다음과 같다.
PS D:\ELK\winlogbeat-7.10.0-windows-x86_64> .\winlogbeat.exe
{
  "@timestamp": "2020-11-10T13:58:11.941Z",
  "@metadata": {
    "beat": "winlogbeat",
    "type": "_doc",
    "version": "7.10.0"
  },
  "winlog": {
    "event_id": 5156,
    "event_data": {
      "DestPort": 443,
      "RemoteMachineID": "S-1-0-0",
      "ProcessID": "13656",
      "Application": "\\device\\harddiskvolume10\\program files (x86)\\google\\chrome\\application\\chrome.exe",
      "SourceAddress": "192.168.31.189",
      "LayerRTID": "48",
      "Protocol": "17",
      "FilterRTID": "66199",
      "LayerName": "%%14611",
      "Direction": "%%14593",
      "SourcePort": 65378,
      "RemoteUserID": "S-1-0-0",
      "DestAddress": "216.58.220.110"
    }
  }
}

SourcePort, DestPort 모두 숫자로 전달되고 있다. 이제 로그스태시에서 숫자 검사를 해보자.
output {
 stdout {}
 if [winlog][event_data][DestPort] == 53 {
  elasticsearch { 
   hosts => "192.168.56.1" 
   index => "dns-request2" 
  }
 } 
}
[2020-11-10T23:12:46,961][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-11-10T23:12:46,968][INFO ][org.logstash.beats.Server][main][260006b9ffce1409a2650c9a547e710c858be37b8c494ffcf5ed606790a94c9b] Starting server on port: 5044
{
          "tags" => [
        [0] "beats_input_raw_event"
    ],
    "@timestamp" => 2020-11-13T14:12:25.754Z,
      "@version" => "1",
        "winlog" => {
          "event_id" => 5156,
        "event_data" => {
              "SourceAddress" => "192.168.31.189",
                  "Direction" => "%%14593",
                "DestAddress" => "110.35.63.236",
                "Application" => "\\device\\harddiskvolume10\\program files (x86)\\google\\chrome\\application\\chrome.exe",
                  "LayerRTID" => "48",
                  "ProcessID" => "13656",
                 "SourcePort" => 57067,
                  "LayerName" => "%%14611",
                 "FilterRTID" => "66199",
                   "Protocol" => "17",
            "RemoteMachineID" => "S-1-0-0",
               "RemoteUserID" => "S-1-0-0",
                   "DestPort" => 443
        }
    }
}

포트 관련 필드 모두 숫자형으로 저장된다.

댓글 없음:

댓글 쓰기

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