Elasticsearch 8 on Ubuntu 20.04

Install Prerequisites

apt install apt-transport-https

Install public key

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Add repo

echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list

Install Packages

apt update
apt install elasticsearch
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Die folgenden NEUEN Pakete werden installiert:
  elasticsearch
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 526 MB an Archiven heruntergeladen werden.
Nach dieser Operation werden 1.109 MB Plattenplatz zusätzlich benutzt.
Holen:1 https://artifacts.elastic.co/packages/8.x/apt stable/main amd64 elasticsearch amd64 8.2.2 [526 MB]
Es wurden 469 MB in 26 s geholt (17,8 MB/s).                                                                                  
Vormals nicht ausgewähltes Paket elasticsearch wird gewählt.
(Lese Datenbank ... 426682 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../elasticsearch_8.2.2_amd64.deb ...
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Entpacken von elasticsearch (8.2.2) ...
elasticsearch (8.2.2) wird eingerichtet ...

--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

The generated password for the elastic built-in superuser is : XXXXXXXXXXXXXXXXXXXX

If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.

You can complete the following actions at any time:

Reset the password of the elastic built-in superuser with 
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.

Generate an enrollment token for Kibana instances with 
 '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.

Generate an enrollment token for Elasticsearch nodes with 
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.

-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

Add path to environment

echo "export PATH=/usr/share/elasticsearch/bin/:$PATH" >> /root/.bashrc

Configure daemon

vi /etc/elasticsearch/elasticsearch.yml
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

network.host: 127.0.0.1
http.port: 9200

# Enable security features
xpack.security.enabled: true
xpack.security.enrollment.enabled: true

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
cluster.initial_master_nodes: ["elastics.ear.ch"]

# Allow HTTP API connections from anywhere
# Connections are encrypted and require user authentication
http.host: 0.0.0.0

Enable Elasticsearch daemon during startup

systemctl daemon-reload
systemctl enable elasticsearch.service
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /lib/systemd/system/elasticsearch.service.

Start Elasticsearch

service elasticsearch start

Check running ports

netstat -tulpn | grep java
tcp6       0      0 :::9200                 :::*                    LISTEN      108291/java         
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      108291/java

Check status

service elasticsearch status
● elasticsearch.service - Elasticsearch
     Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-06-01 20:25:44 CEST; 5min ago
       Docs: https://www.elastic.co
   Main PID: 108291 (java)
      Tasks: 72 (limit: 38283)
     Memory: 16.6G
     CGroup: /system.slice/elasticsearch.service
             ├─108291 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -Djava.security.manager=allow -XX:+AlwaysPreTouch -Xss1m -Djava.awt.>
             └─108586 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

Jun 01 20:25:28 elastics.ear.ch systemd[1]: Starting Elasticsearch...
Jun 01 20:25:44 elastics.ear.ch systemd[1]: Started Elasticsearch.

Check Java version

java -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)

Send https request to Elasticsearch node

PASSWD is the bootstrap password which was generated during installation.

curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:PASSWD https://localhost:9200
{
  "name" : "elastics.ear.ch",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ietEhUU1QTKSdJVoYaYugw",
  "version" : {
    "number" : "8.2.2",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "93769a8ef3c7d5186b44fd3bd4483e0149d2f2420",
    "build_date" : "2022-05-25T15:47:06.259735307Z",
    "build_snapshot" : false,
    "lucene_version" : "9.1.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Add Elasticsearch root CA certificate to trust store

cp /etc/elasticsearch/certs/http_ca.crt \
   /usr/local/share/ca-certificates/elasticsearch_http_ca.crt
update-ca-certificates && updatedb && locate elasticsearch_http_ca
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

done.
done.
/etc/ssl/certs/elasticsearch_http_ca.pem
/usr/local/share/ca-certificates/elasticsearch_http_ca.crt

curl works now without path to CAcert

curl -u elastic:PASSWORD https://localhost:9200 --head -v
*   Trying 127.0.0.1:9200...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 9200 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=elastics.ear.ch
*  start date: Jun  2 21:35:45 2022 GMT
*  expire date: Jun  1 21:35:45 2024 GMT
*  subjectAltName: host "localhost" matched cert's "localhost"
*  issuer: CN=Elasticsearch security auto-configuration HTTP CA
*  SSL certificate verify ok.
* Server auth using Basic with user 'elastic'
> HEAD / HTTP/1.1
> Host: localhost:9200
> Authorization: Basic ZWxhc3RpYzp0SUJJNlE9TmNHRXVNeDdhbTB2Tw==
> User-Agent: curl/7.68.0
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< X-elastic-product: Elasticsearch
X-elastic-product: Elasticsearch
< content-type: application/json
content-type: application/json
< content-length: 530
content-length: 530

< 
* Connection #0 to host localhost left intact
curl  'https://localhost:9200/_nodes?pretty' -u elastic:PASSWORD

Add bootstrap password

elasticsearch-keystore add "bootstrap.password"
Enter value for bootstrap.password: MY_SECRET_PASSWORD

Check health

curl -X GET http://localhost:9200/_cluster/health?pretty
{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 30,
  "active_shards" : 30,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 1,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 96.7741935483871
}