2017-11-10 12:33:56 -05:00
[role="xpack"]
[[configuring-tls-docker]]
2018-07-18 03:07:31 -04:00
=== Encrypting Communications in an {es} Docker Container
2017-11-10 12:33:56 -05:00
Starting with version 6.0.0, {security} (Gold, Platinum or Enterprise subscriptions) https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking-6.0.0-xes.html[requires SSL/TLS]
encryption for the transport networking layer.
This section demonstrates an easy path to get started with SSL/TLS for both
2018-07-18 03:07:31 -04:00
HTTPS and transport using the {es} Docker image. The example uses
Docker Compose to manage the containers.
2017-11-10 12:33:56 -05:00
For further details, please refer to
{xpack-ref}/encrypting-communications.html[Encrypting Communications] and
https://www.elastic.co/subscriptions[available subscriptions].
[float]
==== Prepare the environment
2017-11-14 07:25:52 -05:00
<<docker,Install {es} with Docker>>.
2017-11-10 12:33:56 -05:00
2018-07-18 03:07:31 -04:00
Inside a new, empty directory, create the following four files:
2017-11-10 12:33:56 -05:00
`instances.yml`:
["source","yaml"]
----
instances:
- name: es01
dns:
- es01 <1>
- localhost
ip:
- 127.0.0.1
2018-07-18 03:07:31 -04:00
2017-11-10 12:33:56 -05:00
- name: es02
dns:
- es02
- localhost
ip:
- 127.0.0.1
----
<1> Allow use of embedded Docker DNS server names.
`.env`:
[source,yaml]
----
2018-05-14 16:07:27 -04:00
CERTS_DIR=/usr/share/elasticsearch/config/certificates <1>
2017-11-10 12:33:56 -05:00
ELASTIC_PASSWORD=PleaseChangeMe <2>
----
<1> The path, inside the Docker image, where certificates are expected to be found.
<2> Initial password for the `elastic` user.
[[getting-starter-tls-create-certs-composefile]]
`create-certs.yml`:
ifeval::["{release-state}"=="unreleased"]
WARNING: Version {version} of {es} has not yet been released, so a
`create-certs.yml` is not available for this version.
endif::[]
ifeval::["{release-state}"!="unreleased"]
["source","yaml",subs="attributes"]
----
version: '2.2'
2018-07-18 03:07:31 -04:00
2017-11-10 12:33:56 -05:00
services:
create_certs:
container_name: create_certs
image: docker.elastic.co/elasticsearch/elasticsearch-platinum:{version}
command: >
bash -c '
2018-05-14 16:07:27 -04:00
if [[ ! -d config/certificates/certs ]]; then
mkdir config/certificates/certs;
2017-11-10 12:33:56 -05:00
fi;
if [[ ! -f /local/certs/bundle.zip ]]; then
2018-05-14 16:07:27 -04:00
bin/elasticsearch-certgen --silent --in config/certificates/instances.yml --out config/certificates/certs/bundle.zip;
unzip config/certificates/certs/bundle.zip -d config/certificates/certs; <1>
2017-11-10 12:33:56 -05:00
fi;
2018-05-14 16:07:27 -04:00
chgrp -R 0 config/certificates/certs
2017-11-10 12:33:56 -05:00
'
user: $\{UID:-1000\}
working_dir: /usr/share/elasticsearch
2018-05-14 16:07:27 -04:00
volumes: ['.:/usr/share/elasticsearch/config/certificates']
2017-11-10 12:33:56 -05:00
----
<1> The new node certificates and CA certificate+key are placed under the local directory `certs`.
endif::[]
[[getting-starter-tls-create-docker-compose]]
`docker-compose.yml`:
ifeval::["{release-state}"=="unreleased"]
WARNING: Version {version} of {es} has not yet been released, so a
`docker-compose.yml` is not available for this version.
endif::[]
ifeval::["{release-state}"!="unreleased"]
["source","yaml",subs="attributes"]
----
version: '2.2'
2018-07-18 03:07:31 -04:00
2017-11-10 12:33:56 -05:00
services:
es01:
container_name: es01
image: docker.elastic.co/elasticsearch/elasticsearch-platinum:{version}
environment:
- node.name=es01
- discovery.zen.minimum_master_nodes=2
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD <1>
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
2018-07-18 03:07:31 -04:00
- xpack.license.self_generated.type=trial <2>
- xpack.security.enabled=true
2017-11-10 12:33:56 -05:00
- xpack.security.http.ssl.enabled=true
- xpack.security.transport.ssl.enabled=true
2018-07-18 03:07:31 -04:00
- xpack.security.transport.ssl.verification_mode=certificate <3>
2017-11-10 12:33:56 -05:00
- xpack.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.ssl.certificate=$CERTS_DIR/es01/es01.crt
- xpack.ssl.key=$CERTS_DIR/es01/es01.key
volumes: ['esdata_01:/usr/share/elasticsearch/data', './certs:$CERTS_DIR']
ports:
- 9200:9200
healthcheck:
test: curl --cacert $CERTS_DIR/ca/ca.crt -s https://localhost:9200 >/dev/null; if [[ $$? == 52 ]]; then echo 0; else echo 1; fi
interval: 30s
timeout: 10s
retries: 5
2018-07-18 03:07:31 -04:00
2017-11-10 12:33:56 -05:00
es02:
container_name: es02
2018-07-18 03:07:31 -04:00
image: docker.elastic.co/elasticsearch/elasticsearch:{version}
2017-11-10 12:33:56 -05:00
environment:
- node.name=es02
- discovery.zen.minimum_master_nodes=2
- ELASTIC_PASSWORD=$ELASTIC_PASSWORD
- discovery.zen.ping.unicast.hosts=es01
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
2018-07-18 03:07:31 -04:00
- xpack.license.self_generated.type=trial
- xpack.security.enabled=true
2017-11-10 12:33:56 -05:00
- xpack.security.http.ssl.enabled=true
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.ssl.certificate=$CERTS_DIR/es02/es02.crt
- xpack.ssl.key=$CERTS_DIR/es02/es02.key
volumes: ['esdata_02:/usr/share/elasticsearch/data', './certs:$CERTS_DIR']
2018-07-18 03:07:31 -04:00
2017-11-10 12:33:56 -05:00
wait_until_ready:
2018-07-18 03:07:31 -04:00
image: docker.elastic.co/elasticsearch/elasticsearch:{version}
2017-11-10 12:33:56 -05:00
command: /usr/bin/true
depends_on: {"es01": {"condition": "service_healthy"}}
2018-07-18 03:07:31 -04:00
2017-11-10 12:33:56 -05:00
volumes: {"esdata_01": {"driver": "local"}, "esdata_02": {"driver": "local"}}
----
2018-07-18 03:07:31 -04:00
<1> Bootstrap `elastic` with the password defined in `.env`. See
2018-05-02 16:09:25 -04:00
{stack-ov}/built-in-users.html#bootstrap-elastic-passwords[the Elastic Bootstrap Password].
2018-07-18 03:07:31 -04:00
<2> Automatically generate and apply a trial subscription, in order to enable
{security}.
<3> Disable verification of authenticity for inter-node communication. Allows
2017-11-10 12:33:56 -05:00
creating self-signed certificates without having to pin specific internal IP addresses.
endif::[]
[float]
==== Run the example
. Generate the certificates (only needed once):
+
--
["source","sh"]
----
docker-compose -f create-certs.yml up
----
--
. Start two {es} nodes configured for SSL/TLS:
+
--
["source","sh"]
----
docker-compose up -d
----
--
. Access the {es} API over SSL/TLS using the bootstrapped password:
+
--
["source","sh"]
----
2017-11-13 13:00:35 -05:00
curl --cacert certs/ca/ca.crt -u elastic:PleaseChangeMe https://localhost:9200
2017-11-10 12:33:56 -05:00
----
// NOTCONSOLE
--
2018-04-11 11:21:15 -04:00
. The `elasticsearch-setup-passwords` tool can also be used to generate random
passwords for all users:
2017-11-10 12:33:56 -05:00
+
--
2017-11-14 07:25:52 -05:00
WARNING: Windows users not running PowerShell will need to remove `\` and join lines in the snippet below.
2017-11-10 12:33:56 -05:00
["source","sh"]
----
2018-04-11 11:21:15 -04:00
docker exec es01 /bin/bash -c "bin/elasticsearch-setup-passwords \
2017-11-14 07:25:52 -05:00
auto --batch \
2018-05-14 16:07:27 -04:00
-Expack.ssl.certificate=certificates/es01/es01.crt \
-Expack.ssl.certificate_authorities=certificates/ca/ca.crt \
-Expack.ssl.key=certificates/es01/es01.key \
2017-11-14 07:25:52 -05:00
--url https://localhost:9200"
2017-11-10 12:33:56 -05:00
----
--