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
- Vorbereitung
- SSL-Zertifikate erstellen und auf dem Knoten „node1“ TLS für Elasticsearch aktivieren
- Auf dem Knoten „node1“ TLS für Kibana aktivieren
- Auf dem Knoten „node2“ TLS für Elasticsearch aktivieren
- Auf dem Knoten „node1“ Logstash-Nutzer vorbereiten
- Auf dem Knoten „node1“ TLS für Logstash aktivieren
- Filebeat starten und auf dem Knoten „node1“ TLS einrichten
- Mit Filebeat Daten ingestieren
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 „
[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.
Ö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:
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:
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:
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.
Wählen Sie als Nächstes unter „Time Filter field name“ einen Zeitfilter-Feldnamen aus. Wir nehmen für unser Beispiel @timestamp
:
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!