Seite wählen

NETWAYS Blog

Securing Elasticsearch

This is the English version of my last week’s post.
It is nowadays a really hot topic: Data protection
And by this I do not mean the long-standing topic which is passionately discussed in especially German IT-News. No, I am referring to data which is stored in your Elasticsearch cluster. Although it is undoubtful that some privacy related data is stored in it just as well.
Most of you already utilize some kind of solution to regulate access to your Elasticsearch cluster. This goes from simple URL-filters over dedicated reverse proxies to full-blown solutions like „Shield“. But what they all have in common, is that they do not suit everyone’s needs. They are either too limited in the provided functionality or just too expensive for what is intended to achieve.
That is why a company of the German automotive industry wanted us to create an open-source solution which combines most if not all of the requirements in a single product. The result is a reverse proxy service built from scratch. It is able to authenticate clients, authorize them on the index-, type- and field-level as well as based on particular functionalities offered by the REST API of Elasticsearch. And it has also got a cool name: ElasticArmor
The initial release will only provide the basic functionality to cover standard requests made by Kibana. However, since the product is open-source and is developed with simple extension in mind we suspect that the remaining functionality will arrive sooner or later. Additionally, note that because of this service’s nature you will still need a security perimeter to protect the communication of the cluster itself as ElasticArmor will only regulate the communication between the client and Elasticsearch.
So how does ElasticArmor actually accomplish its work? Well, that is pretty straight forward. A request made by a client needs to get past ElasticArmor first. Whether it is a human being or a service like Kibana, a client is by definition the origin of a request. Thus it can carry authentication details or be completely anonymous and is only identified by the IP address where it is coming from.
Once ElasticArmor receives a request made by an authenticated client it will apply the roles assigned to him. These define what and how much a client is permitted to do. They are applied by inspecting the URL and payload of the request. Inspecting a URL is not that much difficult but issues arise if it is about the payload as it is way more complex. (e.g. Search-API) For this reason ElasticArmor knows very well what kind of functionality is offered by which API to the client. Will it encounter something it does not know about (e.g. a newly introduced query) the request is instantly rejected. This prevents vulnerabilities in case ElasticArmor is connected to a Elasticsearch cluster with which it is not compatible yet.
Modifications will only applied to a request unless the response will not fundamentally change. This means that e.g. queries, filters and aggregations are not modified. The URL however will potentially change if it is about indices, documents and fields. Source filtering will also be used to make sure that a client does not have access to more than he is permitted to.
However, some features of Elasticsearch are very difficult to handle. (e.g. Fuzzy Like This, Fuzzy Like This Field and More Like This) For this reason ElasticArmor will only ensure the permission to utilize them so you should think well whom to grant this permission.
ElasticArmor represents itself as Elasticsearch to the outside as it is the one a client will communicate with after all. A smooth integration in your already existing infrastructure should therefore be easily possible.
We are now at the end of this post. I hope I was able to awaken your interest. If you have any questions, do not hesitate to ask in the comments!

Johannes Meyer
Johannes Meyer
Lead Developer

Johannes ist seit 2011 bei uns und inzwischen, seit er 2014 die Ausbildung abgeschlossen hat, als Lead Developer für Icinga Web 2, Icinga DB Web sowie alle möglichen anderen Module und Bibliotheken im Web Bereich zuständig. Arbeitet er gerade mal nicht, macht er es sich bei schlechtem Wetter am liebsten zum zocken oder Filme/Serien schauen auf dem Sofa gemütlich. Passt das Wetter, geht's auch mal auf eines seiner Zweiräder. Motorisiert oder nicht.

Securing Elasticsearch

The English version of this post is available here.
Woah, was für ein Thema: Datenschutz
Und damit meine ich nicht das allseits bekannte Thema und die seit jeher leidenschaftlich verfochtenen persönlichen Daten. Nein, wovon ich rede sind die Daten, die in Elasticsearch landen. Wobei dort sicher auch bei dem einen oder anderen Personen bezogene Daten hinterlegt sind, keine Frage.
Viele setzen bereits diverse Lösungen ein, um den Zugriff auf Elasticsearch zu steuern. Das geht von einfachen URL-Filtern, über dedizierte Reverse Proxies mit Authentifizierung bis hin zu Elasticsearch’s hauseigener Rundum Lösung „Shield“. Doch was sie alle gemeinsam haben: Sie sind nicht für jeden geeignet, da sie entweder zu eingeschränkt hinsichtlich der Funktionalität oder schlicht zu teuer in der Anschaffung sind.
Deshalb kam eine namhafte Größe aus der Automobil-Branche auf uns zu, und schlug vor eine Opensource Lösung zu entwickeln, um all das in einem Produkt zu integrieren. Heraus kam ein von Grund auf neu geschriebener Reverse Proxy Dienst, welcher Authentifizierung und Autorisation auf Index-, Typ- und Feld-Ebene sowie auf Basis konkreter Funktionalitäten von Elasticsearch’s REST API vereint. Das ganze hat natürlich auch einen Namen: ElasticArmor
In der ersten Version werden zwar vorerst nur normale Anfragen die von Kibana stammen in vollem Umfang berücksichtigt, doch da das Projekt Opensource ist und mit der Absicht leicht zu erweitern zu sein geschrieben wurde, gehen wir davon aus nicht lange auf Erweiterungen warten zu müssen. Außerdem erfordert die Natur des Dienstes die zusätzliche Absicherung des angebundenen Elasticsearch-Cluster mittels eines Sicherheitsperimeters, da nur die Kommunikation zwischen Cient und Elasticsearch eingeschränkt wird, nicht jedoch die Kommunikation der einzelnen Elasticsearch-Nodes.
Doch wie funktioniert der ElasticArmor nun eigentlich? Nun, eigentlich ganz einfach. Ein Client der eine Anfrage an Elasticsearch stellt, muss zuerst am ElasticArmor vorbei. Ein Client ist, per Definition, der Ursprung der Anfrage. Dabei kann es sich um einen weiteren Dienst wie z.B. Kibana oder eine bestimmte Person handeln. Authentifizierung bedeutet allerdings nicht zwingend, dass es sich um eine reale Person mit Namen und Passwort handeln muss, es kann genauso gut ein anonymer Zugriff von einer ganz bestimmten IP sein.
Erhält der ElasticArmor nun letztendlich eine Anfrage von einem authentifizierten Client, werden die ihm zugeordneten Rollen angewendet. Diese definieren was und wie viel er darf. Angewendet werden sie, indem die URL der Anfrage und der Körper der selben analysiert werden. Im Falle der URL ist das nicht weiter schwer, doch der Körper einer Anfrage (z.B. Search-API) ist wesentlich komplexer. Aus diesem Grund ist dem ElasticArmor genau bekannt was für Möglichkeiten ein Client in einer solchen Anfrage hat. Trifft er auf etwas das ihm nicht bekannt ist, (z.B. ein neu eingeführtes Query) wird die Anfrage sofort abgelehnt. Dies verhindert Sicherheitslücken wenn die Version von Elasticsearch aktualisiert wird, ohne Rücksicht auf die Kompatibilität mit dem ElasticArmor zu nehmen.
Verändert wird eine Anfrage nur, wenn sich das Ergebnis nicht grundlegend ändert. Das bedeutet z.B. dass Queries, Filter, Aggregationen o.Ä. nicht verändert werden, die URL potentiell jedoch schon, jedenfalls was Indizes, Dokumente und Felder anbelangt. Auch das Source filtering wird verwendet um sicher zu stellen, dass jemand nur das sieht was er sehen darf.
Einige Features von Elasticsearch sind jedoch nur sehr schwer bis gar unmöglich einzuschränken, (z.B. Fuzzy Like This, Fuzzy Like This Field und More Like This) weshalb bei diesen nur das Recht sie zu benutzen sicher gestellt wird. Man sollte also aufpassen wem man dieses Recht gestattet.
Desweiteren verhält sich der ElasticArmor nach außen hin wie Elasticsearch. Schließlich ist er es mit dem sich ein Client tatsächlich unterhält. Somit sollte eine relativ problemlose Integration in die bereits bestehende Infrastruktur möglich sein.
Das war’s dann auch schon wieder. Ich hoffe ich konnte das Interesse, insbesondere die Vorfreude, bei dem einen oder anderen wecken. Bei Fragen, bitte einfach drauf los kommentieren!

Johannes Meyer
Johannes Meyer
Lead Developer

Johannes ist seit 2011 bei uns und inzwischen, seit er 2014 die Ausbildung abgeschlossen hat, als Lead Developer für Icinga Web 2, Icinga DB Web sowie alle möglichen anderen Module und Bibliotheken im Web Bereich zuständig. Arbeitet er gerade mal nicht, macht er es sich bei schlechtem Wetter am liebsten zum zocken oder Filme/Serien schauen auf dem Sofa gemütlich. Passt das Wetter, geht's auch mal auf eines seiner Zweiräder. Motorisiert oder nicht.

Bottle – Klein aber fein

Vor einiger Zeit war es notwendig für ein Kunden-Projekt dessen Umgebung bei uns nachzubilden. Es war von vornherein klar, dass es keine 1:1 Nachbildung sein muss (kann) und somit war es nur notwendig einige wenige Bestandteile einer REST Api zu simulieren. Da REST rein HTTP basiert ist und die zu simulierenden Aktionen nur GET waren, kam uns erst gar nicht in den Sinn ein großartiges PHP-Projekt ins Leben zu rufen und entschieden uns daher für eine schnelle Lösung mittels eines Standalone Python Skriptes.
Mir war Bottle schon seit einigen Jahren bekannt und deshalb noch als Werkzeug für schnelle und einfache Lösungen in Erinnerung. Tatsächlich eingesetzt hatte ich es allerdings noch nie, weshalb dies die Chance war es endlich einmal zu tun. Gesagt getan, runtergeladen und ausgeführt. Da Bottle allein auf der Standard-Library von Python basiert und mit Python 2.6+ wie auch Python 3.2+ kompatibel ist, funktionierte das sofort ohne Probleme. Und es hält was es verspricht!
Allein das erste Beispiel auf seiner Webseite zeigt bereits wie schnell ein Web-Server mit dynamischem Routing und Inhalten aufgesetzt wird:
[sourcecode language=“python“ wraplines=“false“ collapse=“false“]
from bottle import route, run, template
@route(‚/hello/<name>‘)
def index(name):
return template(‚<b>Hello {{name}}</b>!‘, name=name)
run(host=’localhost‘, port=8080)
[/sourcecode]
Ja sogar Basic Authentication beherrscht es:
[sourcecode language=“python“ wraplines=“false“ collapse=“false“]
from bottle import route, run, template, auth_basic
def authenticate(username, password):
return username == ‚max‘ and password == ‚mustermann‘
@route(‚/hello/<name>‘)
@auth_basic(authenticate)
def index(name):
return template(‚<b>Hello {{name}}</b>!‘, name=name)
run(host=’localhost‘, port=8080)
[/sourcecode]
Ist das nicht toll? Ich nehme stark an, dass da noch mehr geht, aber für den Moment bin ich vollauf zufrieden. 🙂

Johannes Meyer
Johannes Meyer
Lead Developer

Johannes ist seit 2011 bei uns und inzwischen, seit er 2014 die Ausbildung abgeschlossen hat, als Lead Developer für Icinga Web 2, Icinga DB Web sowie alle möglichen anderen Module und Bibliotheken im Web Bereich zuständig. Arbeitet er gerade mal nicht, macht er es sich bei schlechtem Wetter am liebsten zum zocken oder Filme/Serien schauen auf dem Sofa gemütlich. Passt das Wetter, geht's auch mal auf eines seiner Zweiräder. Motorisiert oder nicht.

DELL XPS13 – Ein zickiges Leichtgewicht mit großer Klappe

Nun war es endlich soweit. Nach Jahren als einer der wenigen die bei Meetings tatsächlich aufgepasst haben, erhielt Ich nun vor kurzem ein mobiles Arbeitsgerät. Das tolle dabei war, dass Ich mir selbst aussuchen durfte welches Modell, selbstverständlich in einem gewissen Rahmen. Einige Dinge waren von Anfang an klar: Es muss ein Ultrabook mit langer Akku-Laufzeit, Hellem Display mit naturgetreuen Farben, angenehmem Tipp-Verhalten und Tastatur-Beleuchtung sein.
Also zog Ich los und sah mich ein wenig um. Zur Wahl standen zwei Hersteller: Dell und Lenovo. Lenovo mit ihren ThinkPads war sofort der erste Anlaufpunkt. Nach einiger Lesarbeit landete Ich dann beim „ThinkPad X1 Carbon“. Was heraus stach war das IPS Panel (Sehr praktisch wenn man einmal nicht alleine am Gerät sitzt!) und ein nativer Ethernet Port. Nach noch mehr Lesarbeit im Netz war Ich jedoch vom Display, hinsichtlich der Helligkeit und Farbentreue, nicht mehr so beeindruckt. Dennoch schaffte es das X1 Carbon auf die Liste der Kandidaten.
Dann ging Ich zu Dell. Hier musste Ich nicht lange suchen, denn die XPS Modell-Reihe sticht im Ultrabook Segment geradezu heraus. Der Blickfang war selbstverständlich das „InfinityEdge“ Display („Cooool!“) und die daraus resultierende Größe des Gerätes. Ein 13″ Display in einem 11″ Gehäuse, wenn das nicht mal ein „Ultra“Book ist. Nach der gewohnten Lesarbeit war Ich noch mehr begeistert, denn das Display ist nicht nur groß, nein, es ist verdammt Hell, Kristallklar und diese Farben! Das einzige was Ich vermisste, war der native Ethernet Port. Doch ein 5Ghz Wifi und ein USB3.0 Port (mit dem richtigen Adapter) sorgte dafür, dass das XPS das X1 Carbon von der Kandidaten-Liste verdrängte.
Doch schon während meiner Recherchen im Netz fielen die ersten Fragen auf. Denn das XPS gibt es mit einem QHD+ und FHD Display. Aufgrund meiner geringen Erfahrung mit höher auflösenden Displays als FHD tendierte Ich eher zu eben jenem, denn im Netz war die Rede von Problemen bei der Skalierung in einzelnen Applikationen. Die Betriebssysteme selbst schnitten gut in den Erfahrungen anderer ab, ganz besonders Ubuntu 14.04+ und Windows 8+, doch einzelne Applikationen hätten angeblich mit starken Problemen wie zu kleinen Icons o.ä. zu kämpfen. Auch die Hardware des XPS machte bei diversen Besitzern Probleme, wie etwa das hypersensible Trackpad oder die zu Lags neigende Tastatur. (Ein einzelner Tastendruck führte zu wiederholten Eingabe des Zeichens.) Doch gerade letzere Probleme wurden bereits zu diesem Zeitpunkt durch UEFI-Upgrades seitens Dell behoben.
Also wollte Ich natürlich das XPS, mit dem FHD Display. Dummerweise wollte Ich es genau zu diesem Zeitpunkt, als Dell die Produktion einfror und somit die Version mit dem FHD Display nicht mehr anbot. Das was mir dann angeboten wurde, war das mit dem QHD+ Display, zusammen mit der Information, man wisse noch nicht wann die FHD Version wieder verfügbar sein wird. Langer Rede kurzer Sinn, nun sitze Ich vor einem Dell XPS13 mit QHD+ Display.
Das was Ich zuvor im Netz erfuhr, hat sich (mit gemischten Gefühlen) zu 100% bewahrheitet. Das Display ist wirklich großartig und die Hardware Probleme waren nicht existent. Doch mit der Auflösung habe auch Ich zu kämpfen. Windows 10 liefert einen angenehmes Ergebnis, Ubuntu 14.04 auch, solange man keinen externen Bildschirm anschließt der eine kleinere Auflösung hat. Denn dann skaliert Ubuntu zwar alle Symbol-Leisten und System-Icons korrekt, nicht jedoch die Schrift. Das bedeutet, ist ein externer Monitor angeschlossen, sehe Ich auf dem XPS QHD+ Display Schrift in der selben Größe wie auf dem externen FHD Monitor. Da hilft es mir herzlich wenig, wenn Ich zwar den Pfad in dem Ich mich gerade im Terminal aufhalte in der Titelleiste lesen kann, aber nicht das was sich in diesem Verzeichnis befindet. Nicht für QHD+ ausgelegte Applikationen machen allerdings in Windows und Ubuntu Probleme, da hilft nur eine Lupe griffbereit zu haben, oder auf Alternativen auszuweichen. (z.b. Firefox statt Chrome)
Alles in Allem, zufrieden bin Ich trotzdem. Man gewöhnt sich an alles und mit ein wenig Affinität zum „basteln“ lassen sich gewisse Dinge auch selbst lösen. Dennoch, würde Ich jedem der sich für das XPS (oder irgendein ähnliches Gerät mit mehr als FHD Auflösung) interessiert, von der QHD+ Version abraten. Das ist vermutlich dann „nur“ noch ein Leichtgewicht mit großer Klappe.

Johannes Meyer
Johannes Meyer
Lead Developer

Johannes ist seit 2011 bei uns und inzwischen, seit er 2014 die Ausbildung abgeschlossen hat, als Lead Developer für Icinga Web 2, Icinga DB Web sowie alle möglichen anderen Module und Bibliotheken im Web Bereich zuständig. Arbeitet er gerade mal nicht, macht er es sich bei schlechtem Wetter am liebsten zum zocken oder Filme/Serien schauen auf dem Sofa gemütlich. Passt das Wetter, geht's auch mal auf eines seiner Zweiräder. Motorisiert oder nicht.

Icinga Web 2 – Du kommst hier net rein

Inzwischen wisst ihr wie man ein neues Icinga Web 2 Modul anlegt und welche Möglichkeiten euch für die Navigation innerhalb eines Icinga Web 2 Moduls offen stehen. Heute möchte ich euch nun vorstellen wie es möglich ist, den Zugriff darauf zu kontrollieren.
Eine kleiner Hinweis vorweg: Da wir im folgenden keine neuen Elemente im UI einfügen werden, müsst ihr leider auf eine bebilderte Führung verzichten und euch mit hartem Code zufrieden geben. Dafür gibt es am Ende dieses Eintrags einen tarball mit dem daraus resultierenden aktuellem Stand des „Hello World“ Moduls.
mehr lesen…

Johannes Meyer
Johannes Meyer
Lead Developer

Johannes ist seit 2011 bei uns und inzwischen, seit er 2014 die Ausbildung abgeschlossen hat, als Lead Developer für Icinga Web 2, Icinga DB Web sowie alle möglichen anderen Module und Bibliotheken im Web Bereich zuständig. Arbeitet er gerade mal nicht, macht er es sich bei schlechtem Wetter am liebsten zum zocken oder Filme/Serien schauen auf dem Sofa gemütlich. Passt das Wetter, geht's auch mal auf eines seiner Zweiräder. Motorisiert oder nicht.