logstash-input-elasticsearch 4.6.2 → 4.7.0

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: 92c58eb709a67922d73d44a13cca7fc933968747feebb0c7afa81c04ea3543d2
4
- data.tar.gz: 4354af2982b8af23492a8c1f4c063c21ce6e2d1bfc1e082a9de243ab1c575248
3
+ metadata.gz: a7719819282371ea4fbfc4ce20de33e30a47f60a3683eb865de44f46743b0df0
4
+ data.tar.gz: 0a73015d8f782597a939a326aebddc79bf260bdf1f02b543f00823f59bc74e27
5
5
  SHA512:
6
- metadata.gz: ba09a7c97593fb2b32cbd4c1f5c4448af2d6ed10c32908ea98b5d4bd54ec0bf11321ae30c48afa745be27bc6280c8fbac6c3f7e62dfa8d5887142dce04e3d0b3
7
- data.tar.gz: 86e4b75f7937c4e66a23b5724902d35db23303d297d7d46cfb55092efc14d0141e708b73b2a72ee1f459f27bc4a9ee0f46d337de2b31b9f38675e25286b58778
6
+ metadata.gz: a2dea22533a17a4b47d72f5fe58ac5d1b819f58de71e6311d8dc2f6adac733be96bbf0748dcf4fdd5bca644dae15f755463c72313dff3e11ad805f1bebc350ad
7
+ data.tar.gz: bdebe2a507305e0fe0d788cce9e47acbc607de2992257a7d60f486c16126b7c2a4f7e47fd1a12be87eb2b57a1c9df9d5c9c19c9b2d919f5a0b23eda06b3a9f8c
@@ -1,3 +1,6 @@
1
+ ## 4.7.0
2
+ - Added api_key support [#131](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/131)
3
+
1
4
  ## 4.6.2
2
5
  - Added scroll clearing and better handling of scroll expiration [#128](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/128)
3
6
 
@@ -68,6 +68,16 @@ Further documentation describing this syntax can be found
68
68
  https://github.com/jmettraux/rufus-scheduler#parsing-cronlines-and-time-strings[here].
69
69
 
70
70
 
71
+ [id="plugins-{type}s-{plugin}-auth"]
72
+ ==== Authentication
73
+
74
+ Authentication to a secure Elasticsearch cluster is possible using _one_ of the following options:
75
+
76
+ * <<plugins-{type}s-{plugin}-user>> AND <<plugins-{type}s-{plugin}-password>>
77
+ * <<plugins-{type}s-{plugin}-cloud_auth>>
78
+ * <<plugins-{type}s-{plugin}-api_key>>
79
+
80
+
71
81
  [id="plugins-{type}s-{plugin}-options"]
72
82
  ==== Elasticsearch Input Configuration Options
73
83
 
@@ -76,6 +86,7 @@ This plugin supports the following configuration options plus the <
76
86
  [cols="<,<,<",options="header",]
77
87
  |=======================================================================
78
88
  |Setting |Input type|Required
89
+ | <<plugins-{type}s-{plugin}-api_key>> |<<password,password>>|No
79
90
  | <<plugins-{type}s-{plugin}-ca_file>> |a valid filesystem path|No
80
91
  | <<plugins-{type}s-{plugin}-cloud_auth>> |<<password,password>>|No
81
92
  | <<plugins-{type}s-{plugin}-cloud_id>> |<<string,string>>|No
@@ -100,6 +111,16 @@ input plugins.
100
111
 
101
112
  &nbsp;
102
113
 
114
+ [id="plugins-{type}s-{plugin}-api_key"]
115
+ ===== `api_key`
116
+
117
+ * Value type is <<password,password>>
118
+ * There is no default value for this setting.
119
+
120
+ Authenticate using Elasticsearch API key. Note that this option also requires enabling the `ssl` option.
121
+
122
+ Format is `id:api_key` where `id` and `api_key` are as returned by the Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html[Create API key API].
123
+
103
124
  [id="plugins-{type}s-{plugin}-ca_file"]
104
125
  ===== `ca_file`
105
126
 
@@ -315,4 +336,4 @@ empty string authentication will be disabled.
315
336
  [id="plugins-{type}s-{plugin}-common-options"]
316
337
  include::{include_path}/{type}.asciidoc[]
317
338
 
318
- :default_codec!:
339
+ :default_codec!:
@@ -70,11 +70,6 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
70
70
  # Port defaults to 9200
71
71
  config :hosts, :validate => :array
72
72
 
73
- # Cloud ID, from the Elastic Cloud web console. If set `hosts` should not be used.
74
- #
75
- # For more info, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_id[Logstash-to-Cloud documentation]
76
- config :cloud_id, :validate => :string
77
-
78
73
  # The index or alias to search.
79
74
  config :index, :validate => :string, :default => "logstash-*"
80
75
 
@@ -140,11 +135,20 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
140
135
  # Basic Auth - password
141
136
  config :password, :validate => :password
142
137
 
138
+ # Cloud ID, from the Elastic Cloud web console. If set `hosts` should not be used.
139
+ #
140
+ # For more info, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_id[Logstash-to-Cloud documentation]
141
+ config :cloud_id, :validate => :string
142
+
143
143
  # Cloud authentication string ("<username>:<password>" format) is an alternative for the `user`/`password` configuration.
144
144
  #
145
145
  # For more info, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_auth[Logstash-to-Cloud documentation]
146
146
  config :cloud_auth, :validate => :password
147
147
 
148
+ # Authenticate using Elasticsearch API key.
149
+ # format is id:api_key (as returned by https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html[Create API key])
150
+ config :api_key, :validate => :password
151
+
148
152
  # Set the address of a forward HTTP proxy.
149
153
  config :proxy, :validate => :uri_or_empty
150
154
 
@@ -177,28 +181,17 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
177
181
  @slices < 1 && fail(LogStash::ConfigurationError, "Elasticsearch Input Plugin's `slices` option must be greater than zero, got `#{@slices}`")
178
182
  end
179
183
 
180
- transport_options = {}
181
-
184
+ validate_authentication
182
185
  fill_user_password_from_cloud_auth
186
+ fill_hosts_from_cloud_id
183
187
 
184
- if @user && @password
185
- token = Base64.strict_encode64("#{@user}:#{@password.value}")
186
- transport_options[:headers] = { :Authorization => "Basic #{token}" }
187
- end
188
188
 
189
- fill_hosts_from_cloud_id
190
- @hosts = Array(@hosts).map { |host| host.to_s } # potential SafeURI#to_s
189
+ transport_options = {:headers => {}}
190
+ transport_options[:headers].merge!(setup_basic_auth(user, password))
191
+ transport_options[:headers].merge!(setup_api_key(api_key))
191
192
 
192
- hosts = if @ssl
193
- @hosts.map do |h|
194
- host, port = h.split(":")
195
- { :host => host, :scheme => 'https', :port => port }
196
- end
197
- else
198
- @hosts
199
- end
200
- ssl_options = { :ssl => true, :ca_file => @ca_file } if @ssl && @ca_file
201
- ssl_options ||= {}
193
+ hosts = setup_hosts
194
+ ssl_options = setup_ssl
202
195
 
203
196
  @logger.warn "Supplied proxy setting (proxy => '') has no effect" if @proxy.eql?('')
204
197
 
@@ -351,25 +344,67 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
351
344
  hosts.nil? || ( hosts.is_a?(Array) && hosts.empty? )
352
345
  end
353
346
 
354
- def fill_hosts_from_cloud_id
355
- return unless @cloud_id
347
+ def validate_authentication
348
+ authn_options = 0
349
+ authn_options += 1 if @cloud_auth
350
+ authn_options += 1 if (@api_key && @api_key.value)
351
+ authn_options += 1 if (@user || (@password && @password.value))
356
352
 
357
- if @hosts && !hosts_default?(@hosts)
358
- raise LogStash::ConfigurationError, 'Both cloud_id and hosts specified, please only use one of those.'
353
+ if authn_options > 1
354
+ raise LogStash::ConfigurationError, 'Multiple authentication options are specified, please only use one of user/password, cloud_auth or api_key'
359
355
  end
360
- @hosts = parse_host_uri_from_cloud_id(@cloud_id)
356
+
357
+ if @api_key && @api_key.value && @ssl != true
358
+ raise(LogStash::ConfigurationError, "Using api_key authentication requires SSL/TLS secured communication using the `ssl => true` option")
359
+ end
360
+ end
361
+
362
+ def setup_ssl
363
+ @ssl && @ca_file ? { :ssl => true, :ca_file => @ca_file } : {}
364
+ end
365
+
366
+ def setup_hosts
367
+ @hosts = Array(@hosts).map { |host| host.to_s } # potential SafeURI#to_s
368
+ if @ssl
369
+ @hosts.map do |h|
370
+ host, port = h.split(":")
371
+ { :host => host, :scheme => 'https', :port => port }
372
+ end
373
+ else
374
+ @hosts
375
+ end
376
+ end
377
+
378
+ def setup_basic_auth(user, password)
379
+ return {} unless user && password && password.value
380
+
381
+ token = ::Base64.strict_encode64("#{user}:#{password.value}")
382
+ { Authorization: "Basic #{token}" }
383
+ end
384
+
385
+ def setup_api_key(api_key)
386
+ return {} unless (api_key && api_key.value)
387
+
388
+ token = ::Base64.strict_encode64(api_key.value)
389
+ { Authorization: "ApiKey #{token}" }
361
390
  end
362
391
 
363
392
  def fill_user_password_from_cloud_auth
364
393
  return unless @cloud_auth
365
394
 
366
- if @user || @password
367
- raise LogStash::ConfigurationError, 'Both cloud_auth and user/password specified, please only use one.'
368
- end
369
395
  @user, @password = parse_user_password_from_cloud_auth(@cloud_auth)
370
396
  params['user'], params['password'] = @user, @password
371
397
  end
372
398
 
399
+ def fill_hosts_from_cloud_id
400
+ return unless @cloud_id
401
+
402
+ if @hosts && !hosts_default?(@hosts)
403
+ raise LogStash::ConfigurationError, 'Both cloud_id and hosts specified, please only use one of those.'
404
+ end
405
+ @hosts = parse_host_uri_from_cloud_id(@cloud_id)
406
+ end
407
+
373
408
  def parse_host_uri_from_cloud_id(cloud_id)
374
409
  begin # might not be available on older LS
375
410
  require 'logstash/util/cloud_setting_id'
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-elasticsearch'
4
- s.version = '4.6.2'
4
+ s.version = '4.7.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads query results from an Elasticsearch cluster"
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"
@@ -583,7 +583,37 @@ describe LogStash::Inputs::TestableElasticsearch do
583
583
  let(:config) { super.merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
584
584
 
585
585
  it "should fail" do
586
- expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_auth and user/
586
+ expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
587
+ end
588
+ end
589
+ end if LOGSTASH_VERSION > '6.0'
590
+
591
+ describe "api_key" do
592
+ context "without ssl" do
593
+ let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
594
+
595
+ it "should fail" do
596
+ expect { plugin.register }.to raise_error LogStash::ConfigurationError, /api_key authentication requires SSL\/TLS/
597
+ end
598
+ end
599
+
600
+ context "with ssl" do
601
+ let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
602
+
603
+ it "should set authorization" do
604
+ plugin.register
605
+ client = plugin.send(:client)
606
+ auth_header = client.transport.options[:transport_options][:headers][:Authorization]
607
+
608
+ expect( auth_header ).to eql "ApiKey #{Base64.strict_encode64('foo:bar')}"
609
+ end
610
+
611
+ context 'user also set' do
612
+ let(:config) { super.merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
613
+
614
+ it "should fail" do
615
+ expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
616
+ end
587
617
  end
588
618
  end
589
619
  end if LOGSTASH_VERSION > '6.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.6.2
4
+ version: 4.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-02 00:00:00.000000000 Z
11
+ date: 2020-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement