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

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: 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