Die gemeinsame Arbeit an Dateien ist ein wichtiges Thema bei der Produktivität von Teams. Nur wenn alle Mitarbeiter zuverlässig auf die benötigten Informationen zugreifen können, funktioniert diese Kollaboration erfolgreich. Während klassische Anwendungen – oft rollenbasiert und dauerhaft zugeteilt – auf Berechtigungen setzen, ermöglicht das freie Sandstorm objektbasierte Ansätze mit individuellen Freigaben. In diesem Artikel zeigen wir, wie sich Dokumente zur Absicherung isolieren lassen und trotz allem produktiv zur Verfügung stehen.
Der Trend der letzten Jahre in der IT geht in Richtung Microservices. Seit der flächendeckenden Verfügbarkeit von Hardwarevirtualisierung laufen einzelne Dienste voneinander getrennt in unterschiedlichen virtuellen Maschinen. Das kostet vor allem Arbeitsspeicher für vollständig geladene Betriebssysteme, der Speicherplatz auf Festplatten war im Verhältnis dazu schon immer erschwinglich. Die Abstraktion für das Betriebssystem erfolgt mittels emulierter Hardware, die über paravirtualisierte Treiber den Zugriff auf die realen Ressourcen des Computers performant ermöglicht.
Sicherheitsrisiken moderner Zusammenarbeit
Modernere Plattformen mit Containertechnologie, wie etwa das von Google initiierte Kubernetes, optimieren den Ressourcenverbrauch insbesondere im Hin- blick auf den Arbeitsspeicherverbrauch beim Einsatz von Microservices noch weiter. Dank sogenannter Namespaces im Linux-Kernel ist es heute nicht mehr nötig, ein Betriebssystem bereitzustellen, um eine Software von anderen laufenden Programmen oder bestimmten Dateien im Dateisystem zu isolieren. Es kommt allein auf die unmittelbare Laufzeitumgebung eines Programms an, also die Systembibliotheken in Form von dynamischen Bibliotheken (die sogenannten Shared Libraries). Die Aufrufe der Kernelfunktionen der Programme und Bibliotheken können dabei ja auch von einem einzigen Kernel bearbeitet werden.
Die beschriebene Architektur führt dazu, dass einzelne Anwendungen, beispielsweise Software zur kooperativen Bearbeitung von Dokumenten oder Kalendersysteme, in jeweils eigenen Containern ohne direkten Zugriff auf die Ressourcen anderer Prozesse laufen. Auch eine im Backend angebundene Datenbank arbeitet dabei in einer eigenen Umgebung, die Kommunikation erfolgt dann über ein im Kernel virtualisiertes privates Netzwerk. Die üblichen Werkzeuge sind für die Kommunikation über ein Netzwerk entwickelt.
Der Trend der letzten Jahre in der IT geht in Richtung Microservices. Seit der flächendeckenden Verfügbarkeit von Hardwarevirtualisierung laufen einzelne Dienste voneinander getrennt in unterschiedlichen virtuellen Maschinen. Das kostet vor allem Arbeitsspeicher für vollständig geladene Betriebssysteme, der Speicherplatz auf Festplatten war im Verhältnis dazu schon immer erschwinglich. Die Abstraktion für das Betriebssystem erfolgt mittels emulierter Hardware, die über paravirtualisierte Treiber den Zugriff auf die realen Ressourcen des Computers performant ermöglicht.
Sicherheitsrisiken moderner Zusammenarbeit
Modernere Plattformen mit Containertechnologie, wie etwa das von Google initiierte Kubernetes, optimieren den Ressourcenverbrauch insbesondere im Hin- blick auf den Arbeitsspeicherverbrauch beim Einsatz von Microservices noch weiter. Dank sogenannter Namespaces im Linux-Kernel ist es heute nicht mehr nötig, ein Betriebssystem bereitzustellen, um eine Software von anderen laufenden Programmen oder bestimmten Dateien im Dateisystem zu isolieren. Es kommt allein auf die unmittelbare Laufzeitumgebung eines Programms an, also die Systembibliotheken in Form von dynamischen Bibliotheken (die sogenannten Shared Libraries). Die Aufrufe der Kernelfunktionen der Programme und Bibliotheken können dabei ja auch von einem einzigen Kernel bearbeitet werden.
Die beschriebene Architektur führt dazu, dass einzelne Anwendungen, beispielsweise Software zur kooperativen Bearbeitung von Dokumenten oder Kalendersysteme, in jeweils eigenen Containern ohne direkten Zugriff auf die Ressourcen anderer Prozesse laufen. Auch eine im Backend angebundene Datenbank arbeitet dabei in einer eigenen Umgebung, die Kommunikation erfolgt dann über ein im Kernel virtualisiertes privates Netzwerk. Die üblichen Werkzeuge sind für die Kommunikation über ein Netzwerk entwickelt.
Vor allem mit Blick auf IT-Sicherheitsaspekte kann dieser Aufbau dennoch ungeeignet sein, so elegant er auch zunächst einmal klingen mag. Angenommen ein externer Benutzer erhält Zugriff auf den Datei-Sharing-Dienst eines Unternehmens, weil er mit einem der internen Mitarbeiter Daten austauschen muss. Das bedeutet dann, dass ein möglicher Angreifer, der Zugang zu diesem Benutzerkonto erhält, bereits einen authentifizierten Systembenutzer kontrolliert. Um nun auf weitere Dokumente zugreifen zu können, benötigt der Angreifer nur noch eine Schwachstelle, die eine Privilege Escalation zum Ausweiten der eigenen Rechte ermöglicht.
Die Entwickler von Sandstorm [1] gehen noch einen Schritt weiter: Statt die einzelnen Dienste in individuellen Containern zu isolieren, isoliert die Software die Daten selbst mit den zugehörigen Anwendungen. Das bedeutet, dass etwa jedes Dokument, das ein Nutzer in Etherpad erstellt, auch eine eigene Etherpad-Instanz erhält und bestenfalls auch das einzige Dokument in diesem Etherpad bleibt.
Die Zugriffsverwaltung auf dieses Etherpad übernimmt von nun an die Sandstorm-Plattform selbst und kann hierbei zwischen Lese-, Kommentier- sowie Schreib- und Leserechten unterscheiden. Konzeptuell unterscheidet Sandstorm also grundsätzlich verfügbare Apps von den damit erstellten Dokumenten, den sogenannten Grains (zu Deutsch Körner), um im wörtlichen Sinne die Zugriffe "fine-grained" zu kontrollieren.
Sandstorm installieren
Die Hardwareanforderungen für die Installation von Sandstorm sind auf dem Papier zunächst gering. Die Entwickler fordern ein aktuelles 64-Bit-Linux mit mindestens 1 GByte Arbeitsspeicher. Die benötigte Festplattengröße wird nicht angegeben, Sandstorm selbst belegt gut 2,8 GByte. Für unseren Workshop ist eine Maschine mit 2 GByte Arbeitsspeicher und 20 GByte Festspeicher vollkommen ausreichend.
Die Installation gestaltet sich dabei je nach gewählter Methode von sehr einfach bis eher aufwändig. Sie können nach Belieben zwischen der Installation mittels angebotenem Skript und der Möglichkeit, Sand-storm selbst zu kompilieren, wählen. Für diesen Workshop verwenden wir die einfachste Möglichkeit und starten die Installation direkt aus der Konsole eines Ubuntu-Servers mit dem angebotenen Skript wie folgt:
curl https://install.sandstorm.io | bash
Während des Vorgangs müssen Sie Fragen zu Ihrer Installation beantworten. Um Sandstorm einfach erst einmal zu testen, wählen Sie bei der ersten Frage eine "typische Installation" aus, indem Sie einfach mit Enter bestätigen. Nach einem kurzen Blick auf die durchgeführten Installationsschritte bestätigen Sie auch die nächste Abfrage mit Enter. Wenn Sie bereits einen HTTP-Server auf Port 80 oder 443 oder einen E-Mail-Server auf Port 25 betreiben, schlägt das Skript Ihnen alternative Ports vor, die Sie an die vorliegenden Bedingungen anpassen.
Die Sandstorm-Entwickler haben auch an den Schutz Ihrer eigenen Instanz mittels TLS gedacht. Für die Absicherung mit einem Zertifikat von Let’s Encrypt gibt es kostenfreie Subdomains für die Domain "sandcats.io". Wählen Sie einen kreativen Namen (einige naheliegende Subdomains sind bereits vergeben) und registrieren Sie sich mit einer E-Mail-Adresse. Diese müssen Sie zwar nicht bestätigen, für eine spätere Wiederherstellung der ausgewählten Subdomain sollten Sie aber eine existierende Adresse verwenden.
Nach dem Download und der Installation von Sandstorm müssen Sie erneut eine E-Mail-Adresse in der Konsole eingeben. Diesmal für die Registrierung bei Let’s Encrypt. Sie können hier eine andere Adresse als im vorigen Schritt verwenden. Nach einer kurzen Wartezeit für die Installation des TLS-Zertifikats erhalten Sie einen Link auf der Konsole und die Installation ist erfolgreich beendet. Mit dem Link melden Sie sich als Administrator an der soeben erstellten Instanz an. Öffnen Sie diese also in Ihrem Browser.
Bild 1: Es gilt, die für die Organisation passenden Login-Optionen auszuwählen.
Konfiguration
Die Konfiguration Ihrer eigenen Instanz starten Sie nun im Webbrowser mit einem Klick auf die entsprechende Schaltfläche. Im ersten Schritt müssen Sie mindestens eine Authentifizierungsmethode auswählen, die Sie Ihren Benutzern anbieten möchten. Die einfachste Möglichkeit ist die passwortlose Authentifikation per E-Mail. Dafür müssen Sie ein existierendes E-Mail-Konto eintragen und Sandstorm versendet dann bei jedem Login einen entsprechenden Link per E-Mail. Wenn Sie In Ihrem Unternehmen einen LDAP-Server einsetzen, können Sie die entsprechenden Parameter hinterlegen. Alternativ wählen Sie mit Google oder Github einen vorkonfigurierten Oauth-Provider oder konfigurieren mit OpenID-Connect respektive SAML eigene Dienste. Selbstverständlich können Sie auch mehrere Backends gleichzeitig aktivieren.
Im zweiten Schritt zur Konfiguration der Einstellungen Ihrer Organisation definieren Sie etwa für die E-Mail-Authentifikation eine Domain, an der Sie die Zugehörigkeit zu Ihrem Unternehmen prüfen möchten. Sie können auch die Möglichkeit einschränken, Dokumente mit externen Gästen zu teilen. Es wäre dann für den Zugriff auf Dokumente immer ein Login zu Ihrer Organisation notwendig. Die bereits ausgewählte Option, alle Benutzer einer Organisation im Adressbuch zu hinterlegen, erleichtert das Teilen Ihrer Benutzer untereinander, legt aber auch die Liste der aktiven Benutzer für alle offen.
Nach dem Klick auf "Save and continue" gelangen Sie zum E-Mail-Setup. Sand-storm versendet aus unterschiedlichen Gründen E-Mails an die Benutzer, also nicht nur zum Login via E-Mail. Dafür ist ein Konto auf dem Mailserver erforderlich, das den Versand mit unterschiedlichen Adressen einer Domain erlaubt. Sandstorm kommuniziert mitunter über verschiedenen Absenderadressen, so erhält etwa jede App eine eigene Adresse für E-Mails. Daher gestaltet sich die Nutzung von Freemail-Anbietern hier schwierig.
Haben Sie einen gültigen E-Mail-Account hinterlegt, werden im nächsten Schritt die von den Entwicklern ausgewählten Apps vorinstalliert. Da dies im Hintergrund bereits passiert ist, können Sie hier vermutlich direkt auf "Next" klicken. Die Liste der für Benutzer vorinstallierten Apps passen Sie später in der Administration an. Zum Abschluss der Konfiguration statten Sie noch ein Konto mit Administratorrechten aus. Geben Sie dafür im entsprechenden Formular die E-Mail-Adresse ein und klicken Sie auf "Send login email". Anschließend beenden Sie mit "Next" die Konfiguration.
Bild 2: Im zweiten Schritt der Installation aktivieren Sie die Authentifikation über die E-Mail-Domain.
Apps installieren
Sobald Sie sich mit Ihrem Benutzer an der Sandstorm-Instanz angemeldet haben, sehen Sie auf der linken Seite ein sehr überschaubares Menü zur Auswahl Ihrer Optionen. Nach dem Login befinden Sie sich bereits in der Apps-Ansicht. Hier können Sie direkt starten oder auf das große Symbol mit dem "+" klicken. Dann öffnet sich der App Market und Sie können in Ruhe durch die verfügbaren Apps stöbern.
Als Beispiele für diesen Artikel wählen wir die Kollaborationswerkzeuge GitWeb und EtherCalc. GitWeb erlaubt die Zusammenarbeit über Git und die gemeinsame Pflege darin enthaltener Webseiten. Bei EtherCalc handelt es sich um ein Tool zur gemeinsamen Bearbeitung von Tabellenkalkulationen. Nach der Auswahl einer App im Market wird diese zunächst auf den Server heruntergeladen. Anschließend klicken Sie im Sandstorm-Dialog noch ein weiteres Mal auf "Installieren", um diese ihrem Benutzerkonto hinzuzufügen.
Sandtstorm am Beispiel GitWeb
Nach der Installation von GitWeb erstellen Sie im unteren Bereich der Anzeige ein neues GitWeb-Repository. In der Grain-Ansicht, die sich nun öffnet, sehen Sie im Textfeld die Kommandos, um das Git komfortabel in der Kommandozeile zu klonen. Führen Sie diese in der Konsole aus und wechseln in das neu erstellte Verzeichnis.
Neben den klassischen Git-Funktionen bietet GitWeb einen eigenen Webserver. Dessen Inhalte können Sie innerhalb des Branches "gw-pages" erstellen. Führen Sie die folgenden Kommandos aus, um diesen Branch zu erstellen und erste Inhalte für Ihre Webseite hinzuzufügen:
git checkout -b gw-pages
$ echo "<h1>Guten Tag</h1>" > index.html
$ git add index.html
$ git commit -m "first commit"
$ git push origin gw-pages
Schon in der Meldung des Servers beim Push erhalten Sie die URL, an der Ihre neue Webseite nun aufzufinden ist. Die Webseiten werden also automatisch mit jedem Push in diesen Branch auf dem Webserver deployed.
Kehren Sie nun zurück in das Sandstorm-Webinterface, um das soeben angelegte Repository mit Ihren Kollegen zu teilen. Wählen Sie im oberen Bereich der Webseite "Share access". Sie können hier zwischen zwei Optionen wählen: Benutzer anhand der E-Mail-Adresse einladen oder einen Link erzeugen, den Sie selbst teilen können. In beiden Fällen müssen Sie die gewünschten Zugriffsberechtigungen wählen, entweder nur Lesen ("CAN READ") oder Lesen und Schreiben ("CAN READ AND WRITE").
Unabhängig davon, ob Sie eine E-Mail vom System senden lassen oder den erzeugten Link selbst verschicken, gibt es einen Freigabelink zum Grain. Dieser Link ist gültig, bis der Grain oder die Freigabe selbst gelöscht wird. Eine Übersicht über alle Freigaben eines Grains finden Sie im Dialog "Share access" unten rechts hinter dem Link "See who has access".
Besucht die eingeladene Person nun den angegebenen Link, erhält sie Zugriff auf dieses eine Grain. Ohne aktiven Login, also in der anonymen Bearbeitung, fehlt das Menü auf der linken Seite. Die Ansicht von GitWeb selbst und die Beschreibung zum Klonen des Repositories gleichen denen, die auch der Besitzer des Grains sieht, die verwendeten Credentials für das Repository unterscheiden sich aber.
Beispiel EtherCalc
Klicken Sie in der Anzeige der EtherCalc-App den Link "Create new spread- sheet" an, öffnet sich die Tabellenkalkulation mit dem neuen Dokument. Der Sandstorm-Rahmen um das Dokument ändert sich dabei nicht. Unter dem Menü auf der linken Seite ist neben dem GitWeb-Grain nun zusätzlich die Tabellenkalkulation für den direkten Zugriff mit aufgelistet.
Damit Sie bei mehreren geöffneten Grains die Übersicht nicht verlieren, können Sie den Namen der Grains ändern. Klicken Sie dafür im oberen Bereich auf "Untitled EtherCalc spreadsheet". Wenn Sie das Dokument nach der Namensänderung über "Share access" teilen, zeigt sich dieses den anderen Benutzern auch unter dem neuen Namen. Namensänderungen durch andere anonym bearbeitende Benutzer akzeptiert die Sandstorm-Oberfläche zwar, speichert oder synchronisiert diese jedoch nicht. Ändert ein angemeldeter Benutzer den Namen eines Grains, wird dieser Name zwar lokal gespeichert, aber nicht synchronisiert. Vielmehr wird der Name, den der Besitzer verwendet, zusätzlich dargestellt.
Möchten Sie einen zuvor geteilten Link beziehungsweise den damit verbundenen Zugang zu Ihrem Grain widerrufen, löschen Sie beides selektiv in der Übersicht der Freigaben wieder. Leider zeigt Sand-storm nicht den Link selbst an, sondern nur das von Ihnen angegebene Label. Sie sind also beim Löschen der Links auf Ihre eigenen Beschreibungen angewiesen. Es empfiehlt sich daher, schon beim Erstellen ein sinnvolles Label anzugeben. Nach dem Löschen stehen die Grains unter dem Link nicht mehr zur Verfügung, zeitgleich geöffnete Sitzungen werden unmittelbar gelöscht und dem Benutzer eine entsprechende Information angezeigt.
Workaround, um Gruppen zu erstellen
Die Möglichkeit, Personen in Gruppen einzuteilen, sieht Sandstorm nicht vor, mal abgesehen von den Mitgliedern der Organisation, die über die Domain der E-Mail-Adresse identifiziert werden. Grains lassen sich aber mit der App "Collections" in Gruppen organisieren. Damit fassen Sie unterschiedliche Dokumente in einer Gruppe zusammen und teilen diese dann mit nur einem Link. Für jedes Dokument in dieser "Collection" können Sie individuelle Berechtigungen setzen. Diese Gruppen sind praktisch, wenn Sie mit mehreren Bearbeitern auch mehrere Dokumente teilen möchten.
Auch nach dem Teilen lassen sich einer Gruppe weitere Grains hinzufügen, sodass Sie für Teams eigentlich nur noch eine Collection benötigen, die dann alle Dokumente enthält. Tatsächlich können Sie einer Collection auch weitere Collections hinzufügen, das geht auch rekursiv. Allerdings sollten Sie es bei der Rekursion nicht zu wild treiben, vor allem mit unterschiedlichen Berechtigungen, in unseren Tests erzeugte dies immer wieder Sitzungsfehler.
Nützliche Managementtools
Neben den bereits gezeigten Funktionen bietet Sandstorm nützliche Features für die Verwaltung von Grains. Diese können Sie über das Menü am oberen Rand der Seite erreichen. Die Funktion des "Mülleimers" bedarf keiner weiteren Erklärung. Das Dokument und alle damit verbundenen Freigaben und Ressourcen werden gelöscht. Das Symbol zur Anzeige des Debug-Logs führt Experten und Entwickler bei Problemen zu Lognachrichten, die bei der Fehlersuche unterstützen. Als normaler Benutzer finden Sie hier jedoch nicht viele Informationen für die Arbeit mit den Grains. Ebenso das Symbol zum Neustarten der App, auch dieses sollte im normalen Gebrauch keine Verwendung finden.
Die Möglichkeiten zum Backup eines Grains sind hingegen sehr praktisch. Über die Schaltfläche können Sie eine ZIP-Datei herunterladen, die Sie jederzeit zur Wiederherstellung nutzen können. Dies gelingt dann, indem Sie unter "Grains" oben rechts auf die Schaltfläche "Restore backup" klicken. Existiert das ursprüngliche Grain noch für Ihren Benutzer, erstellt Sandstorm eine neue Instanz mit dem Zustand zum Zeitpunkt des Backups. Leider sind die Freigaben nicht Teil des Backups, so dass Sie diese nach einem Restore manuell wieder anlegen müssen.
Wenn Sie verschiedene Dinge innerhalb eines Grains ausprobieren möchten oder unterschiedliche Versionen benötigen, eignet sich die Funktion zum Klonen. Ähnlich wie beim Restore eines Backups dupliziert Sandstorm das Grain im aktuellen Zustand. Dabei werden Freigaben, wie bei einem Backup, nicht mit auf das geklonte Objekt übertragen. Diese müssten Sie also bei Bedarf erneut erstellen.
Fazit
Die Liste der Apps, die Sie in Sandstorm verwenden können, ist bereits beachtlich und wächst kontinuierlich. Das Aufsetzen der Software ist eine Fingerübung für Administratoren und ohne große Schwierigkeiten möglich. Obwohl die Anwendung neben den Grains auch die Apps beim Zugriff darauf mehrfach startet, ist der Ressourcenverbrauch im Vergleich zu anderen Container-Umgebungen eher gering. Damit eignet sich Sandstorm auch für den Betrieb auf kleinen oder älteren Maschinen. Die Verwaltung von Benutzern und Grains ist zurzeit leider nur rudimentär implementiert. Eine Zuordnung zum Unternehmen findet allein über die genutzte E-Mail-Domäne statt, die Erstellung von Gruppen ist nur über den Umweg über die Collection-App möglich. Insgesamt bietet Sandstorm aber ein durchdachtes und überraschend gut funktionierendes Konzept zur Isolation von Dokumenten in einer anonym teilbaren und kooperativ nutzbaren Umgebung.