2017-05-12 15 views
1

WinLogBeatを使用してLogstashを送信するWindowsイベントログを送信する - 主にログ内のPowerShellイベントを対象としています。EventLogからPowerShell CommandLineデータを解析する

例:

<'Data'>NewCommandState=Stopped SequenceNumber=1463 HostName=ConsoleHost HostVersion=5.1.14409.1005 HostId=b99970c6-0f5f-4c76-9fb0-d5f7a8427a2a HostApplication=C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe EngineVersion=5.1.14409.1005 RunspaceId=bd4224a9-ce42-43e3-b8bb-53a302c342c9 PipelineId=167 CommandName=Import-Module CommandType=Cmdlet ScriptName= CommandPath= CommandLine=Import-Module -Verbose.\nishang.psm1<'/Data'> 

がどのように私は、次の取得するGROKを使用してCommandLine=フィールドを抽出することができますか?

Import-Module -Verbose.\nishang.psm1 

答えて

2

Grokは正規表現を囲むラッパーです。正規表現を使ってデータを解析することができれば、それをgrokで実装することができます。

範囲がCommandLineフィールドに限定されていても、ほとんどのkey = valueログの各フィールドを解析するのはかなり簡単で、いくつかのgrokフィルタを持つフィールドごとに1つの正規表現を使用できます。ログを保管、照会、視覚化する場合は、データが多いほど良いでしょう。

正規表現:

まず、我々は次のように起動します。

(.*?(?=\s\w+=|\<|$)) 
  • .*? - 行末
  • (?=\s\w+=|\<|$))以外の任意の文字と一致 - パターンをアサート正の先読みが必要次のものと一致する:
    • \s\w+=から=
    • |\<|$続い前それにスペースを持つ任意の単語文字 - マッチンググループに含めないようにあるいは<または行の末尾に一致してもよいです。

これは、各フィールドは、次のように解析することができることを意味します

CommandLine=(.*?(?=\s\w+=|\<|$)) 

GROK:

今、これは我々がGROKフィルタの作成を開始できることを意味します。再利用可能なコンポーネントにはセマンティック言語が適用されている可能性があります。

/etc/logstash/patterns/powershell.grok:%{PATTERN:label}PS_KEYVALUE正規表現を利用し、マッチンググループはJSONにその値を用いて標識されるであろう

# Patterns 
PS_KEYVALUE (.*?(?=\s\w+=|\<|$)) 

# Fields 
PS_NEWCOMMANDSTATE NewCommandState=%{PS_KEYVALUE:NewCommandState} 
PS_SEQUENCENUMBER SequenceNumber=%{PS_KEYVALUE:SequenceNumber} 
PS_HOSTNAME HostName=%{PS_KEYVALUE:HostName} 
PS_HOSTVERSION HostVersion=%{PS_KEYVALUE:HostVersion} 
PS_HOSTID HostId=%{PS_KEYVALUE:HostId} 
PS_HOSTAPPLICATION HostApplication=%{PS_KEYVALUE:HostApplication} 
PS_ENGINEVERSION EngineVersion=%{PS_KEYVALUE:EngineVersion} 
PS_RUNSPACEID RunspaceId=%{PS_KEYVALUE:RunspaceId} 
PS_PIPELINEID PipelineId=%{PS_KEYVALUE:PipelineId} 
PS_COMMANDNAME CommandName=%{PS_KEYVALUE:CommandName} 
PS_COMMANDTYPE CommandType=%{PS_KEYVALUE:CommandType} 
PS_SCRIPTNAME ScriptName=%{PS_KEYVALUE:ScriptName} 
PS_COMMANDPATH CommandPath=%{PS_KEYVALUE:CommandPath} 
PS_COMMANDLINE CommandLine=%{PS_KEYVALUE:CommandLine} 

。これはあなたが知っているフィールドに柔軟に対応できる場所です。

/etc/logstash/conf.d/powershell。confに

input { 
    ... 
} 

filter { 
    grok { 
     patterns_dir => "/etc/logstash/patterns" 
     break_on_match => false 
     match => [ 
      "message", "%{PS_NEWCOMMANDSTATE}", 
      "message", "%{PS_SEQUENCENUMBER}", 
      "message", "%{PS_HOSTNAME}", 
      "message", "%{PS_HOSTVERSION}", 
      "message", "%{PS_HOSTID}", 
      "message", "%{PS_HOSTAPPLICATION}", 
      "message", "%{PS_ENGINEVERSION}", 
      "message", "%{PS_RUNSPACEID}", 
      "message", "%{PS_PIPELINEID}", 
      "message", "%{PS_COMMANDNAME}", 
      "message", "%{PS_COMMANDTYPE}", 
      "message", "%{PS_SCRIPTNAME}", 
      "message", "%{PS_COMMANDPATH}", 
      "message", "%{PS_COMMANDLINE}" 
     ] 
    } 
} 

output { 
    stdout { codec => "rubydebug" } 
} 

結果:

{ 
    "HostApplication" => "C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", 
     "EngineVersion" => "5.1.14409.1005", 
     "RunspaceId" => "bd4224a9-ce42-43e3-b8bb-53a302c342c9", 
      "message" => "<'Data'>NewCommandState=Stopped SequenceNumber=1463 HostName=ConsoleHost HostVersion=5.1.14409.1005 HostId=b99970c6-0f5f-4c76-9fb0-d5f7a8427a2a HostApplication=C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe EngineVersion=5.1.14409.1005 RunspaceId=bd4224a9-ce42-43e3-b8bb-53a302c342c9 PipelineId=167 CommandName=Import-Module CommandType=Cmdlet ScriptName= CommandPath= CommandLine=Import-Module -Verbose.\\nishang.psm1<'/Data'>", 
      "HostId" => "b99970c6-0f5f-4c76-9fb0-d5f7a8427a2a", 
     "HostVersion" => "5.1.14409.1005", 
     "CommandLine" => "Import-Module -Verbose.\\nishang.psm1", 
     "@timestamp" => 2017-05-12T23:49:24.130Z, 
       "port" => 65134, 
     "CommandType" => "Cmdlet", 
      "@version" => "1", 
       "host" => "10.0.2.2", 
    "SequenceNumber" => "1463", 
    "NewCommandState" => "Stopped", 
     "PipelineId" => "167", 
     "CommandName" => "Import-Module", 
      "HostName" => "ConsoleHost" 
} 
+1

は答えのためではなく、説明のためだけでなく、ありがとうございました!!! –

関連する問題