logstash-filter-fingerprint 3.4.0 → 3.4.2

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: 25ac9ded3114af17962469d77481c6992d65778a9dcf67012aaa3c7fb63c6ff7
4
- data.tar.gz: d42a1fc7ff16d940f5634cb5f14ee2b4f2216176bdf7b90a8e7e6ed23cc95909
3
+ metadata.gz: 5f2a16bce946eb4f6e8397822a4abf882c600dcce7dee9fb10d4a94c186921b7
4
+ data.tar.gz: 74a90fce053b44de8fcd0991f24f84fe2cfe6eedf7971ef4dd170f467d7b04c5
5
5
  SHA512:
6
- metadata.gz: dc8e8df09287df6f5f0649397f0b6b326396508afb101b73b7b51ca95802c314719a74440657059114ddab7b5d47cd65b7a48babea76e2b341cbdf46753f4da6
7
- data.tar.gz: 605eec24d6a4587e565acfe35c405beb6ff782410ed23c955e3d7e938e9a8fb3f633f40bc282f7ccaec77be07dfe233843ce2564dceb6cbe87dbe7fec0759668
6
+ metadata.gz: e086c37f7f9a7321741febefb51a3ab35ffdad9ca635da178aec9378131842cce321df124c545b7c10149ec5c588b965ee13b2a2857fe034fd31654e3aebb1b2
7
+ data.tar.gz: 4fef51f2ecf2a468006d8aca31ea225aac49ceca8826b8f4e4048bb2ad2d6052d22d388fa50b468ed5618c130c5e94d6a6b4f846c5cc86be4a4b45a446e85e13
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 3.4.2
2
+ - Key config type changed to `Password` type for better protection from leaks. [#71](https://github.com/logstash-plugins/logstash-filter-fingerprint/pull/71)
3
+
4
+ ## 3.4.1
5
+ - Added backward compatibility of timestamp format to provide consistent fingerprint [#67](https://github.com/logstash-plugins/logstash-filter-fingerprint/pull/67)
6
+
1
7
  ## 3.4.0
2
8
  - Added support for 128bit murmur variant [#66](https://github.com/logstash-plugins/logstash-filter-fingerprint/pull/66).
3
9
 
data/docs/index.asciidoc CHANGED
@@ -59,7 +59,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
59
59
  | <<plugins-{type}s-{plugin}-concatenate_sources>> |<<boolean,boolean>>|No
60
60
  | <<plugins-{type}s-{plugin}-concatenate_all_fields>> |<<boolean,boolean>>|No
61
61
  | <<plugins-{type}s-{plugin}-ecs_compatibility>> | <<string,string>>|No
62
- | <<plugins-{type}s-{plugin}-key>> |<<string,string>>|No
62
+ | <<plugins-{type}s-{plugin}-key>> |<<password,password>>|No
63
63
  | <<plugins-{type}s-{plugin}-method>> |<<string,string>>, one of `["SHA1", "SHA256", "SHA384", "SHA512", "MD5", "MURMUR3", "MURMUR3_128", IPV4_NETWORK", "UUID", "PUNCTUATION"]`|Yes
64
64
  | <<plugins-{type}s-{plugin}-source>> |<<array,array>>|No
65
65
  | <<plugins-{type}s-{plugin}-target>> |<<string,string>>|No
@@ -164,7 +164,7 @@ See <<plugins-{type}s-{plugin}-ecs_metadata>> for detailed information.
164
164
  [id="plugins-{type}s-{plugin}-key"]
165
165
  ===== `key`
166
166
 
167
- * Value type is <<string,string>>
167
+ * Value type is <<password,password>>
168
168
  * There is no default value for this setting.
169
169
 
170
170
  When used with the `IPV4_NETWORK` method fill in the subnet prefix length.
@@ -24,6 +24,25 @@ require "logstash/plugin_mixins/ecs_compatibility_support"
24
24
  # To generate UUIDs, prefer the <<plugins-filters-uuid,uuid filter>>.
25
25
  class LogStash::Filters::Fingerprint < LogStash::Filters::Base
26
26
 
27
+ ##
28
+ # Logstash 8+ has variable-length serialization of timestamps
29
+ # that do not include subsecond info for whole-second timestamps.
30
+ # For backward-compatibility we refine the implementation to use
31
+ # our own three-decimal-place formatter for whole-second
32
+ # timestamps.
33
+ if LOGSTASH_VERSION.split('.').first.to_i >= 8
34
+ module MinimumSerializationLengthTimestamp
35
+ THREE_DECIMAL_INSTANT_FORMATTER = java.time.format.DateTimeFormatterBuilder.new.appendInstant(3).toFormatter
36
+ refine LogStash::Timestamp do
37
+ def to_s
38
+ return super unless nsec == 0
39
+ THREE_DECIMAL_INSTANT_FORMATTER.format(to_java.toInstant)
40
+ end
41
+ end
42
+ end
43
+ using MinimumSerializationLengthTimestamp
44
+ end
45
+
27
46
  INTEGER_MAX_32BIT = (1 << 31) - 1
28
47
  INTEGER_MIN_32BIT = -(1 << 31)
29
48
 
@@ -42,7 +61,7 @@ class LogStash::Filters::Fingerprint < LogStash::Filters::Base
42
61
 
43
62
  # When used with the `IPV4_NETWORK` method fill in the subnet prefix length.
44
63
  # With other methods, optionally fill in the HMAC key.
45
- config :key, :validate => :string
64
+ config :key, :validate => :password
46
65
 
47
66
  # When set to `true`, the `SHA1`, `SHA256`, `SHA384`, `SHA512`, `MD5` and `MURMUR3_128` fingerprint
48
67
  # methods will produce base64 encoded rather than hex encoded strings.
@@ -180,7 +199,7 @@ class LogStash::Filters::Fingerprint < LogStash::Filters::Base
180
199
 
181
200
  def fingerprint_ipv4_network(ip_string)
182
201
  # in JRuby 1.7.11 outputs as US-ASCII
183
- IPAddr.new(ip_string).mask(@key.to_i).to_s.force_encoding(Encoding::UTF_8)
202
+ IPAddr.new(ip_string).mask(@key.value.to_i).to_s.force_encoding(Encoding::UTF_8)
184
203
  end
185
204
 
186
205
  def fingerprint_openssl(data)
@@ -201,10 +220,10 @@ class LogStash::Filters::Fingerprint < LogStash::Filters::Base
201
220
  end
202
221
  else
203
222
  if @base64encode
204
- hash = OpenSSL::HMAC.digest(digest, @key, data.to_s)
223
+ hash = OpenSSL::HMAC.digest(digest, @key.value, data.to_s)
205
224
  Base64.strict_encode64(hash).force_encoding(Encoding::UTF_8)
206
225
  else
207
- OpenSSL::HMAC.hexdigest(digest, @key, data.to_s).force_encoding(Encoding::UTF_8)
226
+ OpenSSL::HMAC.hexdigest(digest, @key.value, data.to_s).force_encoding(Encoding::UTF_8)
208
227
  end
209
228
  end
210
229
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-fingerprint'
4
- s.version = '3.4.0'
4
+ s.version = '3.4.2'
5
5
  s.licenses = ['Apache-2.0']
6
6
  s.summary = "Fingerprints fields by replacing values with a consistent hash"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -19,13 +19,17 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
19
19
  plugin.filter(event)
20
20
  end
21
21
 
22
+ def ge_version_8
23
+ LOGSTASH_VERSION.split('.').first.to_i >= 8
24
+ end
25
+
22
26
  context "with a string field" do
23
27
  let(:data) { {"clientip" => "123.123.123.123" } }
24
28
  let(:config) { super().merge("source" => ["clientip" ]) }
25
29
 
26
30
  describe "the IPV4_NETWORK method" do
27
31
  let(:fingerprint_method) { "IPV4_NETWORK" }
28
- let(:config) { super().merge("key" => 24) }
32
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("24")) }
29
33
 
30
34
  it "fingerprints the ip as the network" do
31
35
  expect(fingerprint).to eq("123.123.123.0")
@@ -111,7 +115,7 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
111
115
  end
112
116
 
113
117
  context "with HMAC" do
114
- let(:config) { super().merge("key" => "longencryptionkey") }
118
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("longencryptionkey")) }
115
119
 
116
120
  it "fingerprints the value" do
117
121
  expect(fingerprint).to eq("fdc60acc4773dc5ac569ffb78fcb93c9630797f4")
@@ -137,7 +141,7 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
137
141
  expect(fingerprint).to eq("4dabcab210766e35f03e77120e6986d6e6d4752b2a9ff22980b9253d026080d8")
138
142
  end
139
143
  context "with HMAC" do
140
- let(:config) { super().merge("key" => "longencryptionkey") }
144
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("longencryptionkey")) }
141
145
  it "fingerprints the value" do
142
146
  expect(fingerprint).to eq("345bec3eff242d53b568916c2610b3e393d885d6b96d643f38494fd74bf4a9ca")
143
147
  end
@@ -156,7 +160,7 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
156
160
  expect(fingerprint).to eq("fd605b0a3af3e04ce0d7a0b0d9c48d67a12dab811f60072e6eae84e35d567793ffb68a1807536f11c90874065c2a4392")
157
161
  end
158
162
  context "with HMAC" do
159
- let(:config) { super().merge("key" => "longencryptionkey") }
163
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("longencryptionkey")) }
160
164
  it "fingerprints the value" do
161
165
  expect(fingerprint).to eq("22d4c0e8c4fbcdc4887d2038fca7650f0e2e0e2457ff41c06eb2a980dded6749561c814fe182aff93e2538d18593947a")
162
166
  end
@@ -174,7 +178,7 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
174
178
  expect(fingerprint).to eq("5468e2dc64ea92b617782aae884b35af60041ac9e168a283615b6a462c54c13d42fa9542cce9b7d76a8124ac6616818905e3e5dd35d6e519f77c3b517558639a")
175
179
  end
176
180
  context "with HMAC" do
177
- let(:config) { super().merge("key" => "longencryptionkey") }
181
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("longencryptionkey")) }
178
182
  it "fingerprints the value" do
179
183
  expect(fingerprint).to eq("11c19b326936c08d6c50a3c847d883e5a1362e6a64dd55201a25f2c1ac1b673f7d8bf15b8f112a4978276d573275e3b14166e17246f670c2a539401c5bfdace8")
180
184
  end
@@ -192,7 +196,7 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
192
196
  expect(fingerprint).to eq("ccdd8d3d940a01b2fb3258c059924c0d")
193
197
  end
194
198
  context "with HMAC" do
195
- let(:config) { super().merge("key" => "longencryptionkey") }
199
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("longencryptionkey")) }
196
200
  it "fingerprints the value" do
197
201
  expect(fingerprint).to eq("9336c879e305c9604a3843fc3e75948f")
198
202
  end
@@ -273,11 +277,11 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
273
277
  end
274
278
 
275
279
  context 'Timestamps' do
276
- epoch_time = Time.at(0).gmtime
280
+ let(:epoch_time) { Time.at(0).gmtime }
277
281
  let(:config) { super().merge("source" => ['@timestamp']) }
278
282
 
279
283
  describe 'OpenSSL Fingerprinting' do
280
- let(:config) { super().merge("key" => '0123') }
284
+ let(:config) { super().merge("key" => ::LogStash::Util::Password.new("0123")) }
281
285
  let(:fingerprint_method) { "SHA1" }
282
286
  let(:data) { { "@timestamp" => epoch_time } }
283
287
  it "fingerprints the timestamp correctly" do
@@ -297,9 +301,35 @@ describe LogStash::Filters::Fingerprint, :ecs_compatibility_support, :aggregate_
297
301
  let(:fingerprint_method) { "MURMUR3_128" }
298
302
  let(:data) { { "@timestamp" => epoch_time } }
299
303
  it "fingerprints the timestamp correctly" do
300
- expect(fingerprint).to eq("37785b62a8cae473acc315d39b66d86e")
304
+ expect(fingerprint).to eq('37785b62a8cae473acc315d39b66d86e')
301
305
  end
302
306
  end
307
+
308
+ describe "fractional seconds" do
309
+ let(:fingerprint_method) { "MURMUR3" }
310
+ let(:data) { { "@timestamp" => epoch_time } }
311
+
312
+ describe "millisecond" do
313
+ let(:epoch_time) { LogStash::Timestamp.new('2000-01-01T05:00:00.12Z') }
314
+ it "fingerprints the timestamp correctly" do
315
+ expect(fingerprint).to eq(4263087275)
316
+ end
317
+ end
318
+
319
+ describe "microsecond" do
320
+ let(:epoch_time) { LogStash::Timestamp.new('2000-01-01T05:00:00.123456Z') }
321
+ it "fingerprints the timestamp correctly" do
322
+ expect(fingerprint).to eq(4188855160)
323
+ end
324
+ end if ge_version_8
325
+
326
+ describe "nanosecond" do
327
+ let(:epoch_time) { LogStash::Timestamp.new('2000-01-01T05:00:00.123456789Z') }
328
+ it "fingerprints the timestamp correctly" do
329
+ expect(fingerprint).to eq(3520111535)
330
+ end
331
+ end if ge_version_8
332
+ end
303
333
  end
304
334
 
305
335
  describe "post fingerprint execution triggers" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-fingerprint
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.0
4
+ version: 3.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-03 00:00:00.000000000 Z
11
+ date: 2023-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement