logstash-filter-elasticsearch 3.10.0 → 3.12.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 +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile +3 -0
- data/docs/index.asciidoc +10 -0
- data/lib/logstash/filters/elasticsearch/client.rb +16 -3
- data/lib/logstash/filters/elasticsearch.rb +11 -1
- data/logstash-filter-elasticsearch.gemspec +3 -2
- data/spec/es_helper.rb +20 -12
- data/spec/filters/elasticsearch_spec.rb +65 -7
- data/spec/filters/fixtures/test_certs/ca.crt +20 -0
- data/spec/filters/fixtures/test_certs/ca.key +27 -0
- data/spec/filters/fixtures/test_certs/es.crt +20 -0
- data/spec/filters/fixtures/test_certs/es.key +27 -0
- data/spec/filters/integration/elasticsearch_spec.rb +37 -10
- metadata +26 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ecfb3d5b15acecc9b301e27f77f5170ead83708c2722db56324807e3663cc08
|
4
|
+
data.tar.gz: bd8798a9f82792afb79b1be85936bdf51967dd74c91d6b45bb24b7cadec16e1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b76de8e2722b3b1c5cf11efd0a29cc827042e48d584215e14fb9272349bc5cb50aa04b763a52ff26800ad36f64f2c1870cab27a38dbf94776fde5a25f75a7e08
|
7
|
+
data.tar.gz: 9304e6e00443b13fe5888ae62d0f9c0610cb6917cf148b21373afae460602548172a61efa4fed287e085421c7e9ef26bcebaf7a8ec1aee70a12449942b226a3e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 3.12.0
|
2
|
+
- Added support for `ca_trusted_fingerprint` when run on Logstash 8.3+ [#158](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/158)
|
3
|
+
|
4
|
+
## 3.11.1
|
5
|
+
- Fix: hosts => "es_host:port" regression [#156](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/156)
|
6
|
+
|
7
|
+
## 3.11.0
|
8
|
+
- Feat: update Elasticsearch client to 7.14.0 [#150](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/150)
|
9
|
+
|
1
10
|
## 3.10.0
|
2
11
|
- Feat: add user-agent header passed to the Elasticsearch HTTP connection [#152](https://github.com/logstash-plugins/logstash-filter-elasticsearch/pull/152)
|
3
12
|
|
data/Gemfile
CHANGED
@@ -9,3 +9,6 @@ if Dir.exist?(logstash_path) && use_logstash_source
|
|
9
9
|
gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
|
10
10
|
gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
|
11
11
|
end
|
12
|
+
|
13
|
+
gem 'manticore', ENV['MANTICORE_VERSION'] if ENV['MANTICORE_VERSION']
|
14
|
+
gem 'elasticsearch', ENV['ELASTICSEARCH_VERSION'] if ENV['ELASTICSEARCH_VERSION']
|
data/docs/index.asciidoc
CHANGED
@@ -128,6 +128,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
|
|
128
128
|
| <<plugins-{type}s-{plugin}-aggregation_fields>> |<<hash,hash>>|No
|
129
129
|
| <<plugins-{type}s-{plugin}-api_key>> |<<password,password>>|No
|
130
130
|
| <<plugins-{type}s-{plugin}-ca_file>> |a valid filesystem path|No
|
131
|
+
| <<plugins-{type}s-{plugin}-ca_trusted_fingerprint>> |<<string,string>>|No
|
131
132
|
| <<plugins-{type}s-{plugin}-cloud_auth>> |<<password,password>>|No
|
132
133
|
| <<plugins-{type}s-{plugin}-cloud_id>> |<<string,string>>|No
|
133
134
|
| <<plugins-{type}s-{plugin}-docinfo_fields>> |<<hash,hash>>|No
|
@@ -189,6 +190,15 @@ Elasticsearch {ref}/security-api-create-api-key.html[Create API key API].
|
|
189
190
|
|
190
191
|
SSL Certificate Authority file
|
191
192
|
|
193
|
+
[id="plugins-{type}s-{plugin}-ca_trusted_fingerprint"]
|
194
|
+
===== `ca_trusted_fingerprint`
|
195
|
+
|
196
|
+
* Value type is <<string,string>>, and must contain exactly 64 hexadecimal characters.
|
197
|
+
* There is no default value for this setting.
|
198
|
+
* Use of this option _requires_ Logstash 8.3+
|
199
|
+
|
200
|
+
The SHA-256 fingerprint of an SSL Certificate Authority to trust, such as the autogenerated self-signed CA for an Elasticsearch cluster.
|
201
|
+
|
192
202
|
[id="plugins-{type}s-{plugin}-cloud_auth"]
|
193
203
|
===== `cloud_auth`
|
194
204
|
|
@@ -26,10 +26,12 @@ module LogStash
|
|
26
26
|
logger.warn "Supplied proxy setting (proxy => '') has no effect" if @proxy.eql?('')
|
27
27
|
transport_options[:proxy] = proxy.to_s if proxy && !proxy.eql?('')
|
28
28
|
|
29
|
-
hosts = hosts
|
29
|
+
hosts = setup_hosts(hosts, ssl)
|
30
|
+
|
31
|
+
ssl_options = {}
|
30
32
|
# set ca_file even if ssl isn't on, since the host can be an https url
|
31
|
-
ssl_options
|
32
|
-
ssl_options
|
33
|
+
ssl_options.update(ssl: true, ca_file: options[:ca_file]) if options[:ca_file]
|
34
|
+
ssl_options.update(ssl: true, trust_strategy: options[:ssl_trust_strategy]) if options[:ssl_trust_strategy]
|
33
35
|
|
34
36
|
logger.info("New ElasticSearch filter client", :hosts => hosts)
|
35
37
|
@client = ::Elasticsearch::Client.new(hosts: hosts, transport_options: transport_options, transport_class: ::Elasticsearch::Transport::Transport::HTTP::Manticore, :ssl => ssl_options)
|
@@ -41,6 +43,17 @@ module LogStash
|
|
41
43
|
|
42
44
|
private
|
43
45
|
|
46
|
+
def setup_hosts(hosts, ssl)
|
47
|
+
hosts.map do |h|
|
48
|
+
if h.start_with?('http:/', 'https:/')
|
49
|
+
h
|
50
|
+
else
|
51
|
+
host, port = h.split(':')
|
52
|
+
{ host: host, port: port, scheme: (ssl ? 'https' : 'http') }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
44
57
|
def setup_basic_auth(user, password)
|
45
58
|
return {} unless user && password && password.value
|
46
59
|
|
@@ -2,6 +2,8 @@
|
|
2
2
|
require "logstash/filters/base"
|
3
3
|
require "logstash/namespace"
|
4
4
|
require "logstash/json"
|
5
|
+
require 'logstash/plugin_mixins/ca_trusted_fingerprint_support'
|
6
|
+
|
5
7
|
require_relative "elasticsearch/client"
|
6
8
|
require_relative "elasticsearch/patches/_elasticsearch_transport_http_manticore"
|
7
9
|
|
@@ -73,6 +75,9 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
|
|
73
75
|
# Tags the event on failure to look up geo information. This can be used in later analysis.
|
74
76
|
config :tag_on_failure, :validate => :array, :default => ["_elasticsearch_lookup_failure"]
|
75
77
|
|
78
|
+
# config :ca_trusted_fingerprint, :validate => :sha_256_hex
|
79
|
+
include LogStash::PluginMixins::CATrustedFingerprintSupport
|
80
|
+
|
76
81
|
attr_reader :clients_pool
|
77
82
|
|
78
83
|
##
|
@@ -199,6 +204,7 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
|
|
199
204
|
:proxy => @proxy,
|
200
205
|
:ssl => @ssl,
|
201
206
|
:ca_file => @ca_file,
|
207
|
+
:ssl_trust_strategy => trust_strategy_for_ca_trusted_fingerprint
|
202
208
|
}
|
203
209
|
end
|
204
210
|
|
@@ -320,6 +326,10 @@ class LogStash::Filters::Elasticsearch < LogStash::Filters::Base
|
|
320
326
|
end
|
321
327
|
|
322
328
|
def test_connection!
|
323
|
-
|
329
|
+
begin
|
330
|
+
get_client.client.ping
|
331
|
+
rescue Elasticsearch::UnsupportedProductError
|
332
|
+
raise LogStash::ConfigurationError, "Could not connect to a compatible version of Elasticsearch"
|
333
|
+
end
|
324
334
|
end
|
325
335
|
end #class LogStash::Filters::Elasticsearch
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-filter-elasticsearch'
|
4
|
-
s.version = '3.
|
4
|
+
s.version = '3.12.0'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Copies fields from previous log events in Elasticsearch to current events "
|
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"
|
@@ -21,8 +21,9 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
# Gem dependencies
|
23
23
|
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
|
24
|
-
s.add_runtime_dependency 'elasticsearch', ">=
|
24
|
+
s.add_runtime_dependency 'elasticsearch', ">= 7.14.0" # LS >= 6.7 and < 7.14 all used version 5.0.5
|
25
25
|
s.add_runtime_dependency 'manticore', ">= 0.7.1"
|
26
|
+
s.add_runtime_dependency 'logstash-mixin-ca_trusted_fingerprint_support', '~> 1.0'
|
26
27
|
s.add_development_dependency 'cabin', ['~> 0.6']
|
27
28
|
s.add_development_dependency 'webrick'
|
28
29
|
|
data/spec/es_helper.rb
CHANGED
@@ -7,12 +7,26 @@ module ESHelper
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
def self.curl_and_get_json_response(url, method: :get, args: nil); require 'open3'
|
11
|
+
cmd = "curl -s -v --show-error #{args} -X #{method.to_s.upcase} -k #{url}"
|
12
|
+
begin
|
13
|
+
out, err, status = Open3.capture3(cmd)
|
14
|
+
rescue Errno::ENOENT
|
15
|
+
fail "curl not available, make sure curl binary is installed and available on $PATH"
|
16
|
+
end
|
17
|
+
|
18
|
+
if status.success?
|
19
|
+
http_status = err.match(/< HTTP\/1.1 (.*?)/)[1] || '0' # < HTTP/1.1 200 OK\r\n
|
20
|
+
if http_status.strip[0].to_i > 2
|
21
|
+
warn out
|
22
|
+
fail "#{cmd.inspect} unexpected response: #{http_status}\n\n#{err}"
|
23
|
+
end
|
24
|
+
|
25
|
+
LogStash::Json.load(out)
|
26
|
+
else
|
27
|
+
warn out
|
28
|
+
fail "#{cmd.inspect} process failed: #{status}\n\n#{err}"
|
29
|
+
end
|
16
30
|
end
|
17
31
|
|
18
32
|
def self.doc_type
|
@@ -25,12 +39,6 @@ module ESHelper
|
|
25
39
|
end
|
26
40
|
end
|
27
41
|
|
28
|
-
def self.index_doc(es, params)
|
29
|
-
type = doc_type
|
30
|
-
params[:type] = doc_type unless type.nil?
|
31
|
-
es.index(params)
|
32
|
-
end
|
33
|
-
|
34
42
|
def self.es_version
|
35
43
|
ENV['ES_VERSION'] || ENV['ELASTIC_STACK_VERSION']
|
36
44
|
end
|
@@ -9,15 +9,41 @@ require "uri"
|
|
9
9
|
|
10
10
|
describe LogStash::Filters::Elasticsearch do
|
11
11
|
|
12
|
+
subject(:plugin) { described_class.new(config) }
|
13
|
+
|
14
|
+
let(:event) { LogStash::Event.new({}) }
|
15
|
+
|
12
16
|
context "registration" do
|
13
17
|
|
14
18
|
let(:plugin) { LogStash::Plugin.lookup("filter", "elasticsearch").new({}) }
|
15
|
-
|
16
|
-
|
19
|
+
|
20
|
+
context "against authentic Elasticsearch" do
|
21
|
+
before do
|
22
|
+
allow(plugin).to receive(:test_connection!)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not raise an exception" do
|
26
|
+
expect {plugin.register}.to_not raise_error
|
27
|
+
end
|
17
28
|
end
|
18
29
|
|
19
|
-
|
20
|
-
|
30
|
+
context "against not authentic Elasticsearch" do
|
31
|
+
let(:failing_client) do
|
32
|
+
client = double("client")
|
33
|
+
allow(client).to receive(:ping).and_raise Elasticsearch::UnsupportedProductError
|
34
|
+
|
35
|
+
client_wrapper = double("filter_client")
|
36
|
+
allow(client_wrapper).to receive(:client).and_return client
|
37
|
+
client_wrapper
|
38
|
+
end
|
39
|
+
|
40
|
+
before do
|
41
|
+
allow(plugin).to receive(:get_client).and_return(failing_client)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should raise ConfigurationError" do
|
45
|
+
expect {plugin.register}.to raise_error(LogStash::ConfigurationError)
|
46
|
+
end
|
21
47
|
end
|
22
48
|
end
|
23
49
|
|
@@ -31,8 +57,6 @@ describe LogStash::Filters::Elasticsearch do
|
|
31
57
|
"aggregation_fields" => { "bytes_avg" => "bytes_avg_ls_field" }
|
32
58
|
}
|
33
59
|
end
|
34
|
-
let(:plugin) { described_class.new(config) }
|
35
|
-
let(:event) { LogStash::Event.new({}) }
|
36
60
|
|
37
61
|
let(:response) do
|
38
62
|
LogStash::Json.load(File.read(File.join(File.dirname(__FILE__), "fixtures", "request_x_1.json")))
|
@@ -537,6 +561,38 @@ describe LogStash::Filters::Elasticsearch do
|
|
537
561
|
end
|
538
562
|
end
|
539
563
|
|
564
|
+
describe "ca_trusted_fingerprint" do
|
565
|
+
let(:ca_trusted_fingerprint) { SecureRandom.hex(32) }
|
566
|
+
let(:config) { {"ca_trusted_fingerprint" => ca_trusted_fingerprint}}
|
567
|
+
|
568
|
+
subject(:plugin) { described_class.new(config) }
|
569
|
+
|
570
|
+
if Gem::Version.create(LOGSTASH_VERSION) >= Gem::Version.create("8.3.0")
|
571
|
+
context 'the generated trust_strategy' do
|
572
|
+
before(:each) { allow(plugin).to receive(:test_connection!) }
|
573
|
+
|
574
|
+
it 'is passed to the Manticore client' do
|
575
|
+
expect(Manticore::Client).to receive(:new)
|
576
|
+
.with(
|
577
|
+
a_hash_including(
|
578
|
+
ssl: a_hash_including(
|
579
|
+
trust_strategy: plugin.trust_strategy_for_ca_trusted_fingerprint
|
580
|
+
)
|
581
|
+
)
|
582
|
+
).and_call_original
|
583
|
+
plugin.register
|
584
|
+
|
585
|
+
# the client is built lazily, so we need to get it explicitly
|
586
|
+
plugin.send(:get_client).client
|
587
|
+
end
|
588
|
+
end
|
589
|
+
else
|
590
|
+
it 'raises a configuration error' do
|
591
|
+
expect { plugin }.to raise_exception(LogStash::ConfigurationError, a_string_including("ca_trusted_fingerprint"))
|
592
|
+
end
|
593
|
+
end
|
594
|
+
end
|
595
|
+
|
540
596
|
describe "defaults" do
|
541
597
|
|
542
598
|
let(:config) { Hash.new }
|
@@ -547,7 +603,9 @@ describe LogStash::Filters::Elasticsearch do
|
|
547
603
|
it "should set localhost:9200 as hosts" do
|
548
604
|
plugin.register
|
549
605
|
client = plugin.send(:get_client).client
|
550
|
-
|
606
|
+
hosts = extract_transport(client).hosts
|
607
|
+
expect( hosts.size ).to be 1
|
608
|
+
expect( hosts[0] ).to include(:host => "localhost", :port => 9200, :scheme => "http")
|
551
609
|
end
|
552
610
|
end
|
553
611
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDSTCCAjGgAwIBAgIUUcAg9c8B8jiliCkOEJyqoAHrmccwDQYJKoZIhvcNAQEL
|
3
|
+
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
|
4
|
+
cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNDU1WhcNMjQwODExMDUxNDU1WjA0MTIwMAYD
|
5
|
+
VQQDEylFbGFzdGljIENlcnRpZmljYXRlIFRvb2wgQXV0b2dlbmVyYXRlZCBDQTCC
|
6
|
+
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK1HuusRuGNsztd4EQvqwcMr
|
7
|
+
8XvnNNaalerpMOorCGySEFrNf0HxDIVMGMCrOv1F8SvlcGq3XANs2MJ4F2xhhLZr
|
8
|
+
PpqVHx+QnSZ66lu5R89QVSuMh/dCMxhNBlOA/dDlvy+EJBl9H791UGy/ChhSgaBd
|
9
|
+
OKVyGkhjErRTeMIq7rR7UG6GL/fV+JGy41UiLrm1KQP7/XVD9UzZfGq/hylFkTPe
|
10
|
+
oox5BUxdxUdDZ2creOID+agtIYuJVIkelKPQ+ljBY3kWBRexqJQsvyNUs1gZpjpz
|
11
|
+
YUCzuVcXDRuJXYQXGqWXhsBPfJv+ZcSyMIBUfWT/G13cWU1iwufPy0NjajowPZsC
|
12
|
+
AwEAAaNTMFEwHQYDVR0OBBYEFMgkye5+2l+TE0I6RsXRHjGBwpBGMB8GA1UdIwQY
|
13
|
+
MBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
|
14
|
+
hvcNAQELBQADggEBAIgtJW8sy5lBpzPRHkmWSS/SCZIPsABW+cHqQ3e0udrI3CLB
|
15
|
+
G9n7yqAPWOBTbdqC2GM8dvAS/Twx4Bub/lWr84dFCu+t0mQq4l5kpJMVRS0KKXPL
|
16
|
+
DwJbUN3oPNYy4uPn5Xi+XY3BYFce5vwJUsqIxeAbIOxVTNx++k5DFnB0ESAM23QL
|
17
|
+
sgUZl7xl3/DkdO4oHj30gmTRW9bjCJ6umnHIiO3JoJatrprurUIt80vHC4Ndft36
|
18
|
+
NBQ9mZpequ4RYjpSZNLcVsxyFAYwEY4g8MvH0MoMo2RRLfehmMCzXnI/Wh2qEyYz
|
19
|
+
emHprBii/5y1HieKXlX9CZRb5qEPHckDVXW3znw=
|
20
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEowIBAAKCAQEArUe66xG4Y2zO13gRC+rBwyvxe+c01pqV6ukw6isIbJIQWs1/
|
3
|
+
QfEMhUwYwKs6/UXxK+VwardcA2zYwngXbGGEtms+mpUfH5CdJnrqW7lHz1BVK4yH
|
4
|
+
90IzGE0GU4D90OW/L4QkGX0fv3VQbL8KGFKBoF04pXIaSGMStFN4wirutHtQboYv
|
5
|
+
99X4kbLjVSIuubUpA/v9dUP1TNl8ar+HKUWRM96ijHkFTF3FR0NnZyt44gP5qC0h
|
6
|
+
i4lUiR6Uo9D6WMFjeRYFF7GolCy/I1SzWBmmOnNhQLO5VxcNG4ldhBcapZeGwE98
|
7
|
+
m/5lxLIwgFR9ZP8bXdxZTWLC58/LQ2NqOjA9mwIDAQABAoIBABmBC0P6Ebegljkk
|
8
|
+
lO26GdbOKvbfqulDS3mN5QMyXkUMopea03YzMnKUJriE+2O33a1mUcuDPWnLpYPK
|
9
|
+
BTiQieYHlulNtY0Bzf+R69igRq9+1WpZftGnzrlu7NVxkOokRqWJv3546ilV7QZ0
|
10
|
+
f9ngmu+tiN7hEnlBC8m613VMuGGb3czwbCizEVZxlZX0Dk2GExbH7Yf3NNs/aOP/
|
11
|
+
8x6CqgL+rhrtOQ80xwRrOlEF8oSSjXCzypa3nFv21YO3J2lVo4BoIwnHgOzyz46A
|
12
|
+
b37gekqXXajIYQ0HAB+NDgVoCRFFJ7Xe16mgB3DpyUpUJzwiMedJkeQ0TprIownQ
|
13
|
+
+1mPe9ECgYEA/K4jc0trr3sk8KtcZjOYdpvwrhEqSSGEPeGfFujZaKOb8PZ8PX6j
|
14
|
+
MbCTV12nEgm8FEhZQ3azxLnO17gbJ2A+Ksm/IIwnTWlqvvMZD5qTQ7L3qZuCtbWQ
|
15
|
+
+EGC/H1SDjhiwvjHcXP61/tYL/peApBSoj0L4kC+U/VaNyvicudKk08CgYEAr46J
|
16
|
+
4VJBJfZ4ZaUBRy53+fy+mknOfaj2wo8MnD3u+/x4YWTapqvDOPN2nJVtKlIsxbS4
|
17
|
+
qCO+fzUV17YHlsQmGULNbtFuXWJkP/RcLVbe8VYg/6tmk0dJwNAe90flagX2KJov
|
18
|
+
8eDX129nNpuUqrNNWsfeLmPmH6vUzpKlga+1zfUCgYBrbUHHJ96dmbZn2AMNtIvy
|
19
|
+
iXP3HXcj5msJwB3aKJ8eHMkU1kaWAnwxiQfrkfaQ9bCP0v6YbyQY1IJ7NlvdDs7/
|
20
|
+
dAydMtkW0WW/zyztdGN92d3vrx0QUiRTV87vt/wl7ZUXnZt1wcB5CPRCWaiUYHWx
|
21
|
+
YlDmHW6N1XdIk5DQF0OegwKBgEt7S8k3Zo9+A5IgegYy8p7njsQjy8a3qTFJ9DAR
|
22
|
+
aPmrOc8WX/SdkVihRXRZwxAZOOrgoyyYAcYL+xI+T9EBESh3UoC9R2ibb2MYG7Ha
|
23
|
+
0gyN7a4/8eCNHCbs1QOZRAhr+8TFVqv28pbMbWJLToZ+hVns6Zikl0MyzFLtNoAm
|
24
|
+
HlMpAoGBAIOkqnwwuRKhWprL59sdcJfWY26os9nvuDV4LoKFNEFLJhj2AA2/3UlV
|
25
|
+
v85gqNSxnMNlHLZC9l2HZ3mKv/mfx1aikmFvyhJAnk5u0f9KkexmCPLjQzS5q3ba
|
26
|
+
yFuxK2DXwN4x46RgQPFlLjOTCX0BG6rkEu4JdonF8ETSjoCtGEU8
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDNjCCAh6gAwIBAgIUF9wE+oqGSbm4UVn1y9gEjzyaJFswDQYJKoZIhvcNAQEL
|
3
|
+
BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
|
4
|
+
cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNTI3WhcNMjQwODExMDUxNTI3WjANMQswCQYD
|
5
|
+
VQQDEwJlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2S2by0lgyu
|
6
|
+
1JfgGgZ41PNXbH2qMPMzowguVVdtZ16WM0CaEG7lnLxmMcC+2Q7NnGuFnPAVQo9T
|
7
|
+
Q3bh7j+1PkCJVHUKZfJIeWtGc9+qXBcO1MhedfwM1osSa4bfwM85G+XKWbRNtmSt
|
8
|
+
CoUuKArIyZkzdBAAQLBoQyPf3DIza1Au4j9Hb3zrswD6e7n2PN4ffIyil1GFduLJ
|
9
|
+
2275qqFiOhkEDUhv7BKNftVBh/89O/5lSqAQGuQ1aDRr8TdHwhO71u4ZIU/Pn6yX
|
10
|
+
LGBWrQG53+qpdCsxGvJTfbtIEYUDTN83CirIxDKJgc1QXOEldylztHf4xnQ7ZarJ
|
11
|
+
tqF6pUzHbRsCAwEAAaNnMGUwHQYDVR0OBBYEFFQUK+6Cg2kExRj1xSDzEi4kkgKX
|
12
|
+
MB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMBgGA1UdEQQRMA+CDWVs
|
13
|
+
YXN0aWNzZWFyY2gwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAinaknZIc
|
14
|
+
7xtQNwUwa+kdET+I4lMz+TJw9vTjGKPJqe082n81ycKU5b+a/OndG90z+dTwhShW
|
15
|
+
f0oZdIe/1rDCdiRU4ceCZA4ybKrFDIbW8gOKZOx9rsgEx9XNELj4ocZTBqxjQmNE
|
16
|
+
Ho91fli5aEm0EL2vJgejh4hcfDeElQ6go9gtvAHQ57XEADQSenvt69jOICOupnS+
|
17
|
+
LSjDVhv/VLi3CAip0B+lD5fX/DVQdrJ62eRGuQYxoouE3saCO58qUUrKB39yD9KA
|
18
|
+
qRA/sVxyLogxaU+5dLfc0NJdOqSzStxQ2vdMvAWo9tZZ2UBGFrk5SdwCQe7Yv5mX
|
19
|
+
qi02i4q6meHGcw==
|
20
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEowIBAAKCAQEArZLZvLSWDK7Ul+AaBnjU81dsfaow8zOjCC5VV21nXpYzQJoQ
|
3
|
+
buWcvGYxwL7ZDs2ca4Wc8BVCj1NDduHuP7U+QIlUdQpl8kh5a0Zz36pcFw7UyF51
|
4
|
+
/AzWixJrht/Azzkb5cpZtE22ZK0KhS4oCsjJmTN0EABAsGhDI9/cMjNrUC7iP0dv
|
5
|
+
fOuzAPp7ufY83h98jKKXUYV24snbbvmqoWI6GQQNSG/sEo1+1UGH/z07/mVKoBAa
|
6
|
+
5DVoNGvxN0fCE7vW7hkhT8+frJcsYFatAbnf6ql0KzEa8lN9u0gRhQNM3zcKKsjE
|
7
|
+
MomBzVBc4SV3KXO0d/jGdDtlqsm2oXqlTMdtGwIDAQABAoIBAQCm/VBDz41ImG7p
|
8
|
+
yu3e6iMeFi7HW5SKdlRUS5dJbHT1uBWJAm/q8TbwvnUBVdsn9cKWY06QYDPQBjAy
|
9
|
+
0LxRSIKivjyl+aIJDZbbEUXrmk/M0zT9rHtgSc2isM8ITH6IHw5q7lmNMPLYOu6T
|
10
|
+
IMvfTDtADBOOTV/vF+/4NKf5GCUXVt1XTzLBFMK0p/ZoI7Fsw7fhH6FR12vk0xA4
|
11
|
+
BEC4pwRbGfHo7P31ii0by8epkve93tF4IZuFmN92A84bN1z7Kc4TYaSbua2rgguz
|
12
|
+
FzMyWpsTxr363HzCK1xOJb6JyJOiXbq4+j2oqtne3GIvyozJeiyKRgjLIMoe/LV7
|
13
|
+
fPPc5wlhAoGBAOD3z0JH2eyR/1RHILFsWInH2nDbKHHuCjhFIL2XloeXsJkiJZ95
|
14
|
+
BpdjExMZCqD44tPNRW/GgWKwoVwltm6zB0aq0aW/OfOzw6fhKt1W+go47L7Tpwap
|
15
|
+
VQgy6BFXSueUKfQDlZEWV4E2gakf8vOl0/VRQExae/CeKf1suEedQaErAoGBAMWE
|
16
|
+
LOmNDEU2NFqghfNBAFYyFJst3YnBmSmlL7W22+OsfSK/PhxnJbuNHxMgxpg9rieW
|
17
|
+
tVyjuZRo/i7WLVm3uG+dK1RJ9t8Y6kpYkCRKpi9G8DBOj3PSulOybBr+fdRfW9mf
|
18
|
+
8UmqOjOkrhxXPkchc9TY4EM7/1XeKvEidlIp0gvRAoGAAurz4zYvW2QhXaR2hhaT
|
19
|
+
p2XSLXiKM8AUndo3rH3U0/lhrvrEZicZsMj2LF88xg20U27sIaD/eJo13Y4XqaPk
|
20
|
+
ykPY6D9srv574SeIeMpx/8PxPiBcoDd+BNc0L1VkgVBoouORAwq5I9HjKKBjdEmI
|
21
|
+
UDw3i0X5KYvDm6fXVAZ0HXUCgYBWc4To8KiXPqNpq2sVzrSkBaWJSmj2G7u7Q6b/
|
22
|
+
RTs3is72v3gjHG6iiaE5URY7mnu4rjlRhAP9Vnsy6uHMrCJZEBTf/sPEYHZj9iGZ
|
23
|
+
EOduOAF3U1tsmaaebbDtm8hdhSOBvITy9kQlSIZAt1r17Ulytz5pj0AySFzJUIkz
|
24
|
+
a0SZkQKBgCWixtUxiK8PAdWhyS++90WJeJn8eqjuSAz+VMtFQFRRWDUbkiHvGMRu
|
25
|
+
o/Hhk6zS46gSF2Evb1d26uUEenXnJlIp6YWzb0DLPrfy5P53kPA6YEvYq5MSAg3l
|
26
|
+
DZOJUF+ko7cWXSZkeTIBH/jrGOdP4tTALZt6DNt+Gz7xwPO5tGgV
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -7,11 +7,12 @@ require_relative "../../../spec/es_helper"
|
|
7
7
|
describe LogStash::Filters::Elasticsearch, :integration => true do
|
8
8
|
|
9
9
|
ELASTIC_SECURITY_ENABLED = ENV['ELASTIC_SECURITY_ENABLED'].eql? 'true'
|
10
|
+
SECURE_INTEGRATION = ENV['SECURE_INTEGRATION'].eql? 'true'
|
10
11
|
|
11
12
|
let(:base_config) do
|
12
13
|
{
|
13
14
|
"index" => 'logs',
|
14
|
-
"hosts" => [ESHelper.get_host_port],
|
15
|
+
"hosts" => ["http#{SECURE_INTEGRATION ? 's' : nil}://#{ESHelper.get_host_port}"],
|
15
16
|
"query" => "response: 404",
|
16
17
|
"sort" => "response",
|
17
18
|
"fields" => [ ["response", "code"] ],
|
@@ -19,27 +20,40 @@ describe LogStash::Filters::Elasticsearch, :integration => true do
|
|
19
20
|
end
|
20
21
|
|
21
22
|
let(:credentials) do
|
22
|
-
|
23
|
+
if SECURE_INTEGRATION
|
24
|
+
{ 'user' => 'tests', 'password' => 'Tests123' } # added user
|
25
|
+
else
|
26
|
+
{ 'user' => 'elastic', 'password' => ENV['ELASTIC_PASSWORD'] }
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
30
|
let(:config) do
|
26
|
-
ELASTIC_SECURITY_ENABLED ? base_config.merge(credentials) : base_config
|
31
|
+
config = ELASTIC_SECURITY_ENABLED ? base_config.merge(credentials) : base_config
|
32
|
+
config = { 'ca_file' => ca_path }.merge(config) if SECURE_INTEGRATION
|
33
|
+
config
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:ca_path) do
|
37
|
+
File.expand_path('../fixtures/test_certs/ca.crt', File.dirname(__FILE__))
|
27
38
|
end
|
28
39
|
|
29
40
|
let(:plugin) { described_class.new(config) }
|
30
41
|
let(:event) { LogStash::Event.new({}) }
|
31
42
|
|
32
43
|
before(:each) do
|
33
|
-
|
34
|
-
|
44
|
+
es_url = ESHelper.get_host_port
|
45
|
+
es_url = SECURE_INTEGRATION ? "https://#{es_url}" : "http://#{es_url}"
|
46
|
+
args = ELASTIC_SECURITY_ENABLED ? "-u #{credentials['user']}:#{credentials['password']}" : ''
|
35
47
|
# Clean ES of data before we start.
|
36
|
-
|
48
|
+
# Delete all templates first.
|
49
|
+
ESHelper.curl_and_get_json_response "#{es_url}/_index_template/*", method: 'DELETE', args: args
|
37
50
|
# This can fail if there are no indexes, ignore failure.
|
38
|
-
|
51
|
+
ESHelper.curl_and_get_json_response "#{es_url}/_index/*", method: 'DELETE', args: args
|
52
|
+
doc_args = "#{args} -H 'Content-Type: application/json' -d '{\"response\": 404, \"this\":\"that\"}'"
|
39
53
|
10.times do
|
40
|
-
ESHelper.
|
54
|
+
ESHelper.curl_and_get_json_response "#{es_url}/logs/_doc", method: 'POST', args: doc_args
|
41
55
|
end
|
42
|
-
|
56
|
+
ESHelper.curl_and_get_json_response "#{es_url}/_refresh", method: 'POST', args: args
|
43
57
|
end
|
44
58
|
|
45
59
|
it "should enhance the current event with new data" do
|
@@ -69,10 +83,23 @@ describe LogStash::Filters::Elasticsearch, :integration => true do
|
|
69
83
|
super().reject { |key, _| key == 'password' }
|
70
84
|
end
|
71
85
|
|
72
|
-
it "
|
86
|
+
it "fails to register plugin" do
|
73
87
|
expect { plugin.register }.to raise_error Elasticsearch::Transport::Transport::Errors::Unauthorized
|
74
88
|
end
|
75
89
|
|
76
90
|
end if ELASTIC_SECURITY_ENABLED
|
77
91
|
|
92
|
+
context 'setting host:port (and ssl)' do # reproduces GH-155
|
93
|
+
|
94
|
+
let(:config) do
|
95
|
+
super().merge "hosts" => [ESHelper.get_host_port], "ssl" => SECURE_INTEGRATION
|
96
|
+
end
|
97
|
+
|
98
|
+
it "works" do
|
99
|
+
expect { plugin.register }.to_not raise_error
|
100
|
+
plugin.filter(event)
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
78
105
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -35,7 +35,7 @@ dependencies:
|
|
35
35
|
requirements:
|
36
36
|
- - ">="
|
37
37
|
- !ruby/object:Gem::Version
|
38
|
-
version:
|
38
|
+
version: 7.14.0
|
39
39
|
name: elasticsearch
|
40
40
|
prerelease: false
|
41
41
|
type: :runtime
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
requirements:
|
44
44
|
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 7.14.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
requirements:
|
@@ -58,6 +58,20 @@ dependencies:
|
|
58
58
|
- - ">="
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 0.7.1
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.0'
|
67
|
+
name: logstash-mixin-ca_trusted_fingerprint_support
|
68
|
+
prerelease: false
|
69
|
+
type: :runtime
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '1.0'
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
76
|
requirement: !ruby/object:Gem::Requirement
|
63
77
|
requirements:
|
@@ -128,6 +142,10 @@ files:
|
|
128
142
|
- spec/filters/fixtures/request_size0_agg.json
|
129
143
|
- spec/filters/fixtures/request_x_1.json
|
130
144
|
- spec/filters/fixtures/request_x_10.json
|
145
|
+
- spec/filters/fixtures/test_certs/ca.crt
|
146
|
+
- spec/filters/fixtures/test_certs/ca.key
|
147
|
+
- spec/filters/fixtures/test_certs/es.crt
|
148
|
+
- spec/filters/fixtures/test_certs/es.key
|
131
149
|
- spec/filters/integration/elasticsearch_spec.rb
|
132
150
|
homepage: http://www.elastic.co/guide/en/logstash/current/index.html
|
133
151
|
licenses:
|
@@ -164,4 +182,8 @@ test_files:
|
|
164
182
|
- spec/filters/fixtures/request_size0_agg.json
|
165
183
|
- spec/filters/fixtures/request_x_1.json
|
166
184
|
- spec/filters/fixtures/request_x_10.json
|
185
|
+
- spec/filters/fixtures/test_certs/ca.crt
|
186
|
+
- spec/filters/fixtures/test_certs/ca.key
|
187
|
+
- spec/filters/fixtures/test_certs/es.crt
|
188
|
+
- spec/filters/fixtures/test_certs/es.key
|
167
189
|
- spec/filters/integration/elasticsearch_spec.rb
|