19 Juli 2016 Engineering

Site-Plugins mit Elasticsearch 5.0 ausführen

Von Clinton Gormley

Mit dem Release 0.17 haben wir Elasticsearch schon vor Ewigkeiten beigebracht, wie man statische Webseiten ausliefert, und damit waren die Site-Plugins geschaffen. Mit Site-Plugins konnten Nutzer Javascript-Anwendungen schreiben, die grafische Benutzeroberflächen für Elasticsearch bereitstellen.

Darauf folgte eine Entwicklungsflut seitens der Elasticsearch-Nutzer, die nun Plugins für die Überwachung der Elasticsearch-Daten, für die Indexverwaltung, die Visualisierung von Segment-Merging sowie Analyser-Debugging, das Einrichten von Clustern und noch vieles mehr produzierten.

Die beiden beliebtesten Site-Plugins sind zur Zeit Head und Kopf. Beide verbinden Monitoring mit Indexverwaltung.

So weit, so gut. Jetzt kommt die schlechte Nachricht…

Site-Plugins werden in Elasticsearch 5.0 nicht mehr unterstützt

Was fällt uns ein, diese beliebte Funktion aus Elasticsearch zu entfernen?

Elasticsearch ist nicht als Webserver konzipiert worden. Die Auslieferung statischer Dateien war nur ein Hack, der sich einfach auf die HTTP REST-Schnittstelle von Elasticsearch aufsetzen ließ. Was ist so schlimm daran, statische Dateien auszuliefern?

Nun ja, es hat sich herausgestellt, dass das simple Ausliefern statischer Dateien gefährlich sein kann. Zwei von den sieben Sicherheitslücken, die je in Elasticsearch gefunden wurden, hatten mit Site-Plugins zu tun. Das ist schon ziemlich signifikant, besonders für eine optionale Funktion. Zum Vergleich: zwei der anderen Lücken hatten mit dynamischem Scripting zu tun und wir haben eine komplett neue Scripting-Sprache geschrieben, um dieses Problem zu beheben!

Elasticsearch läuft nun mit dem Java-Sicherheitsmanager. Wir haben die Berechtigungen für den Betrieb des Elasticsearch-Cores auf ein Minimum reduziert. Wir verschieben Funktionen aus dem Core in Module, um die Berechtigungseskalation und den Dateizugriff auf die kleinstmögliche Code-Menge zu beschränken. All das tun wir mit dem Ziel, Exploit-Möglichkeiten einzudämmen, die jedem Hacker offenstehen, der eine Zero-Day-Lücke findet.

Der Betrieb eines Webservers für eine optionale Funktion widerspricht diesem Ziel.

Außerdem fördert das Hosting von Web-Anwendungen auf Elasticsearch die schlechte Angewohnheit, Elasticsearch für Zugriff aus dem Internet zu öffnen, obwohl die Software in einem isolierten und sichereren Netzwerk laufen sollte.

Site-Plugins mit Elasticsearch 5.0 ausführen

Obwohl viele beliebte Site-Plugins wie Head, Kopf (demnächst durch Cerebro ersetzt) und HQ bereits Anweisungen für den Betrieb außerhalb von Elasticsearch enthalten, könnt ihr das auch einfach selbst erledigen. Ein Site-Plugin besteht aus statischem HTML, Javscript, CSS und Bilddateien, die vom Webserver eurer Wahl ausgeliefert werden – sogar (zur lokalen Nutzung) von Pythons SimpleHTTPServer:

cd my_plugin/
python -m SimpleHTTPServer 8000

Die Site-Plugins senden Anfragen direkt vom Browser eines Nutzers an Elasticsearch. Deshalb müsst ihr ein paar Konfigurationen vornehmen, um Elasticsearch anzuweisen, Cross-Origin Resource Sharing zuzulassen.

Ihr könntet zum Beispiel folgenden Code zur Konfigurationsdatei elasticsearch.yml hinzufügen:

http.cors.enabled: true
http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/

Die Einstellung allow-origin sollte eine Regular Expression sein, die der Adresse des Webservers entspricht, der das Site-Plugin hostet. Mehr über die CORS-Einstellungen erfahrt ihr in der Dokumentation unter HTTP-Modul.

Wenn euer Elasticsearch-Server die Sicherheitsfunktion in X-Pack (dem Ersatz für Shield in 5.0) verwendet, müsst ihr auch noch folgende Einstellungen hinzufügen:

http.cors.allow-credentials: true
http.cors.allow-headers: X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization

Mehr als Site-Plugins

Wenn du ein Plugin-Autor bist und die Einschränkungen beim Schreiben einer Anwendung mit statischen Web-Dateien umgehen willst, solltest du die Entwicklung eines Kibana-Plugins in Erwägung ziehen.

Kibana wird mit einem Node.js-Webserver ausgeliefert und die Plugins können serverseitige Funktionen enthalten. Du kannst zum Beispiel alle Anfragen an Elasticsearch direkt von Kibanas Backend-Server ausführen lassen, anstatt vom Browser des Nutzers.

Es gibt sogar einen Kibana Plugin-Generator, der dir bei den ersten Schritten mit deinem eigenen Plugin helfen kann, und ein Video von der Elastic{ON}16, in dem der Prozess beschrieben wird. Wie immer sind hilfsbereite Kibana-Entwickler auf IRC und im Forum unterwegs und stehen dir bei Fragen zur Seite.