Skip to content

Commit 48ddb89

Browse files
authored
Feat: add ssl_supported_protocols option (#1055)
1 parent fe0a241 commit 48ddb89

File tree

12 files changed

+114
-19
lines changed

12 files changed

+114
-19
lines changed

.ci/Dockerfile.elasticsearch

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ ARG es_path=/usr/share/elasticsearch
66
ARG es_yml=$es_path/config/elasticsearch.yml
77
ARG SECURE_INTEGRATION
88
ARG ES_SSL_KEY_INVALID
9+
ARG ES_SSL_SUPPORTED_PROTOCOLS
910

1011
RUN rm -f $es_path/config/scripts
1112

@@ -25,6 +26,10 @@ RUN if [ "$SECURE_INTEGRATION" = "true" ] ; then \
2526
fi \
2627
fi
2728
RUN if [ "$SECURE_INTEGRATION" = "true" ] ; then echo "xpack.security.http.ssl.certificate_authorities: [ '$es_path/config/test_certs/ca.crt' ]" >> $es_yml; fi
29+
RUN if [ "$SECURE_INTEGRATION" = "true" ] && [ ! -z "$ES_SSL_SUPPORTED_PROTOCOLS" ] ; then echo "xpack.security.http.ssl.supported_protocols: ${ES_SSL_SUPPORTED_PROTOCOLS}" >> $es_yml; fi
2830

31+
RUN cat $es_yml
32+
33+
RUN if [ "$SECURE_INTEGRATION" = "true" ] ; then $es_path/bin/elasticsearch-users useradd admin -p elastic -r superuser; fi
2934
RUN if [ "$SECURE_INTEGRATION" = "true" ] ; then $es_path/bin/elasticsearch-users useradd simpleuser -p abc123 -r superuser; fi
3035
RUN if [ "$SECURE_INTEGRATION" = "true" ] ; then $es_path/bin/elasticsearch-users useradd 'f@ncyuser' -p 'ab%12#' -r superuser; fi

.ci/docker-compose.override.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ services:
1212
- INTEGRATION=${INTEGRATION:-false}
1313
- SECURE_INTEGRATION=${SECURE_INTEGRATION:-false}
1414
- ES_SSL_KEY_INVALID=${ES_SSL_KEY_INVALID:-false}
15+
- ES_SSL_SUPPORTED_PROTOCOLS=$ES_SSL_SUPPORTED_PROTOCOLS
1516

1617
elasticsearch:
1718
build:
@@ -22,6 +23,9 @@ services:
2223
- INTEGRATION=${INTEGRATION:-false}
2324
- SECURE_INTEGRATION=${SECURE_INTEGRATION:-false}
2425
- ES_SSL_KEY_INVALID=${ES_SSL_KEY_INVALID:-false}
26+
- ES_SSL_SUPPORTED_PROTOCOLS=$ES_SSL_SUPPORTED_PROTOCOLS
27+
environment:
28+
- ES_JAVA_OPTS=-Xms640m -Xmx640m
2529
command: /usr/share/elasticsearch/elasticsearch-run.sh
2630
tty: true
2731
ports:

.ci/logstash-run.sh

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
#!/bin/bash
2+
3+
env
4+
25
set -ex
36

47
export PATH=$BUILD_DIR/gradle/bin:$PATH
58

69
if [[ "$SECURE_INTEGRATION" == "true" ]]; then
7-
ES_URL="https://elasticsearch:9200 -k"
10+
ES_URL="https://elasticsearch:9200"
811
else
912
ES_URL="http://elasticsearch:9200"
1013
fi
1114

15+
# CentOS 7 using curl defaults does not enable TLSv1.3
16+
CURL_OPTS="-k --tlsv1.2 --tls-max 1.3"
17+
1218
wait_for_es() {
1319
count=120
14-
while ! curl -s $ES_URL >/dev/null && [[ $count -ne 0 ]]; do
20+
while ! curl $CURL_OPTS $ES_URL >/dev/null && [[ $count -ne 0 ]]; do
1521
count=$(( $count - 1 ))
1622
[[ $count -eq 0 ]] && exit 1
1723
sleep 1
1824
done
19-
echo $(curl -s $ES_URL | python -c "import sys, json; print(json.load(sys.stdin)['version']['number'])")
25+
echo $(curl $CURL_OPTS -vi $ES_URL | python -c "import sys, json; print(json.load(sys.stdin)['version']['number'])")
2026
}
2127

2228
if [[ "$INTEGRATION" != "true" ]]; then
23-
bundle exec rspec -fd spec/unit -t ~integration -t ~secure_integration
29+
jruby -rbundler/setup -S rspec -fd spec/unit -t ~integration -t ~secure_integration
2430
else
2531

2632
if [[ "$SECURE_INTEGRATION" == "true" ]]; then
@@ -32,5 +38,5 @@ else
3238
echo "Waiting for elasticsearch to respond..."
3339
ES_VERSION=$(wait_for_es)
3440
echo "Elasticsearch $ES_VERSION is Up!"
35-
bundle exec rspec -fd $extra_tag_args --tag update_tests:painless --tag es_version:$ES_VERSION spec/integration
41+
jruby -rbundler/setup -S rspec -fd $extra_tag_args --tag update_tests:painless --tag es_version:$ES_VERSION spec/integration
3642
fi

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ env:
1212
- SECURE_INTEGRATION=true INTEGRATION=true ELASTIC_STACK_VERSION=8.x SNAPSHOT=true LOG_LEVEL=info
1313
- SECURE_INTEGRATION=true INTEGRATION=true ELASTIC_STACK_VERSION=7.x LOG_LEVEL=info
1414
- SECURE_INTEGRATION=true INTEGRATION=true ELASTIC_STACK_VERSION=7.x ES_SSL_KEY_INVALID=true LOG_LEVEL=info
15+
- SECURE_INTEGRATION=true INTEGRATION=true ELASTIC_STACK_VERSION=7.x ES_SSL_SUPPORTED_PROTOCOLS=TLSv1.3 LOG_LEVEL=info

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 11.5.0
2+
- Feat: add ssl_supported_protocols option [#1055](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1055)
3+
14
## 11.4.2
25
- [DOC] Add `v8` to supported values for ecs_compatiblity defaults [#1059](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/1059)
36

docs/index.asciidoc

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ This plugin supports the following configuration options plus the
355355
| <<plugins-{type}s-{plugin}-sniffing_path>> |<<string,string>>|No
356356
| <<plugins-{type}s-{plugin}-ssl>> |<<boolean,boolean>>|No
357357
| <<plugins-{type}s-{plugin}-ssl_certificate_verification>> |<<boolean,boolean>>|No
358+
| <<plugins-{type}s-{plugin}-ssl_supported_protocols>> |<<string,string>>|No
358359
| <<plugins-{type}s-{plugin}-template>> |a valid filesystem path|No
359360
| <<plugins-{type}s-{plugin}-template_name>> |<<string,string>>|No
360361
| <<plugins-{type}s-{plugin}-template_overwrite>> |<<boolean,boolean>>|No
@@ -1004,6 +1005,23 @@ Option to validate the server's certificate. Disabling this severely compromises
10041005
For more information on disabling certificate verification please read
10051006
https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
10061007

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+
10071025
[id="plugins-{type}s-{plugin}-template"]
10081026
===== `template`
10091027

@@ -1018,8 +1036,8 @@ If not set, the included template will be used.
10181036

10191037
* Value type is <<string,string>>
10201038
* 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`
10231041

10241042

10251043
This configuration option defines how the template is named inside Elasticsearch.

lib/logstash/outputs/elasticsearch/http_client.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,11 +283,11 @@ def uris
283283
end
284284

285285
def client_settings
286-
@options[:client_settings] || {}
286+
@_client_settings ||= @options[:client_settings] || {}
287287
end
288288

289289
def ssl_options
290-
client_settings.fetch(:ssl, {})
290+
@_ssl_options ||= client_settings.fetch(:ssl, {})
291291
end
292292

293293
def http_compression

lib/logstash/outputs/elasticsearch/http_client_builder.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,16 @@ def self.setup_ssl(logger, params)
132132
ssl_options[:keystore] = keystore
133133
ssl_options[:keystore_password] = keystore_password.value if keystore_password
134134
end
135+
135136
if !params["ssl_certificate_verification"]
136137
logger.warn "You have enabled encryption but DISABLED certificate verification, " +
137138
"to make sure your data is secure remove `ssl_certificate_verification => false`"
138139
ssl_options[:verify] = :disable # false accepts self-signed but still validates hostname
139140
end
141+
142+
protocols = params['ssl_supported_protocols']
143+
ssl_options[:protocols] = protocols if protocols && protocols.any?
144+
140145
{ ssl: ssl_options }
141146
end
142147

lib/logstash/plugin_mixins/elasticsearch/api_configs.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ module APIConfigs
6666
# Set the keystore password
6767
:keystore_password => { :validate => :password },
6868

69+
:ssl_supported_protocols => { :validate => ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], :default => [], :list => true },
70+
6971
# This setting asks Elasticsearch for the list of all cluster nodes and adds them to the hosts list.
7072
# Note: This will return ALL nodes with HTTP enabled (including master nodes!). If you use
7173
# this with master nodes, you probably want to disable HTTP on them by setting

logstash-output-elasticsearch.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Gem::Specification.new do |s|
22
s.name = 'logstash-output-elasticsearch'
3-
s.version = '11.4.2'
3+
s.version = '11.5.0'
44
s.licenses = ['apache-2.0']
55
s.summary = "Stores logs in Elasticsearch"
66
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"

0 commit comments

Comments
 (0)