logstash-output-elasticsearch 11.4.1-java → 11.5.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1ce0504aa5082dc3fc958b72019f243c6cad0174bb883612c25eb5d7f8aedfe
4
- data.tar.gz: 4d28c34d89b5a70a02c10ebd3b8d425111d3902bc58fb9e428acadee4a471646
3
+ metadata.gz: 7eab2dc342c636e2d5df4e2f9bbd776b446cf110a0803c11fc919fcbbd2f2d83
4
+ data.tar.gz: 565ed3031b685f8541853043d486bda0cff8aa7da2c6f2733e0e2b43345de099
5
5
  SHA512:
6
- metadata.gz: d1d0680cf639e01b6c2a2a3b8eb87a2ad525764d006fb3cbfadc06c845925d9f1055075265d7327794e326b1a9df67308d85ebefafb38297bd2121499ecc2279
7
- data.tar.gz: 285bafc2ffa2ae726bdafdb3176c193c7cd20979625e59cd7526445ae5243137e6dad37cc64208bb3494fc45afe44d913f7b7b4188fcf6b25faf1e9fb6a04d06
6
+ metadata.gz: 1fbb452170d276531d9b202538d9cf0a23b834053309c818aaaff6f75dd41ecd3d787394234c295639d95d2fe763d1063424cff56b598d1ba16e2fe92374df44
7
+ data.tar.gz: 6b7f17fa679306e65ec94a048ef2205ec9f884cbd11fe1adf861dbb1eccaea752105c3bf149a4fe08f1cdb3c6189200d612dc4cece52ac937eb78d599b188926
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 11.5.0
2
+ - Feat: add ssl_supported_protocols option [#1055](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1055)
3
+
4
+ ## 11.4.2
5
+ - [DOC] Add `v8` to supported values for ecs_compatiblity defaults [#1059](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1059)
6
+
1
7
  ## 11.4.1
2
8
  - Feat: upgrade manticore (http-client) library [#1063](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1063)
3
9
  - the underlying changes include latest HttpClient (4.5.13)
data/docs/index.asciidoc CHANGED
@@ -355,6 +355,7 @@ This plugin supports the following configuration options plus the
355
355
  | <<plugins-{type}s-{plugin}-sniffing_path>> |<<string,string>>|No
356
356
  | <<plugins-{type}s-{plugin}-ssl>> |<<boolean,boolean>>|No
357
357
  | <<plugins-{type}s-{plugin}-ssl_certificate_verification>> |<<boolean,boolean>>|No
358
+ | <<plugins-{type}s-{plugin}-ssl_supported_protocols>> |<<string,string>>|No
358
359
  | <<plugins-{type}s-{plugin}-template>> |a valid filesystem path|No
359
360
  | <<plugins-{type}s-{plugin}-template_name>> |<<string,string>>|No
360
361
  | <<plugins-{type}s-{plugin}-template_overwrite>> |<<boolean,boolean>>|No
@@ -554,7 +555,7 @@ If you don't set a value for this option:
554
555
  * Value type is <<string,string>>
555
556
  * Supported values are:
556
557
  ** `disabled`: does not provide ECS-compatible templates
557
- ** `v1`: provides defaults that are compatible with v1 of the Elastic Common Schema
558
+ ** `v1`,`v8`: Elastic Common Schema-compliant behavior
558
559
  * Default value depends on which version of Logstash is running:
559
560
  ** When Logstash provides a `pipeline.ecs_compatibility` setting, its value is used as the default
560
561
  ** Otherwise, the default value is `disabled`.
@@ -1004,6 +1005,23 @@ Option to validate the server's certificate. Disabling this severely compromises
1004
1005
  For more information on disabling certificate verification please read
1005
1006
  https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
1006
1007
 
1008
+ [id="plugins-{type}s-{plugin}-ssl_supported_protocols"]
1009
+ ===== `ssl_supported_protocols`
1010
+
1011
+ * Value type is <<string,string>>
1012
+ * Allowed values are: `'TLSv1.1'`, `'TLSv1.2'`, `'TLSv1.3'`
1013
+ * Default depends on the JDK being used. With up-to-date Logstash, the default is `['TLSv1.2', 'TLSv1.3']`.
1014
+ `'TLSv1.1'` is not considered secure and is only provided for legacy applications.
1015
+
1016
+ List of allowed SSL/TLS versions to use when establishing a connection to the Elasticsearch cluster.
1017
+
1018
+ For Java 8 `'TLSv1.3'` is supported only since **8u262** (AdoptOpenJDK), but requires that you set the
1019
+ `LS_JAVA_OPTS="-Djdk.tls.client.protocols=TLSv1.3"` system property in Logstash.
1020
+
1021
+ NOTE: If you configure the plugin to use `'TLSv1.1'` on any recent JVM, such as the one packaged with Logstash,
1022
+ the protocol is disabled by default and needs to be enabled manually by changing `jdk.tls.disabledAlgorithms` in
1023
+ the *$JDK_HOME/conf/security/java.security* configuration file. That is, `TLSv1.1` needs to be removed from the list.
1024
+
1007
1025
  [id="plugins-{type}s-{plugin}-template"]
1008
1026
  ===== `template`
1009
1027
 
@@ -1018,8 +1036,8 @@ If not set, the included template will be used.
1018
1036
 
1019
1037
  * Value type is <<string,string>>
1020
1038
  * Default value depends on whether <<plugins-{type}s-{plugin}-ecs_compatibility>> is enabled:
1021
- ** ECS Compatibility disabled: `logstash`
1022
- ** ECS Compatibility enabled: `ecs-logstash`
1039
+ ** ECS Compatibility disabled: `logstash`
1040
+ ** ECS Compatibility enabled: `ecs-logstash`
1023
1041
 
1024
1042
 
1025
1043
  This configuration option defines how the template is named inside Elasticsearch.
@@ -283,11 +283,11 @@ module LogStash; module Outputs; class ElasticSearch;
283
283
  end
284
284
 
285
285
  def client_settings
286
- @options[:client_settings] || {}
286
+ @_client_settings ||= @options[:client_settings] || {}
287
287
  end
288
288
 
289
289
  def ssl_options
290
- client_settings.fetch(:ssl, {})
290
+ @_ssl_options ||= client_settings.fetch(:ssl, {})
291
291
  end
292
292
 
293
293
  def http_compression
@@ -132,11 +132,16 @@ module LogStash; module Outputs; class ElasticSearch;
132
132
  ssl_options[:keystore] = keystore
133
133
  ssl_options[:keystore_password] = keystore_password.value if keystore_password
134
134
  end
135
+
135
136
  if !params["ssl_certificate_verification"]
136
137
  logger.warn "You have enabled encryption but DISABLED certificate verification, " +
137
138
  "to make sure your data is secure remove `ssl_certificate_verification => false`"
138
139
  ssl_options[:verify] = :disable # false accepts self-signed but still validates hostname
139
140
  end
141
+
142
+ protocols = params['ssl_supported_protocols']
143
+ ssl_options[:protocols] = protocols if protocols && protocols.any?
144
+
140
145
  { ssl: ssl_options }
141
146
  end
142
147
 
@@ -4,7 +4,7 @@
4
4
  ],
5
5
  "mappings": {
6
6
  "_meta": {
7
- "version": "8.0.0-dev"
7
+ "version": "8.0.1"
8
8
  },
9
9
  "date_detection": false,
10
10
  "dynamic_templates": [
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "mappings": {
17
17
  "_meta": {
18
- "version": "8.0.0-dev"
18
+ "version": "8.0.1"
19
19
  },
20
20
  "date_detection": false,
21
21
  "dynamic_templates": [
@@ -66,6 +66,8 @@ module LogStash; module PluginMixins; module ElasticSearch
66
66
  # Set the keystore password
67
67
  :keystore_password => { :validate => :password },
68
68
 
69
+ :ssl_supported_protocols => { :validate => ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], :default => [], :list => true },
70
+
69
71
  # This setting asks Elasticsearch for the list of all cluster nodes and adds them to the hosts list.
70
72
  # Note: This will return ALL nodes with HTTP enabled (including master nodes!). If you use
71
73
  # this with master nodes, you probably want to disable HTTP on them by setting
@@ -1,7 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-elasticsearch'
3
- s.version = '11.4.1'
4
-
3
+ s.version = '11.5.0'
5
4
  s.licenses = ['apache-2.0']
6
5
  s.summary = "Stores logs in Elasticsearch"
7
6
  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"
@@ -60,25 +60,48 @@ describe "indexing" do
60
60
 
61
61
  let(:curl_opts) { nil }
62
62
 
63
+ let(:es_admin) { 'admin' } # default user added in ES -> 8.x requires auth credentials for /_refresh etc
64
+ let(:es_admin_pass) { 'elastic' }
65
+
63
66
  def curl_and_get_json_response(url, method: :get); require 'open3'
67
+ cmd = "curl -s -v --show-error #{curl_opts} -X #{method.to_s.upcase} -k #{url}"
64
68
  begin
65
- stdout, status = Open3.capture2("curl #{curl_opts} -X #{method.to_s.upcase} -k #{url}")
69
+ out, err, status = Open3.capture3(cmd)
66
70
  rescue Errno::ENOENT
67
71
  fail "curl not available, make sure curl binary is installed and available on $PATH"
68
72
  end
69
73
 
70
74
  if status.success?
71
- LogStash::Json.load(stdout)
75
+ http_status = err.match(/< HTTP\/1.1 (\d+)/)[1] || '0' # < HTTP/1.1 200 OK\r\n
76
+
77
+ if http_status.strip[0].to_i > 2
78
+ error = (LogStash::Json.load(out)['error']) rescue nil
79
+ if error
80
+ fail "#{cmd.inspect} received an error: #{http_status}\n\n#{error.inspect}"
81
+ else
82
+ warn out
83
+ fail "#{cmd.inspect} unexpected response: #{http_status}\n\n#{err}"
84
+ end
85
+ end
86
+
87
+ LogStash::Json.load(out)
72
88
  else
73
- fail "curl failed: #{status}\n #{stdout}"
89
+ warn out
90
+ fail "#{cmd.inspect} process failed: #{status}\n\n#{err}"
74
91
  end
75
92
  end
76
93
 
94
+ let(:initial_events) { [] }
95
+
77
96
  before do
78
97
  subject.register
79
- subject.multi_receive([])
98
+ subject.multi_receive(initial_events) if initial_events
80
99
  end
81
-
100
+
101
+ after do
102
+ subject.do_close
103
+ end
104
+
82
105
  shared_examples "an indexer" do |secure|
83
106
  it "ships events" do
84
107
  subject.multi_receive(events)
@@ -146,17 +169,17 @@ describe "indexing" do
146
169
  let(:user) { "simpleuser" }
147
170
  let(:password) { "abc123" }
148
171
  let(:cacert) { "spec/fixtures/test_certs/ca.crt" }
149
- let(:es_url) {"https://elasticsearch:9200"}
172
+ let(:es_url) { "https://#{get_host_port}" }
150
173
  let(:config) do
151
174
  {
152
- "hosts" => ["elasticsearch:9200"],
175
+ "hosts" => [ get_host_port ],
153
176
  "user" => user,
154
177
  "password" => password,
155
178
  "ssl" => true,
156
179
  "cacert" => cacert,
157
180
  "index" => index
158
181
  }
159
- end
182
+ end
160
183
 
161
184
  let(:curl_opts) { "-u #{user}:#{password}" }
162
185
 
@@ -197,6 +220,8 @@ describe "indexing" do
197
220
 
198
221
  else
199
222
 
223
+ let(:curl_opts) { "#{super()} --tlsv1.2 --tls-max 1.3 -u #{es_admin}:#{es_admin_pass}" } # due ES 8.x we need user/password
224
+
200
225
  it_behaves_like("an indexer", true)
201
226
 
202
227
  describe "with a password requiring escaping" do
@@ -219,6 +244,32 @@ describe "indexing" do
219
244
  include_examples("an indexer", true)
220
245
  end
221
246
 
247
+ context 'with enforced TLSv1.3 protocol' do
248
+ let(:config) { super().merge 'ssl_supported_protocols' => [ 'TLSv1.3' ] }
249
+
250
+ it_behaves_like("an indexer", true)
251
+ end
252
+
253
+ context 'with enforced TLSv1.2 protocol (while ES only enabled TLSv1.3)' do
254
+ let(:config) { super().merge 'ssl_supported_protocols' => [ 'TLSv1.2' ] }
255
+
256
+ let(:initial_events) { nil }
257
+
258
+ it "does not ship events" do
259
+ curl_and_get_json_response index_url, method: :put # make sure index exists
260
+ Thread.start { subject.multi_receive(events) } # we'll be stuck in a retry loop
261
+ sleep 2.5
262
+
263
+ curl_and_get_json_response "#{es_url}/_refresh", method: :post
264
+
265
+ result = curl_and_get_json_response "#{index_url}/_count?q=*"
266
+ cur_count = result["count"]
267
+ expect(cur_count).to eq(0) # ES output keeps re-trying but ends up with a
268
+ # [Manticore::ClientProtocolException] Received fatal alert: protocol_version
269
+ end
270
+
271
+ end if ENV['ES_SSL_SUPPORTED_PROTOCOLS'] == 'TLSv1.3'
272
+
222
273
  end
223
274
 
224
275
  end
@@ -33,7 +33,7 @@ describe "SSL option" do
33
33
 
34
34
  it "should pass the flag to the ES client" do
35
35
  expect(::Manticore::Client).to receive(:new) do |args|
36
- expect(args[:ssl]).to eq(:enabled => true, :verify => :disable)
36
+ expect(args[:ssl]).to match hash_including(:enabled => true, :verify => :disable)
37
37
  end.and_return(manticore_double)
38
38
 
39
39
  subject.register
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.4.1
4
+ version: 11.5.0
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-19 00:00:00.000000000 Z
11
+ date: 2022-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement