Engineering

Erste Schritte mit Elasticsearch Security

Seit den Elastic Stack-Versionen 6.8 und 7.1 können in der Standarddistribution Security-Features wie TLS-Verschlüsselung, rollenbasierte Zugriffssteuerung und mehr kostenlos genutzt werden. In diesem Blogpost beschäftigen wir uns damit, wie Sie diese Features einrichten können, um Ihre Elasticsearch-Cluster sicher zu machen.

Zur Illustration werden wir auf einem lokalen Computer einen aus zwei Knoten bestehenden Elasticsearch-Cluster erstellen und mit den entsprechenden Sicherheitsfunktionen konfigurieren. Als Erstes konfigurieren wir die TLS-Verschlüsselung zwischen den beiden Knoten. Dann machen wir uns daran, die zum Analysieren und Visualisieren der Daten im Cluster verwendete Kibana-Instanz abzusichern. Und schließlich werden wir noch in Kibana die rollenbasierte Zugriffssteuerung konfigurieren, sodass die Nutzer nur die Daten sehen können, die sie sehen dürfen.

Es gibt zur Absicherung von Systemen noch eine Menge mehr zu sagen, aber fürs Erste werden wir es bei den allerwichtigsten Grundlagen belassen. Nachdem Sie sich mit diesem Blogpost beschäftigt haben, empfehlen wir Ihnen, sich unsere Dokumentation zum Absichern des Elastic Stack anzusehen, in der Sie nützliche praktische Beispiele finden. Wir möchten kurz darauf hinweisen, dass wir diese Schritte für einen lokalen Cluster zeigen, weil diese Features erst seit den Elastic Stack-Versionen 6.8 und 7.1 zum Standardlieferumfang gehören, während sie beim Elasticsearch Service schon immer standardmäßig mit dabei waren.

Installieren von Elasticsearch und Kibana

Für dieses Beispiel werde ich Elasticsearch und Kibana auf einem unter Linux laufenden Laptop installieren. Passen Sie bitte die folgenden Schritte an Ihre konkrete Umgebung an.

Schritt 1: Elasticsearch und Kibana herunterladen

Als Erstes müssen Sie die Standarddistribution von Elasticsearch und Kibana in der Version 6.8 (oder höher) oder 7.1 (oder höher) herunterladen. Die Security-Features gehören erst seit den Versionen 6.8 und 7.1 zur Standarddistribution. Wenn Sie eine ältere Version haben, müssen Sie also ein Upgrade vornehmen.

Schritt 2: Elasticsearch und Kibana extrahieren

In diesem Beispiel habe ich elasticsearch-7.1.0-linux-x86_64.tar.gz und kibana-7.1.0-linux-x86_64.tar.gz heruntergeladen. Nach dem Herunterladen muss der Inhalt dieser Archivdateien extrahiert werden.

Schritt 3: Zwei Elasticsearch-Knoten erstellen

Zum Erstellen eines aus zwei Knoten bestehenden Clusters legen wir zwei Kopien des Elasticsearch-Verzeichnisses an und nennen die eine master und die andere node. Nach diesem Schritt haben wir die folgenden Dateien und Ordner:

elasticsearch-7.1.0                      elasticsearch-7.1.0-node
elasticsearch-7.1.0-linux-x86_64.tar.gz kibana-7.1.0-linux-x86_64
elasticsearch-7.1.0-master kibana-7.1.0-linux-x86_64.tar.gz

TLS und Authentifizierung konfigurieren

Als Erstes müssen wir einige Zertifikate generieren, um den Knoten eine sichere Kommunikation zu ermöglichen. Wir können dazu eine Enterprise-CA verwenden, aber für diese Demonstration nutzen wir den Befehl elasticsearch-certutil, mit dem wir dies ohne die üblichen Zertifikatprobleme erreichen können.

Schritt 1: TLS für Elasticsearch-Knoten „master“ konfigurieren

Wir wechseln mit cd zum Verzeichnis master und führen dann den folgenden Befehl aus:

bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

Als Nächstes öffnen wir die Datei config/elasticsearch.yaml in einem beliebigen Texteditor. Am Ende der Datei fügen wir die folgenden Zeilen ein:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

Nach dem Speichern der Datei sind wir bereit, den Master-Knoten zu starten. Dazu führen wir den Befehl bin/elasticsearch aus. Das war’s für den Moment mit diesem Terminal. Wir lassen es geöffnet, denn das Executable muss während der nächsten Schritte laufen.

Schritt 2: Passwörter für den Elasticsearch-Cluster einrichten

Nachdem wir den Master-Knoten gestartet haben, müssen wir jetzt die Passwörter für den Cluster festlegen. Wir öffnen ein neues Terminal-Fenster und gehen mit cd zu unserem Master-Knoten-Verzeichnis. Dann führen wir den Befehl bin/elasticsearch-setup-passwords auto aus. Auf diese Weise werden zufällige Passwörter für die verschiedenen internen Stack-Nutzer generiert. Man kann den Parameter auto auch weglassen, um unter Verwendung des Parameters interactive manuell Passwörter festzulegen. Wir sollten uns diese Passwörter notieren, denn wir brauchen sie gleich wieder.

Schritt 3: TLS für Elasticsearch-Knoten konfigurieren

Jetzt öffnen wir ein neues Terminal-Fenster und gehen mit cd zum Knoten-Verzeichnis. In unserem Beispiel ist dies das Verzeichnis elasticsearch-7.1.0-node.

Am einfachsten wäre es jetzt, den gesamten Inhalt des „master“-Verzeichnisses „config“ in das „node“-Verzeichnis „config“ zu kopieren.

cp ../elasticsearch-7.1.0-master/config/* config/

Außerdem sollte die Konfigurationsoption node.master: false in die Datei config/elasticsearch.yml kopiert werden. Ich werde an dieser Stelle nicht weiter ins Detail gehen. Wenn Sie mehr wissen möchten, sehen Sie sich unsere Cluster-Dokumentation an. Statt die „config“-Dateien im Ganzen zu kopieren, können Sie auch einfach nur die Zertifikatdateien kopieren und dann die xpack.security.*-Schlüssel genauso einrichten wie beim Master-Knoten.

Als Nächstes starten wir den Knoten, indem wir bin/elasticsearch ausführen. Daraufhin wird der Knoten zum Cluster hinzugefügt. Und wenn wir einen Blick auf das Terminal-Fenster des Master-Knotens werfen, sehen wir die Meldung, dass ein Knoten zum Cluster hinzugekommen ist. Wir haben jetzt einen aus zwei Knoten bestehenden Cluster.

Schritt 4: Security in Kibana konfigurieren

Jetzt bleibt uns noch, Kibana zu konfigurieren. Dazu öffnen wir noch ein Terminal-Fenster (das ist das letzte, versprochen!). Wir müssen das Passwort für den Kibana-Nutzer hinzufügen. Dieses haben wir ja zuvor bereits mit dem Befehl „setup-passwords“ generiert.

Wir gehen mit cd zum Kibana-Verzeichnis und öffnen in einem Texteditor die Datei config/kibana.yml. Dort suchen wir die Zeilen, die wie folgt aussehen:

#elasticsearch.username: "user"
#elasticsearch.password: "pass"

Wir machen aus den Kommentarzeilen reguläre Felder, indem wir den Hash (#) vor elasticsearch.username und elasticsearch.password entfernen. Für „user“ setzen wir „kibana“ ein und „pass“ ersetzen wir durch das von setup-passwords angezeigte Kibana-Passwort. Nach dem Speichern der Daten können wir Kibana starten, indem wir bin/kibana ausführen.

Konfigurieren der rollenbasierten Zugriffssteuerung in Kibana

Sobald Kibana läuft, können wir zu unserem Webbrowser wechseln und http://localhost:5601 öffnen. Wir melden uns mit dem Nutzernamen elastic als Superuser an und verwenden das von setup-passwords angezeigte Passwort.

Log into Kibana

Nach einer Neuinstallation wie in unserem Fall werden wir von Kibana gefragt, ob ein paar Beispieldaten geladen werden sollen.

Load sample data into Kibana

Lassen Sie uns zu Illustrationszwecken die Flug- und Web-Beispieldaten laden. Nachdem die Daten geladen wurden, klicken wir auf das Zahnradsymbol, um zu den Konfigurationseinstellungen zu gelangen.

Navigate to management within Kibana

Jetzt geht es an das Erstellen von Rollen. Dazu klicken wir auf die Option Roles.

Roles within Kibana

Als Nächstes klicken wir auf die Schaltfläche Create role.

Create a new role

Die erste Rolle soll Logs lesen können. Wir nennen sie daher read_logs.

Create the read_logs role

Jetzt scrollen wir nach unten zum Abschnitt „Index privileges“, wählen unter „Indices“ den „logs“-Index aus und weisen ihm unter „Privileges“ Leserechte (read) zu.

Configure role privileges

Der Abschnitt zu Spaces ist durchaus wichtig und Sie sollten sich später eingehender mit ihm befassen, aber da es hier um die ersten Schritte zum Einrichten der Security-Features geht, beschäftigen wir uns an dieser Stelle nicht weiter mit ihm. Wenn Sie mehr über Spaces und die hilfreichen Funktionen erfahren möchten, die Spaces für das Organisieren und Absichern von Daten in Kibana bieten, sehen Sie sich unsere Dokumentation zu Kibana Spaces oder den einführenden Blogpost zu Kibana Spaces an.

Als Nächstes erstellen wir eine zweite Rolle, die Lesezugriff auf Fluginformationen erhalten soll und die wir daher read_flight nennen werden.

Create read_flight role

Wir ordnen dem „flights“-Index die Berechtigung read zu.

Configure the role

Jetzt werden wir zwei Nutzer anlegen und ihnen die soeben erstellten Rollen zuordnen. Dazu klicken wir links auf den Link Users und dann auf die Schaltfläche Create new user.

Create a new user

Wir nennen diesen Nutzer flight_user und legen das Passwort für ihn fest. Es ist nicht notwendig, den vollen Nutzernamen oder die E-Mail-Adresse anzugeben. Wir müssen die Rolle read_flight zuweisen und auch die Rolle kibana_user bedarf einer Zuweisung, da dieser Nutzer auf Daten in Kibana zugreifen können soll.

Create the flight user

Wir klicken auf „Create user“ und wiederholen das Ganze für den Nutzer log_user. Dieses Mal fügen wir die Rollen read_logs und kibana_user hinzu.

Create the log user

Jetzt haben wir also zwei neue Nutzer. Wir können uns jetzt als Nutzer elastic abmelden, indem wir auf „Log out“ klicken.

Logout as elastic

Als Nächstes melden wir uns als Nutzer log_user an. Wenn wir auf das Symbol Dashboards klicken, sehen wir, dass es zwei Dashboards gibt: eines für Flüge („Flights“) und eines für Logdaten („Logs“).

Check out your dashboards

Mit einem Klick auf das „Logs“-Dashboard rufen wir die Demo-Logdaten auf. Wenn wir jetzt versuchen, uns das „Flights“-Dashboard anzusehen, sehen wir zwar das Dashboard, aber es gibt darin keinerlei Daten. Das ist ein Beispiel dafür, wie mit Kibana Spaces festgelegt werden kann, dass bestimmte Dashboards nur für bestimmte Nutzer einsehbar sind.

Lassen Sie uns als log_user abmelden und uns anschließend als flight_user anmelden.

Wenn wir jetzt das „Logs“-Dashboard aufrufen, sehen wir keine Daten im Dashboard. Wir erhalten sogar eine Fehlermeldung, weil Kibana nicht auf den „Logs“-Index zugreifen kann.

Data restricted by RBAC

Aber ein Blick auf das „Flights“-Dashboard zeigt, dass wir nun auf die Flugdaten zugreifen können.

Data access provided by RBAC

Voilà! Wir haben jetzt einen aus zwei Knoten bestehenden Cluster und zwei Nutzer, die begrenzten Zugriff auf die Indexdaten haben.

Fazit

Die Security-Features im Elastic Stack sind äußerst vielseitig und umfassen viel mehr, als wir in diesem Blogpost anschneiden konnten. Mit diesem Blogpost wollten wir Ihnen lediglich eine erste Idee geben, was alles möglich ist. Wir werden in künftigen Blogposts und Artikeln viele der Security-Features und den Umgang mit ihnen näher beleuchten. Aber Ihnen stehen auch jetzt schon eine Reihe von Dokumenten und Blogposts zur Verfügung, die die Funktionsweise der Elastic Stack-Security-Features und deren Einsatzmöglichkeiten erklären.

Sie können auch unser öffentliches Forum nutzen und dort Fragen stellen.

Happy Searching!