Engineering

Konfigurieren von SSL, TLS und HTTPS zum Absichern von Elasticsearch, Kibana, Beats und Logstash

Sie verwenden Elastic Stack 6.7.x/7.0.x oder niedriger? Dann sehen Sie sich den Blogpost „How to set up TLS ... “ an, der Tipps zur Absicherung der Kommunikation in diesen Versionen gibt. Die in diesem Blogpost beschriebenen Security-Features erfordern Elastic Stack 6.8/7.1 oder höher.

Elastic stellt seit den Versionen 6.8 und 7.1 des Elastic Stack im Rahmen der Standarddistribution (Basic-Lizenz) etliche Security-Features kostenlos bereit. So können Sie den Netzwerkverkehr mit SSL verschlüsseln, Nutzer erstellen und verwalten, Rollen für den Zugriff auf Index- und Cluster-Ebene definieren und Kibana komplett absichern. Wie Sie die Kommunikation zwischen Elasticsearch und Kibana mittels TLS verschlüsseln können, wird im Blogpost „Erste Schritte mit Elasticsearch Security“ erklärt. Dieser Blogpost hier ergänzt diese Anleitung um Informationen zu den anderen Komponenten des Elastic Stack, einschließlich Logstash und Beats. Dabei soll es um die Aktivierung von TLS für die Kommunikation zwischen Komponenten sowie um das Verschlüsseln der HTTP-Client-Kommunikation gehen.

Die Einrichtung der TLS-Verschlüsselung ist auf der HTTP-Schicht zwar nicht zwingend nötig, wird aber zur Gewährleistung der End-to-End-Security dringend empfohlen. Auf diese Weise wird insbesondere dafür gesorgt, dass keine Anmeldeinformationen „abgelauscht“ werden können, was die Cluster-Sicherheit kompromittieren würde. Wenn Sie mehr zu den Themen TLS-Verschlüsselung, Authentifizierung, Einschränkung des Skripting-Zugriffs oder Isolieren von Cluster und Knoten erfahren möchten, lesen Sie unseren Blogpost „Tipps zum kostenlosen Absichern von Elasticsearch-Clustern mit Verschlüsselung, Nutzern und mehr“.

Und noch ein Hinweis: Die im Folgenden aktivierten Security-Features sind im Elasticsearch Service auf Elastic Cloud standardmäßig bereits enthalten. Nutzer des Elasticsearch Service können daher direkt mit Schritt 5 fortfahren.

Schritte zum Absichern des Elastic Stack

  1. Vorbereitung
  2. SSL-Zertifikate erstellen und auf dem Knoten „node1“ TLS für Elasticsearch aktivieren
  3. Auf dem Knoten „node1“ TLS für Kibana aktivieren
  4. Auf dem Knoten „node2“ TLS für Elasticsearch aktivieren
  5. Auf dem Knoten „node1“ Logstash-Nutzer vorbereiten
  6. Auf dem Knoten „node1“ TLS für Logstash aktivieren
  7. Filebeat starten und auf dem Knoten „node1“ TLS einrichten
  8. Mit Filebeat Daten ingestieren

Elastic Stack-Diagramm

Schritt 1: Vorbereitung

Laden Sie die folgenden Komponenten des Elastic Stack 7.1 oder höher herunter:

[1-1] Datei „/etc/hosts“ konfigurieren

In unserem Beispiel ist auf dem Knoten „node1“ ein Browser installiert und „kibana.local“ erlaubt den Zugriff auf die Kibana-Webseite.

# Datei „/etc/hosts“ für [node1] (wir brauchen „kibana.local“ und „logstash.local“)
127.0.0.1 kibana.local logstash.local
192.168.0.2 node1.elastic.test.com node1
192.168.0.3 node2.elastic.test.com node2
# Datei „/etc/hosts“ für [node2] („kibana.local“ und „logstash.local“ werden hier nicht gebraucht)
192.168.0.2 node1.elastic.test.com node1
192.168.0.3 node2.elastic.test.com node2

Schritt 2: SSL-Zertifikate erstellen und auf dem Knoten „node1“ TLS für Elasticsearch aktivieren

[2-1] Umgebungsvariablen festlegen (Variablenpfad muss daran angepasst werden, wo und wie Elasticsearch heruntergeladen wurde)

[root@node1 ~]# ES_HOME=/usr/share/elasticsearch
[root@node1 ~]# ES_PATH_CONF=/etc/elasticsearch

[2-2] Ordner „tmp“ erstellen

[root@node1 ~]# mkdir tmp
[root@node1 ~]# cd tmp/
[root@node1 tmp]# mkdir cert_blog

[2-3] Instanzdatei „instance.yml“ erstellen

[root@node1 cert_blog]# vi ~/tmp/cert_blog/instance.yml
# Instanzinformationen zur yml-Datei hinzufügen
instances:
  - name: 'node1'
    dns: [ 'node1.elastic.test.com' ]
  - name: "node2"
    dns: [ 'node2.elastic.test.com' ]
  - name: 'my-kibana'
    dns: [ 'kibana.local' ]
  - name: 'logstash'
    dns: [ 'logstash.local' ]

[2-4] Zertifizierungsstelle und Serverzertifikate erzeugen (nachdem Elasticsearch installiert wurde)

[root@node1 tmp]# cd $ES_HOME
[root@node1 elasticsearch]# bin/elasticsearch-certutil cert --keep-ca-key --pem --in ~/tmp/cert_blog/instance.yml --out ~/tmp/cert_blog/certs.zip

[2-5] Zertifikate entpacken

[root@node1 elasticsearch]# cd ~/tmp/cert_blog
[root@node1 cert_blog]# unzip certs.zip -d ./certs

[2-6] TLS für Elasticsearch einrichten

[2-6-1] Zertifikatsdatei in Ordner „config“ kopieren

[root@node1 ~]# cd $ES_PATH_CONF
[root@node1 elasticsearch]# pwd
/etc/elasticsearch
[root@node1 elasticsearch]# mkdir certs
[root@node1 elasticsearch]# cp ~/tmp/cert_blog/certs/ca/ca* ~/tmp/cert_blog/certs/node1/* certs
[root@node1 elasticsearch]# ll certs
total 12
-rw-r--r--. 1 root elasticsearch 1834 Apr 12 08:47 ca.crt
-rw-r--r--. 1 root elasticsearch 1834 Apr 12 08:47 ca.key
-rw-r--r--. 1 root elasticsearch 1509 Apr 12 08:47 node1.crt
-rw-r--r--. 1 root elasticsearch 1679 Apr 12 08:47 node1.key
[root@node1 elasticsearch]#

[2-6-2] „elasticsearch.yml“ konfigurieren

[root@node1 elasticsearch]# vi elasticsearch.yml 
## Folgende Inhalte hinzufügen
node.name: node1
network.host: node1.elastic.test.com
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.key: certs/node1.key
xpack.security.http.ssl.certificate: certs/node1.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt
xpack.security.transport.ssl.key: certs/node1.key
xpack.security.transport.ssl.certificate: certs/node1.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
discovery.seed_hosts: [ "node1.elastic.test.com" ]
cluster.initial_master_nodes: [ "node1" ]

[2-6-3] Starten und Cluster-Log prüfen

[root@node1 elasticsearch]# grep '\[node1\] started' /var/log/elasticsearch/elasticsearch.log 
[o.e.n.Node               ] [node1] started

[2-6-4] Integriertes Nutzerpasswort festlegen

[root@node1 elasticsearch]# cd $ES_HOME
[root@node1 elasticsearch]# bin/elasticsearch-setup-passwords auto -u "https://node1.elastic.test.com:9200"
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N] y
Changed password for user apm_system
PASSWORD apm_system = <apm_system_password>
Changed password for user kibana
PASSWORD kibana = <kibana_password>
Changed password for user logstash_system
PASSWORD logstash_system = <logstash_system_password>
Changed password for user beats_system
PASSWORD beats_system = <beats_system_password>
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = <remote_monitoring_user_password>
Changed password for user elastic
PASSWORD elastic = <elastic_password>

[2-6-5] Über HTTPS auf „_cat/nodes“-API zugreifen

[root@node1 elasticsearch]# curl --cacert ~/tmp/cert_blog/certs/ca/ca.crt -u elastic 'https://node1.elastic.test.com:9200/_cat/nodes?v'
Enter host password for user 'elastic':
ip          heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.0.2           16          95  10    0.76    0.59     0.38 mdi       *      node1
Beim Generieren unserer SSL-Zertifikate in Schritt 2-4 haben wir die Option --keep-ca-key bereitgestellt, sodass die Datei certs.zip neben der Datei „ca/ca.crt“ auch eine Datei namens „ca/ca.key“ enthält. Wenn Sie Ihrem Elasticsearch-Cluster zusätzliche Knoten hinzufügen möchten, sollten Sie auch zusätzliche Knotenzertifikate generieren. Dafür benötigen Sie beide dieser „ca“-Dateien sowie das Passwort, das Sie für das Generieren der Dateien verwendet haben. Bewahren Sie daher diese „ca“-Dateien und das für das Generieren dieser Dateien verwendete Passwort sicher auf.

Schritt 3: Auf dem Knoten „node1“ TLS für Kibana aktivieren

[3-1] Umgebungsvariablen festlegen

Der Variablenpfade müssen daran angepasst werden, wo und wie Kibana heruntergeladen wurde:

[root@node1 ~]# KIBANA_HOME=/usr/share/kibana
[root@node1 ~]# KIBANA_PATH_CONFIG=/etc/kibana

[3-2] Ordner „config“ und „config/certs“ erstellen und Zertifikate kopieren (nachdem Kibana installiert wurde)

Die im Schritt 2-4 erstellten Zertifizierungsdateien in den Ordner „kibana/config/certs“ kopieren:

[root@node1 kibana]# ls config/certs
total 12
ca.crt
my-kibana.crt
my-kibana.key

[3-3] „kibana.yml“ konfigurieren

Dabei ist zu beachten, dass anstelle von „“ das im Schritt 2-6-4 oben festgelegte Passwort zu verwenden ist:

[root@node1 kibana]# vi kibana.yml 
server.name: "my-kibana"
server.host: "kibana.local"
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/config/certs/my-kibana.crt
server.ssl.key: /etc/kibana/config/certs/my-kibana.key
elasticsearch.hosts: ["https://node1.elastic.test.com:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "<kibana_password>"
elasticsearch.ssl.certificateAuthorities: [ "/etc/kibana/config/certs/ca.crt" ]

[3-4] Kibana starten und Kibana-Anmeldung testen

Rufen Sie in einem Browser https://kibana.local:5601/ auf. Melden Sie sich als Nutzer elastic mit dem Passwort an, das in Schritt 2-6-4 festgelegt wurde. In unserem Beispiel ist auf dem Knoten „node1“ ein Browser installiert und „kibana.local“ erlaubt den Zugriff auf Kibana.

Bei Kibana anmelden

Öffentlich vertrauenswürdige Zertifizierungsstellen (Certification Authorities, CA) unterliegen sehr strikten Standards und Auditing-Vorgaben, damit gewährleistet ist, dass das Zertifikat nicht erstellt wird, ohne dass zuvor die Eigentümerschaft der Identität ordnungsgemäß geprüft wurde. Für unsere Erläuterungen in diesem Blogpost werden wir ein selbstsigniertes Zertifikat für Kibana erstellen („selbstsigniert“ bedeutet dabei, dass das erzeugte Zertifikat mit dem eigenen privaten Schlüssel signiert wurde). Clients sehen selbstsignierte Kibana-Zertifikate nicht als vertrauenswürdig an. Daher erscheint in Ihren Kibana-Logs so lange eine Meldung wie die folgende, bis durch Nutzung von Zertifikaten, die von einer Unternehmens- oder einer öffentlichen CA erzeugt wurden, die Vertrauenswürdigkeit nachgewiesen wurde (Link zum Problem im Kibana-Repo). Dieses Problem hat keine Auswirkungen auf Ihre Arbeitsfähigkeit in Kibana:

[18:22:31.675] [error][client][connection] Error: 4443837888:error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown:../deps/openssl/openssl/ssl/s3_pkt.c:1498:SSL alert number 46

Schritt 4: Auf dem Knoten „node2“ TLS für Elasticsearch aktivieren

[4-1] Umgebungsvariablen festlegen

[root@node2 ~]# ES_HOME=/usr/share/elasticsearch
[root@node2 ~]# ES_PATH_CONF=/etc/elasticsearch

[4-2] Auf „node2“ TLS einrichten

Zum Kopieren von Zertifikaten von „node1“ nach „node2“ können Sie den Befehl „scp“ verwenden. Zur Absicherung der Verbindung müssen auf beiden Knoten das Zertifikat und der Schlüssel vorhanden sein. In Produktionsumgebungen wird empfohlen, für jeden Knoten einen ordnungsgemäß signierten Schlüssel zu verwenden. Zu Demonstrationszwecken verwenden wir ein automatisch erzeugtes CA-Zertifikat und ein von unserer erzeugten CA signiertes Multi-DNS-Hostnamen-Zertifikat.

[root@node2 ~]# cd $ES_PATH_CONF
[root@node2 elasticsearch]# pwd
/etc/elasticsearch
[root@node2 elasticsearch]# mkdir certs
[root@node2 elasticsearch]# cp ~/tmp/cert_blog/certs/ca/ca.crt ~/tmp/cert_blog/certs/node2/* certs  
[root@node2 elasticsearch]# 
[root@node2 elasticsearch]# ll certs
total 12
-rw-r--r--. 1 root elasticsearch 1834 Apr 12 10:55 ca.crt
-rw-r--r--. 1 root elasticsearch 1509 Apr 12 10:55 node2.crt
-rw-r--r--. 1 root elasticsearch 1675 Apr 12 10:55 node2.key

[4-3] elasticsearch.yml konfigurieren

[root@node2 elasticsearch]# vi elasticsearch.yml 
node.name: node2
network.host: node2.elastic.test.com
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.key: certs/node2.key
xpack.security.http.ssl.certificate: certs/node2.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt
xpack.security.transport.ssl.key: certs/node2.key
xpack.security.transport.ssl.certificate: certs/node2.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
discovery.seed_hosts: [ "node1.elastic.test.com" ]

[4-4] Starten und Cluster-Log prüfen

[root@node2 elasticsearch]# grep '\[node2\] started' /var/log/elasticsearch/elasticsearch.log 
[o.e.n.Node               ] [node2] started

[4-5] Über HTTPS auf „_cat/nodes“-API zugreifen

[root@node2 elasticsearch]# curl --cacert ~/tmp/cert_blog/certs/ca/ca.crt -u elastic:<password set previously> 'https://node2.elastic.test.com:9200/_cat/nodes?v'
ip          heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.0.2           25          80   5    0.18    0.14     0.30 mdi       *      node1
192.168.0.3           14          96  44    0.57    0.47     0.25 mdi       -      node2

Schritt 5: Auf dem Knoten „node1“ Logstash-Nutzer vorbereiten

[5-1] Rolle „logstash_write_role“ erstellen

Die Rolle kann auf verschiedene Weise erstellt werden.

Sie können sie über die Kibana-Benutzeroberfläche unter „Roles“ erstellen: 

Erstellen der Rolle „logstash_write_role“

Oder Sie können ihn über die API auf dem Tab „Kibana Dev Tools“ erstellen:

POST /_security/role/logstash_write_role
{
    "cluster": [
      "monitor",
      "manage_index_templates"
    ],
    "indices": [
      {
        "names": [
          "logstash*"
        ],
        "privileges": [
          "write",
          "create_index"
        ],
        "field_security": {
          "grant": [
            "*"
          ]
        }
      }
    ],
    "run_as": [],
    "metadata": {},
    "transient_metadata": {
      "enabled": true
    }
}

Folgendes wird zurückgegeben:

{"role":{"created":true}}

Nutzer mit dieser Rolle dürfen keine Dokumente löschen. Wem diese Rolle zugewiesen wurde, darf nur Indizes erstellen, sofern dies über logstash erfolgt, sowie Dokumente für diese Indizes indexieren.

Hinweis für ILM-Benutzer: Um logstash_writer_role zusammen mit dem in 7.3+ standardmäßig aktivierten Index-Lifecycle-Management (ILM) verwenden zu können, müssen die folgenden Privilegien eingebunden werden:


"privileges": ["write","create","delete","create_index","manage","manage_ilm"]
        

[5-2] Nutzer „logstash_writer user“ erstellen (das Passwort für den Nutzer „logstash_writer“ muss geändert werden)

Der Nutzer kann auf verschiedene Weise erstellt werden.

Sie können ihn über die Kibana-Benutzeroberfläche unter „Users“ erstellen:

Erstellen des Nutzers „logstash_writer“

Oder Sie können ihn über die API auf dem Tab „Kibana Dev Tools“ erstellen:

POST /_security/user/logstash_writer
{
  "username": "logstash_writer",
  "roles": [
    "logstash_write_role"
  ],
  "full_name": null,
  "email": null,
  "password": "<logstash_system_password>",
  "enabled": true
}

Folgendes wird zurückgegeben:

{"user":{"created":true}}

Schritt 6: Auf dem Knoten „node1“ TLS für Logstash aktivieren

[6-1] Ordner erstellen und Zertifikate kopieren

[root@node1 logstash]# ls -l
total 24
ca.crt
logstash.crt
logstash.key

[6-2] Schlüssel „logstash.key“ für das Beats-Input-Plugin in das Format „PKCS#8“ umwandeln

[root@node1 logstash]# openssl pkcs8 -in config/certs/logstash.key -topk8 -nocrypt -out config/certs/logstash.pkcs8.key

[6-3] „logstash.yml“ konfigurieren

Denken Sie daran, für den Nutzer „logstash_system“ das in Schritt 2-6-4 automatisch generierte Passwort zu verwenden.

[root@node1 logstash]# vi logstash.yml

Nehmen Sie dann die folgenden Bearbeitungen vor:

node.name: logstash.local
path.config: /etc/logstash/conf.d/*.conf
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: '<logstash_system_password>'
xpack.monitoring.elasticsearch.hosts: [ 'https://node1.elastic.test.com:9200' ]
xpack.monitoring.elasticsearch.ssl.certificate_authority: /etc/logstash/config/certs/ca.crt

[6-4] „conf.d/example.conf“ erstellen und konfigurieren

Verwenden Sie für den Elasticsearch-Output das in Schritt 5-2 erstellte Passwort.

[root@node1 logstash]# vi conf.d/example.conf 
input {
  beats {
    port => 5044
    ssl => true
    ssl_key => '/etc/logstash/config/certs/logstash.pkcs8.key'
    ssl_certificate => '/etc/logstash/config/certs/logstash.crt'
  }
}
output {
  elasticsearch {
    hosts => ["https://node1.elastic.test.com:9200","https://node2.elastic.test.com:9200"]
    cacert => '/etc/logstash/config/certs/ca.crt'
    user => 'logstash_writer'
    password => <logstash_writer_password>
  }
}

[6-5] Logstash mit der Beispielkonfiguration starten und Logstash-Log prüfen

Folgende Logmeldungen sollten angezeigt werden:

[INFO ][logstash.pipeline        ] Pipeline started successfully {:pipeline_id=>".monitoring-logstash", :thread=>"#<Thread:0x640c14d2@/usr/share/logstash/logstash-core/lib/logstash/pipeline.rb:246 run

Und auf dem Kibana-Tab „Monitoring“ wird ein Abschnitt „Logstash“ mit Knoteninformationen, Pipeline-Einstellungen, Betriebssysteminformationen, JVM-Informationen sowie statistischen Werten zu den Prozessen und zur Pipeline-Laufzeit angezeigt:

Kibana-Tab „Monitoring“ mit Abschnitt „Logstash“

Schritt 7: Filebeat starten und auf dem Knoten „node1“ TLS einrichten

[7-1] Ordner „config“ erstellen und Zertifikate kopieren

[root@node1 filebeat]# mkdir config
[root@node1 filebeat]# mkdir config/certs
[root@node1 filebeat]# cp ~/tmp/cert_blog/certs/ca/ca.crt config/certs
[root@node1 filebeat]# ll config/certs/
total 4
-rw-r--r--. 1 root root 1834 Apr 20 00:18 ca.crt

[7-2] Neue Konfigurationsdatei „filebeat.yml“ erstellen

[root@node1 filebeat]# pwd
/etc/filebeat
[root@node1 filebeat]# mv filebeat.yml filebeat.yml.old

[7-3] Neu erstellte Konfigurationsdatei „filebeat.yml“ bearbeiten

filebeat.inputs:
- type: log
  paths:
    - /etc/filebeat/logstash-tutorial-dataset
output.logstash:
  hosts: ["logstash.local:5044"]
  ssl.certificate_authorities:
    - /etc/filebeat/config/certs/ca.crt

Schritt 8: Mit Filebeat Daten ingestieren

[8-1] Input-Logdaten (logstash-tutorial.log) für Filebeat vorbereiten

Laden Sie zunächst die Input-Logdaten herunter.

[root@node1 filebeat]# pwd
/etc/filebeat
[root@node1 filebeat]# mkdir logstash-tutorial-dataset
[root@node1 filebeat]# cp /root/logstash-tutorial.log logstash-tutorial-dataset/.
[root@node1 filebeat]# ll logstash-tutorial-dataset/
total 24
-rwxr-x---. 1 root root 24464 Apr 20 00:29 logstash-tutorial.log

[8-2] Filebeat starten

[root@node1 filebeat]# systemctl start filebeat
[root@node1 filebeat]# systemctl enable filebeat
Created symlink from /etc/systemd/system/multi-user.target.wants/filebeat.service to /usr/lib/systemd/system/filebeat.service.

[8-3] Log prüfen

Folgende Logmeldungen sollten angezeigt werden:

INFO    log/harvester.go:216    Harvester started for file: /etc/filebeat/logstash-tutorial-dataset/logstash-tutorial.log

[8-4] Indexmuster erstellen

Erstellen Sie als Nächstes ein Indexmuster, das den Daten entspricht, die ingestiert werden sollen. Auf diese Weise können die Daten in Kibana visualisiert werden, z. B. mit Graph oder Discover.

Erstellen Sie ein Indexmuster in Kibana.

Wählen Sie als Nächstes unter „Time Filter field name“ einen Zeitfilter-Feldnamen aus. Wir nehmen für unser Beispiel @timestamp:

Wählen Sie unter „Time Filter field name“ einen Zeitfilter-Feldnamen aus.

Das wars! Sie haben die Kommunikation zwischen den verschiedenen Teilen des Elastic Stack verschlüsselt und können jetzt sicher Logdaten ingestieren.

Abschließende Hinweise

Wenn Sie beim Konfigurieren von Security-Features auf Probleme stoßen, sollten Sie sich zuallererst die Tipps zur Problembehebung bei Security-Problemen in unserer Dokumentation ansehen. Das kann Ihnen bei vielen häufigen Problemen helfen. Wenn Sie dann immer noch Fragen haben, versuchen Sie es mit unseren Elastic-Foren. Falls Sie lieber direkt mit dem Elastic-Support-Team sprechen möchten, schließen Sie ein Elastic-Abonnement ab. Damit erhalten Sie direkten Zugang zu unserem Expertenteam. Bleiben Sie immer schön sicher!