fluent-plugin-windows-eventlog 0.3.0 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c05a4b1a785316299232e1cd4c3a5f60e7458b93b5b4d717720a6de5f079cbb
4
- data.tar.gz: aad0c8d51e5b88d96f86704bb72394d6a16253edecd8b975ed6c3334f433ebf4
3
+ metadata.gz: 6634a0ee22c7988e40ebe92ebd457996eb25cfdd926a09c557e497065f6dbeac
4
+ data.tar.gz: 8f3a1543db5dd4a2299c5675ccd81ee19e10b476b06e3f6b7685213e14247814
5
5
  SHA512:
6
- metadata.gz: 185857a8f3114029de23b8a0b9b262de929e20b6ad98f783a937bb4eb48e8d594a84df33405ff7a5b348c43f0f81d601bdfea72288f4e30637e98035f92ed834
7
- data.tar.gz: 1bb7650803e3852a2a14c701f9e3aeeeab932438b36702719f246c8e6b2be4b6c3ffa67a567e2c2dae1fc0cff7dd82144fcc874acb7045ea9beb5c819f6f28eb
6
+ metadata.gz: 8c9450771f970e88ec85ec5a44f3156a93475aeef12a729ffafe87c863516939fa66c739791b20c6e5bff30ba72e5958f14701b0713d5dca747c1b7919dee72c
7
+ data.tar.gz: 4d44d036e961e7cd502932863eedeb3781f25507384737850f9a81eb70f4099b0d24d27f8cc0f7753d310f9c3702273fd914271efa398e102610a2084b90c06a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # Release v0.4.4 - 2019/11/07
2
+ * in_windows_eventlog: Improve error handling and logging when failed to open Windows Event Log.
3
+
4
+ # Release v0.4.3 - 2019/10/31
5
+ * in_windows_eventlog2: Handle privileges record on #parse_desc
6
+ * in_windows_eventlog2: Raise error when handling invalid bookmark xml
7
+
8
+ # Release v0.4.2 - 2019/10/16
9
+ * in_windows_eventlog2: Handle invalid data error from `Winevt::EventLog::Query::Error`
10
+
11
+ # Release v0.4.1 - 2019/10/11
12
+ * in_windows_eventlog2: Add a missing ProcessID record
13
+
14
+ # Release v0.4.0 - 2019/10/10
15
+
16
+ * in_windows_eventlog2: Add new `render_as_xml` parameter to switch rendering as XML or Ruby Hash object
17
+ * in_windows_eventlog2: Support rate limit with `rate_limit` option
18
+ * parser_winevt_xml: Separate `parser_winevt_xml` plugin to other repository and published as Fluentd parser plugin
19
+
1
20
  # Release v0.3.0 - 2019/07/08
2
21
 
3
22
  * Add new `in_windows_eventlog2` plugin. This plugin uses newer windows event logging API.
data/README.md CHANGED
@@ -4,10 +4,10 @@
4
4
 
5
5
  ### fluentd Input plugin for the Windows Event Log
6
6
 
7
- [Fluentd](http://fluentd.org) plugin to read the Windows Event Log.
7
+ [Fluentd](https://www.fluentd.org/) plugin to read the Windows Event Log.
8
8
 
9
9
  ## Installation
10
- gem install fluent-plugin-windows-eventlog
10
+ ridk exec gem install fluent-plugin-windows-eventlog
11
11
 
12
12
  ## Configuration
13
13
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  Check [in_windows_eventlog2](https://github.com/fluent/fluent-plugin-windows-eventlog#in_windows_eventlog2) first. `in_windows_eventlog` will be replaced with `in_windows_eventlog2`.
17
17
 
18
- #### fluentd Input plugin for the Windows Event Log using old Windows Event Logging API
18
+ fluentd Input plugin for the Windows Event Log using old Windows Event Logging API
19
19
 
20
20
  <source>
21
21
  @type windows_eventlog
@@ -130,7 +130,7 @@ If your `description` doesn't follow this format, the parsed result is only `des
130
130
 
131
131
  ### in_windows_eventlog2
132
132
 
133
- #### fluentd Input plugin for the Windows Event Log using newer Windows Event Logging API
133
+ fluentd Input plugin for the Windows Event Log using newer Windows Event Logging API. This is successor to `in_windows_eventlog`. See also [this slide](https://www.slideshare.net/cosmo0920/fluentd-meetup-2019) for the details of `in_windows_eventlog2` plugin.
134
134
 
135
135
  <source>
136
136
  @type windows_eventlog2
@@ -138,6 +138,8 @@ If your `description` doesn't follow this format, the parsed result is only `des
138
138
  channels application,system
139
139
  read_interval 2
140
140
  tag winevt.raw
141
+ render_as_xml false # default is true.
142
+ rate_limit 200 # default is -1(Winevt::EventLog::Subscribe::RATE_INFINITE).
141
143
  <storage>
142
144
  @type local # @type local is the default.
143
145
  persistent true # default is true. Set to false to use in-memory storage.
@@ -153,6 +155,10 @@ If your `description` doesn't follow this format, the parsed result is only `des
153
155
 
154
156
  **NOTE:** When `Description` contains error message such as `The message resource is present but the message was not found in the message table.`, eventlog's resource file (.mui) related to error generating event is something wrong. This issue is also occurred in built-in Windows Event Viewer which is the part of Windows management tool.
155
157
 
158
+ **NOTE:** When `render_as_xml` as `false`, the dependent winevt_c gem renders Windows EventLog as Ruby Hash object directly. This reduces bottleneck to consume EventLog. Specifying `render_as_xml` as `false` should be faster consuming than `render_as_xml` as `true` case.
159
+
160
+ **NOTE:** If you encountered CPU spike due to massively huge EventLog channel, `rate_limit` parameter may help you. Currently, this paramter can handle the multiples of 10 or -1(`Winevt::EventLog::Subscribe::RATE_INFINITE`).
161
+
156
162
  #### parameters
157
163
 
158
164
  |name | description |
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-windows-eventlog"
7
- spec.version = "0.3.0"
7
+ spec.version = "0.4.4"
8
8
  spec.authors = ["okahashi117", "Hiroshi Hatake", "Masahiro Nakagawa"]
9
9
  spec.email = ["naruki_okahashi@jbat.co.jp", "cosmo0920.oucc@gmail.com", "repeatedly@gmail.com"]
10
10
  spec.summary = %q{Fluentd Input plugin to read windows event log.}
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "test-unit", "~> 3.2.0"
23
23
  spec.add_runtime_dependency "fluentd", [">= 0.14.12", "< 2"]
24
24
  spec.add_runtime_dependency "win32-eventlog"
25
- spec.add_runtime_dependency "winevt_c"
25
+ spec.add_runtime_dependency "winevt_c", ">= 0.6.1"
26
26
  spec.add_runtime_dependency "nokogiri", "~> 1.10"
27
+ spec.add_runtime_dependency "fluent-plugin-parser-winevt_xml", ">= 0.1.2"
27
28
  end
@@ -151,7 +151,11 @@ module Fluent::Plugin
151
151
  end
152
152
 
153
153
  def on_notify(ch)
154
- el = Win32::EventLog.open(ch)
154
+ begin
155
+ el = Win32::EventLog.open(ch)
156
+ rescue => e
157
+ log.error "Failed to open Windows Event log.", error: e
158
+ end
155
159
 
156
160
  current_oldest_record_number = el.oldest_record_number
157
161
  current_total_records = el.total_records
@@ -186,7 +190,9 @@ module Fluent::Plugin
186
190
  receive_lines(ch, winlogs)
187
191
  @pos_storage.put(ch, [read_start, read_num + winlogs.size])
188
192
  ensure
189
- el.close
193
+ if el
194
+ el.close
195
+ end
190
196
  end
191
197
 
192
198
  GROUP_DELIMITER = "\r\n\r\n".freeze
@@ -21,6 +21,7 @@ module Fluent::Plugin
21
21
  "EventRecordID" => ["EventRecordID", :string],
22
22
  "ActivityID" => ["ActivityID", :string],
23
23
  "RelatedActivityID" => ["RelatedActivityID", :string],
24
+ "ProcessID" => ["ProcessID", :string],
24
25
  "ThreadID" => ["ThreadID", :string],
25
26
  "Channel" => ["Channel", :string],
26
27
  "Computer" => ["Computer", :string],
@@ -35,6 +36,8 @@ module Fluent::Plugin
35
36
  config_param :keys, :array, default: []
36
37
  config_param :read_from_head, :bool, default: false
37
38
  config_param :parse_description, :bool, default: false
39
+ config_param :render_as_xml, :bool, default: true
40
+ config_param :rate_limit, :integer, default: Winevt::EventLog::Subscribe::RATE_INFINITE
38
41
 
39
42
  config_section :storage do
40
43
  config_set_default :usage, "bookmarks"
@@ -60,12 +63,24 @@ module Fluent::Plugin
60
63
  if @keynames.empty?
61
64
  @keynames = KEY_MAP.keys
62
65
  end
66
+ @keynames.delete('Qualifiers') unless @render_as_xml
63
67
  @keynames.delete('EventData') if @parse_description
64
68
 
65
69
  @tag = tag
66
70
  @tailing = @read_from_head ? false : true
67
71
  @bookmarks_storage = storage_create(usage: "bookmarks")
68
- @parser = parser_create
72
+ @winevt_xml = false
73
+ if @render_as_xml
74
+ @parser = parser_create
75
+ @winevt_xml = @parser.respond_to?(:winevt_xml?) && @parser.winevt_xml?
76
+ class << self
77
+ alias_method :on_notify, :on_notify_xml
78
+ end
79
+ else
80
+ class << self
81
+ alias_method :on_notify, :on_notify_hash
82
+ end
83
+ end
69
84
  end
70
85
 
71
86
  def start
@@ -74,9 +89,19 @@ module Fluent::Plugin
74
89
  @chs.each do |ch|
75
90
  bookmarkXml = @bookmarks_storage.get(ch) || ""
76
91
  subscribe = Winevt::EventLog::Subscribe.new
77
- bookmark = Winevt::EventLog::Bookmark.new(bookmarkXml)
92
+ bookmark = unless bookmarkXml.empty?
93
+ Winevt::EventLog::Bookmark.new(bookmarkXml)
94
+ else
95
+ nil
96
+ end
78
97
  subscribe.tail = @tailing
79
- subscribe.subscribe(ch, "*", bookmark)
98
+ begin
99
+ subscribe.subscribe(ch, "*", bookmark)
100
+ rescue Winevt::EventLog::Query::Error => e
101
+ raise Fluent::ConfigError, "Invalid Bookmark XML is loaded. #{e}"
102
+ end
103
+ subscribe.render_as_xml = @render_as_xml
104
+ subscribe.rate_limit = @rate_limit
80
105
  timer_execute("in_windows_eventlog_#{escape_channel(ch)}".to_sym, @read_interval) do
81
106
  on_notify(ch, subscribe)
82
107
  end
@@ -88,34 +113,75 @@ module Fluent::Plugin
88
113
  end
89
114
 
90
115
  def on_notify(ch, subscribe)
116
+ # for safety.
117
+ end
118
+
119
+ def on_notify_xml(ch, subscribe)
91
120
  es = Fluent::MultiEventStream.new
92
- subscribe.each do |xml, message, string_inserts|
93
- @parser.parse(xml) do |time, record|
94
- # record.has_key?("EventData") for none parser checking.
95
- if record.has_key?("EventData")
96
- record["Description"] = message
97
- record["EventData"] = string_inserts
98
-
99
- h = {}
100
- @keynames.each do |k|
101
- type = KEY_MAP[k][1]
102
- value = record[KEY_MAP[k][0]]
103
- h[k]=case type
104
- when :string
105
- value.to_s
106
- when :array
107
- value.map {|v| v.to_s}
108
- else
109
- raise "Unknown value type: #{type}"
110
- end
121
+ begin
122
+ subscribe.each do |xml, message, string_inserts|
123
+ @parser.parse(xml) do |time, record|
124
+ # record.has_key?("EventData") for none parser checking.
125
+ if @winevt_xml
126
+ record["Description"] = message
127
+ record["EventData"] = string_inserts
128
+
129
+ h = {}
130
+ @keynames.each do |k|
131
+ type = KEY_MAP[k][1]
132
+ value = record[KEY_MAP[k][0]]
133
+ h[k]=case type
134
+ when :string
135
+ value.to_s
136
+ when :array
137
+ value.map {|v| v.to_s}
138
+ else
139
+ raise "Unknown value type: #{type}"
140
+ end
141
+ end
142
+ parse_desc(h) if @parse_description
143
+ es.add(Fluent::Engine.now, h)
144
+ else
145
+ record["Description"] = message
146
+ record["EventData"] = string_inserts
147
+ # for none parser
148
+ es.add(Fluent::Engine.now, record)
111
149
  end
112
- parse_desc(h) if @parse_description
113
- es.add(Fluent::Engine.now, h)
114
- else
115
- # for none parser
116
- es.add(Fluent::Engine.now, record)
117
150
  end
118
151
  end
152
+ rescue Winevt::EventLog::Query::Error => e
153
+ log.warn "Invalid XML data", error: e
154
+ log.warn_backtrace
155
+ end
156
+ router.emit_stream(@tag, es)
157
+ @bookmarks_storage.put(ch, subscribe.bookmark)
158
+ end
159
+
160
+ def on_notify_hash(ch, subscribe)
161
+ es = Fluent::MultiEventStream.new
162
+ begin
163
+ subscribe.each do |record, message, string_inserts|
164
+ record["Description"] = message
165
+ record["EventData"] = string_inserts
166
+ h = {}
167
+ @keynames.each do |k|
168
+ type = KEY_MAP[k][1]
169
+ value = record[KEY_MAP[k][0]]
170
+ h[k]=case type
171
+ when :string
172
+ value.to_s
173
+ when :array
174
+ value.map {|v| v.to_s}
175
+ else
176
+ raise "Unknown value type: #{type}"
177
+ end
178
+ end
179
+ parse_desc(h) if @parse_description
180
+ es.add(Fluent::Engine.now, h)
181
+ end
182
+ rescue Winevt::EventLog::Query::Error => e
183
+ log.warn "Invalid Hash data", error: e
184
+ log.warn_backtrace
119
185
  end
120
186
  router.emit_stream(@tag, es)
121
187
  @bookmarks_storage.put(ch, subscribe.bookmark)
@@ -134,6 +200,7 @@ module Fluent::Plugin
134
200
 
135
201
  elems = desc.split(GROUP_DELIMITER)
136
202
  record['DescriptionTitle'] = elems.shift
203
+ previous_key = nil
137
204
  elems.each { |elem|
138
205
  parent_key = nil
139
206
  elem.split(RECORD_DELIMITER).each { |r|
@@ -148,13 +215,19 @@ module Fluent::Plugin
148
215
  else
149
216
  # parsed value sometimes contain unexpected "\t". So remove it.
150
217
  value.strip!
151
- if parent_key.nil?
218
+ # merge empty key values into the previous non-empty key record.
219
+ if key.empty?
220
+ record[previous_key] = [record[previous_key], value].flatten
221
+ elsif parent_key.nil?
152
222
  record[to_key(key)] = value
153
223
  else
154
224
  k = "#{parent_key}.#{to_key(key)}"
155
225
  record[k] = value
156
226
  end
157
227
  end
228
+ # XXX: This is for empty privileges record key.
229
+ # We should investigate whether an another case exists or not.
230
+ previous_key = to_key(key) unless key.empty?
158
231
  }
159
232
  }
160
233
  end
data/test/helper.rb CHANGED
@@ -23,10 +23,8 @@ unless ENV.has_key?('VERBOSE')
23
23
  end
24
24
 
25
25
  require 'fluent/test/driver/input'
26
- require 'fluent/test/driver/parser'
27
26
  require 'fluent/plugin/in_windows_eventlog'
28
27
  require 'fluent/plugin/in_windows_eventlog2'
29
- require 'fluent/plugin/parser_winevt_xml'
30
28
 
31
29
  class Test::Unit::TestCase
32
30
  end
@@ -25,6 +25,7 @@ class WindowsEventLog2InputTest < Test::Unit::TestCase
25
25
  assert_equal 2, d.instance.read_interval
26
26
  assert_equal ['application'], d.instance.channels
27
27
  assert_false d.instance.read_from_head
28
+ assert_true d.instance.render_as_xml
28
29
  end
29
30
 
30
31
  def test_parse_desc
@@ -47,6 +48,38 @@ DESC
47
48
  assert_equal(expected, h)
48
49
  end
49
50
 
51
+ def test_parse_privileges_description
52
+ d = create_driver
53
+ desc = ["Special privileges assigned to new logon.\r\n\r\nSubject:\r\n\tSecurity ID:\t\tS-X-Y-ZZ\r\n\t",
54
+ "AccountName:\t\tSYSTEM\r\n\tAccount Domain:\t\tNT AUTHORITY\r\n\tLogon ID:\t\t0x3E7\r\n\r\n",
55
+ "Privileges:\t\tSeAssignPrimaryTokenPrivilege\r\n\t\t\tSeTcbPrivilege\r\n\t\t\t",
56
+ "SeSecurityPrivilege\r\n\t\t\tSeTakeOwnershipPrivilege\r\n\t\t\tSeLoadDriverPrivilege\r\n\t\t\t",
57
+ "SeBackupPrivilege\r\n\t\t\tSeRestorePrivilege\r\n\t\t\tSeDebugPrivilege\r\n\t\t\t",
58
+ "SeAuditPrivilege\r\n\t\t\tSeSystemEnvironmentPrivilege\r\n\t\t\tSeImpersonatePrivilege\r\n\t\t\t",
59
+ "SeDelegateSessionUserImpersonatePrivilege"].join("")
60
+
61
+ h = {"Description" => desc}
62
+ expected = {"DescriptionTitle" => "Special privileges assigned to new logon.",
63
+ "subject.security_id" => "S-X-Y-ZZ",
64
+ "subject.accountname" => "SYSTEM",
65
+ "subject.account_domain" => "NT AUTHORITY",
66
+ "subject.logon_id" => "0x3E7",
67
+ "privileges" => ["SeAssignPrimaryTokenPrivilege",
68
+ "SeTcbPrivilege",
69
+ "SeSecurityPrivilege",
70
+ "SeTakeOwnershipPrivilege",
71
+ "SeLoadDriverPrivilege",
72
+ "SeBackupPrivilege",
73
+ "SeRestorePrivilege",
74
+ "SeDebugPrivilege",
75
+ "SeAuditPrivilege",
76
+ "SeSystemEnvironmentPrivilege",
77
+ "SeImpersonatePrivilege",
78
+ "SeDelegateSessionUserImpersonatePrivilege"]}
79
+ d.instance.parse_desc(h)
80
+ assert_equal(expected, h)
81
+ end
82
+
50
83
  def test_write
51
84
  d = create_driver
52
85
 
@@ -57,7 +90,7 @@ DESC
57
90
  end
58
91
 
59
92
  assert(d.events.length >= 1)
60
- event = d.events.last
93
+ event = d.events.select {|e| e.last["EventID"] == "65500" }.last
61
94
  record = event.last
62
95
 
63
96
  assert_equal("Application", record["Channel"])
@@ -96,6 +129,34 @@ DESC
96
129
  assert_equal(expected, record)
97
130
  end
98
131
 
132
+ class HashRendered < self
133
+ def test_write
134
+ d = create_driver(config_element("ROOT", "", {"tag" => "fluent.eventlog",
135
+ "render_as_xml" => false}, [
136
+ config_element("storage", "", {
137
+ '@type' => 'local',
138
+ 'persistent' => false
139
+ })
140
+ ]))
141
+
142
+ service = Fluent::Plugin::EventService.new
143
+
144
+ d.run(expect_emits: 1) do
145
+ service.run
146
+ end
147
+
148
+ assert(d.events.length >= 1)
149
+ event = d.events.select {|e| e.last["EventID"] == "65500" }.last
150
+ record = event.last
151
+
152
+ assert_false(d.instance.render_as_xml)
153
+ assert_equal("Application", record["Channel"])
154
+ assert_equal("65500", record["EventID"])
155
+ assert_equal("4", record["Level"])
156
+ assert_equal("fluent-plugins", record["ProviderName"])
157
+ end
158
+ end
159
+
99
160
  class PersistBookMark < self
100
161
  TEST_PLUGIN_STORAGE_PATH = File.join( File.dirname(File.dirname(__FILE__)), 'tmp', 'in_windows_eventlog2', 'store' )
101
162
  CONFIG2 = config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
@@ -126,7 +187,7 @@ DESC
126
187
  end
127
188
 
128
189
  assert(d.events.length >= 1)
129
- event = d.events.last
190
+ event = d.events.select {|e| e.last["EventID"] == "65500" }.last
130
191
  record = event.last
131
192
 
132
193
  prev_id = record["EventRecordID"].to_i
@@ -151,6 +212,21 @@ DESC
151
212
 
152
213
  assert File.exist?(File.join(TEST_PLUGIN_STORAGE_PATH, 'json', 'test-02.json'))
153
214
  end
215
+
216
+ def test_start_with_invalid_bookmark
217
+ invalid_storage_contents = <<-EOS
218
+ <BookmarkList>\r\n <Bookmark Channel='Application' RecordId='20063' IsCurrent='true'/>\r\n
219
+ EOS
220
+ d = create_driver(CONFIG2)
221
+ storage = d.instance.instance_variable_get(:@bookmarks_storage)
222
+ storage.put('application', invalid_storage_contents)
223
+ assert File.exist?(File.join(TEST_PLUGIN_STORAGE_PATH, 'json', 'test-02.json'))
224
+
225
+ d2 = create_driver(CONFIG2)
226
+ assert_raise(Fluent::ConfigError) do
227
+ d2.instance.start
228
+ end
229
+ end
154
230
  end
155
231
 
156
232
  def test_write_with_none_parser
@@ -178,5 +254,8 @@ DESC
178
254
  # record should be {message: <RAW XML EventLog>}.
179
255
  record["message"]
180
256
  end
257
+
258
+ assert_true(record.has_key?("Description"))
259
+ assert_true(record.has_key?("EventData"))
181
260
  end
182
261
  end
@@ -38,7 +38,7 @@ class WindowsEventLogInputTest < Test::Unit::TestCase
38
38
  end
39
39
 
40
40
  assert(d.events.length >= 1)
41
- event = d.events.last
41
+ event = d.events.select {|e| e.last["event_id"] == "65500" }.last
42
42
  record = event.last
43
43
  assert_equal("application", record["channel"])
44
44
  assert_equal("65500", record["event_id"])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-windows-eventlog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - okahashi117
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-07-09 00:00:00.000000000 Z
13
+ date: 2019-11-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -94,14 +94,14 @@ dependencies:
94
94
  requirements:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: '0'
97
+ version: 0.6.1
98
98
  type: :runtime
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - ">="
103
103
  - !ruby/object:Gem::Version
104
- version: '0'
104
+ version: 0.6.1
105
105
  - !ruby/object:Gem::Dependency
106
106
  name: nokogiri
107
107
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +116,20 @@ dependencies:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
118
  version: '1.10'
119
+ - !ruby/object:Gem::Dependency
120
+ name: fluent-plugin-parser-winevt_xml
121
+ requirement: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 0.1.2
126
+ type: :runtime
127
+ prerelease: false
128
+ version_requirements: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.1.2
119
133
  description: Fluentd Input plugin to read windows event log.
120
134
  email:
121
135
  - naruki_okahashi@jbat.co.jp
@@ -135,13 +149,10 @@ files:
135
149
  - fluent-plugin-winevtlog.gemspec
136
150
  - lib/fluent/plugin/in_windows_eventlog.rb
137
151
  - lib/fluent/plugin/in_windows_eventlog2.rb
138
- - lib/fluent/plugin/parser_winevt_xml.rb
139
- - test/data/eventlog.xml
140
152
  - test/generate-windows-event.rb
141
153
  - test/helper.rb
142
154
  - test/plugin/test_in_windows_eventlog2.rb
143
155
  - test/plugin/test_in_winevtlog.rb
144
- - test/plugin/test_parser_winevt_xml.rb
145
156
  homepage: https://github.com/fluent/fluent-plugin-windows-eventlog
146
157
  licenses:
147
158
  - Apache-2.0
@@ -167,9 +178,7 @@ signing_key:
167
178
  specification_version: 4
168
179
  summary: Fluentd Input plugin to read windows event log.
169
180
  test_files:
170
- - test/data/eventlog.xml
171
181
  - test/generate-windows-event.rb
172
182
  - test/helper.rb
173
183
  - test/plugin/test_in_windows_eventlog2.rb
174
184
  - test/plugin/test_in_winevtlog.rb
175
- - test/plugin/test_parser_winevt_xml.rb
@@ -1,34 +0,0 @@
1
- require 'fluent/plugin/parser'
2
- require 'nokogiri'
3
-
4
- module Fluent::Plugin
5
- class WinevtXMLparser < Parser
6
- Fluent::Plugin.register_parser('winevt_xml', self)
7
-
8
- def parse(text)
9
- record = {}
10
- doc = Nokogiri::XML(text)
11
- system_elem = doc/'Event'/'System'
12
- record["ProviderName"] = (system_elem/"Provider").attribute("Name").text rescue nil
13
- record["ProviderGUID"] = (system_elem/"Provider").attribute("Guid").text rescue nil
14
- record["EventID"] = (system_elem/'EventID').text rescue nil
15
- record["Qualifiers"] = (system_elem/'EventID').attribute("Qualifiers").text rescue nil
16
- record["Level"] = (system_elem/'Level').text rescue nil
17
- record["Task"] = (system_elem/'Task').text rescue nil
18
- record["Opcode"] = (system_elem/'Opcode').text rescue nil
19
- record["Keywords"] = (system_elem/'Keywords').text rescue nil
20
- record["TimeCreated"] = (system_elem/'TimeCreated').attribute("SystemTime").text rescue nil
21
- record["EventRecordID"] = (system_elem/'EventRecordID').text rescue nil
22
- record["ActivityID"] = (system_elem/'ActivityID').text rescue nil
23
- record["RelatedActivityID"] = (system_elem/'Correlation').attribute("ActivityID").text rescue nil
24
- record["ThreadID"] = (system_elem/'Execution').attribute("ThreadID").text rescue nil
25
- record["Channel"] = (system_elem/'Channel').text rescue nil
26
- record["Computer"] = (system_elem/"Computer").text rescue nil
27
- record["UserID"] = (system_elem/'Security').attribute("UserID").text rescue nil
28
- record["Version"] = (system_elem/'Version').text rescue nil
29
- record["EventData"] = [] # These parameters are processed in winevt_c.
30
- time = @estimate_current_event ? Fluent::EventTime.now : nil
31
- yield time, record
32
- end
33
- end
34
- end
@@ -1 +0,0 @@
1
- <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-A5BA-3E3B0328C30D}'/><EventID>4624</EventID><Version>2</Version><Level>0</Level><Task>12544</Task><Opcode>0</Opcode><Keywords>0x8020000000000000</Keywords><TimeCreated SystemTime='2019-06-13T09:21:23.345889600Z'/><EventRecordID>80688</EventRecordID><Correlation ActivityID='{587F0743-1F71-0006-5007-7F58711FD501}'/><Execution ProcessID='912' ThreadID='24708'/><Channel>Security</Channel><Computer>Fluentd-Developing-Windows</Computer><Security/></System><EventData><Data Name='SubjectUserSid'>S-1-5-18</Data><Data Name='SubjectUserName'>Fluentd-Developing-Windows$</Data><Data Name='SubjectDomainName'>WORKGROUP</Data><Data Name='SubjectLogonId'>0x3e7</Data><Data Name='TargetUserSid'>S-1-5-18</Data><Data Name='TargetUserName'>SYSTEM</Data><Data Name='TargetDomainName'>NT AUTHORITY</Data><Data Name='TargetLogonId'>0x3e7</Data><Data Name='LogonType'>5</Data><Data Name='LogonProcessName'>Advapi </Data><Data Name='AuthenticationPackageName'>Negotiate</Data><Data Name='WorkstationName'>-</Data><Data Name='LogonGuid'>{00000000-0000-0000-0000-000000000000}</Data><Data Name='TransmittedServices'>-</Data><Data Name='LmPackageName'>-</Data><Data Name='KeyLength'>0</Data><Data Name='ProcessId'>0x344</Data><Data Name='ProcessName'>C:\Windows\System32\services.exe</Data><Data Name='IpAddress'>-</Data><Data Name='IpPort'>-</Data><Data Name='ImpersonationLevel'>%%1833</Data><Data Name='RestrictedAdminMode'>-</Data><Data Name='TargetOutboundUserName'>-</Data><Data Name='TargetOutboundDomainName'>-</Data><Data Name='VirtualAccount'>%%1843</Data><Data Name='TargetLinkedLogonId'>0x0</Data><Data Name='ElevatedToken'>%%1842</Data></EventData></Event>
@@ -1,42 +0,0 @@
1
- require 'helper'
2
- require 'generate-windows-event'
3
-
4
- class WinevtXMLparserTest < Test::Unit::TestCase
5
-
6
- def setup
7
- Fluent::Test.setup
8
- end
9
-
10
- CONFIG = %[]
11
- XMLLOG = File.open(File.join(__dir__, "..", "data", "eventlog.xml") )
12
-
13
- def create_driver(conf = CONFIG)
14
- Fluent::Test::Driver::Parser.new(Fluent::Plugin::WinevtXMLparser).configure(conf)
15
- end
16
-
17
- def test_parse
18
- d = create_driver
19
- xml = XMLLOG
20
- expected = {"ProviderName" => "Microsoft-Windows-Security-Auditing",
21
- "ProviderGUID" => "{54849625-5478-4994-A5BA-3E3B0328C30D}",
22
- "EventID" => "4624",
23
- "Qualifiers" => nil,
24
- "Level" => "0",
25
- "Task" => "12544",
26
- "Opcode" => "0",
27
- "Keywords" => "0x8020000000000000",
28
- "TimeCreated" => "2019-06-13T09:21:23.345889600Z",
29
- "EventRecordID" => "80688",
30
- "ActivityID" => "",
31
- "RelatedActivityID" => "{587F0743-1F71-0006-5007-7F58711FD501}",
32
- "ThreadID" => "24708",
33
- "Channel" => "Security",
34
- "Computer" => "Fluentd-Developing-Windows",
35
- "UserID" => nil,
36
- "Version" => "2",
37
- "EventData" => []}
38
- d.instance.parse(xml) do |time, record|
39
- assert_equal(expected, record)
40
- end
41
- end
42
- end