Nehmen wir an, man hätte eine Bildersammlung mit unklaren Urheberrechten, oder – wie in meinem Fall – eine Sammlung von Dokumenten über eine Hausgemeinschaft. Solche Dateien darf man nicht öffentlich publizieren. Dennoch soll sie einem Kreis von Berechtigten zugänglich gemacht werden.

Eine passwortgeschützte WordPress-Seite wäre schon eine Möglichkeit, das zu bewerkstelligen, doch wenn es viele Dateien sind, die man publizieren möchte, Dateien, sie sich laufend verändern, dann ist eine WordPress-Seite auch keine gute Lösung, weil man mit jeder Änderung des Datenbestandes auch die WordPress-Seite anpassen müsste. Außerdem gibt es zu Dateien, die man in WordPress uploadet, immer auch einen Link, über den man die Datei sehen kann, auch wenn man die eigentliche WordPress-Seite gar nicht geöffnet hat.

Ich habe daher nach einer einfachen Lösung gesucht, die es erlaubt, geschützten Content in einem Webverzeichnis auf einer WordPress-Seite zu zeigen. Änderungen am geschützten Content sollen automatisch auch in der WordPress-Seite sichtbar sein. Nur Benutzer, die in WordPress angemeldet sind, sollen diesen Inhalt sehen dürfen.

Da es das Wesen  von geschütztem Content ist, nicht gesehen zu werden, musste eine Ausnahme eingebaut werden, die ein bestimmtes Verzeichnis allen sichtbar macht: http://iam.at/hide/?d=test

Hier sieht man, wie ein berechtigter Benutzer die geschützten Dateien zu sehen bekommt:

Klickt man auf eine der Dateien, sieht man ihren Inhalt, im Beispiel die ersten Takte des “Radetzkymarsch”.

Dokumentation

Das Programm dokumentiert sich selbst, wenn man es ohne weitere Parameter aufruft: http://iam.at/hide/

Man kann die jeweils aktuelle Version des Programms mit Unterstützung durch Syntax-Highlighting anschauen. Leider war es nicht möglich, diese Einbettung in der vorliegenden Seite zu zeigen. Der Grund ist etwas kompliziert und hängt damit zusammen, dass diese Seite von Clubcomputer mit https betrieben wird und daher keine Einbettungen von http-Seiten erlaubt.

In der Folge wird beschrieben, wie es zu diesem Programm gekommen ist:

Dateien öffentlich teilen über eine Cloud

Wenn man Daten teilen möchte, scheinen Clouds die einfachste Lösung zu sein. Hier kann man zum Beispiel die publizierten Inhalte von ClubComputer hier nachlesen:

https://1drv.ms/f/s!AikZwmy7gTLqo4VWx3evKFOQ0PS4sA

Alle Dateien sind öffentlich. Jeder, der diesen Link hat, kann die Dateien sehen.

Dateien privat teilen über eine Cloud

Man kann den obigen Link an Freunde weitergeben (ohne ihn – so wie oben – zu publizieren) und andere sehen diese Seiten nicht, weil sie den Link nicht kennen. Der lange Kode wirkt wie ein Passwort. Allerdings könnten die Freunde den Link ihrerseits weitergeben und vorbei ist es mit der Privatheit. Einen gewissen Schutz bieten ein zusätzliches Kennwort oder ein Ablaufdatum.

Man kann auch anderen Usern derselben Cloud Zugriffsrechte geben. Das beseitigt das Problem der unerwünschten Weitergabe, enthält aber das Problem, dass nicht alle betroffenen Personen auch Benutzer des Cloud-Systems sind und es auch nicht werden wollen und daher erreicht man einfach nicht alle, die einen Zugriff brauchen würden.

Man benötigt also eine Möglichkeit, selbst solche Rechte vergeben zu können, um alle gewünschten Personen einzubeziehen.

Rechtevergabe über WordPress

Jeder Betreiber einer WordPress-Seite kann Benutzer anlegen und mit zusätzlichen Plugins Rechte vergeben. Eine WordPress-Seite kann für die Registrierung neuer Benutzer offen oder geschlossen sein. Ist die Registrierung abgeschaltet, kann nur der Administrator neue Benutzer anlegen. Damit kann man Seiten anlegen, die nur für eingeloggte Besucher sichtbar sind. Der Beitrag “Private WordPress-Seite” zeigt eine solche Konfiguration mit den dazu erforderlichen Plugins.

Web vor Fremdzugriff schützen

Ein Webverzeichnis ist ein solches, das von einem Webserver angezeigt wird. Jede darin befindliche Datei wird normalerweise angezeigt, wenn man den Namen des Verzeichnisses und der Datei kennt. Insofern verhalten sich Webverzeichnisse gleich wie ein Cloud-Verzeichnis. Kennt jemand den Link dazu, dann hat er auch die Datei. Damit also ein Inhalt nicht über einen Link angesprochen werden kann, darf er nicht in einem Webverzeichnis liegen, sondern muss anderswo gespeichert sein.

Bei Clubcomputer werden bei jedem Webspace (http://meinweb) drei Verzeichnisse angelegt, die man im WebSitePanel https://panel.ccc.at verwalten kann:

meinweb
  data
  logs
  wwwroot

Das angezeigte Webverzeichnis ist wwwroot, alles in diesem Verzeichnis ist im Internet sichtbar, wenn man die Adresse kennt. Dagegen sind die Verzeichnisse data und logs vor fremden Blicken geschützt, die sieht ein Internetuser nicht.

Unser zu verbergendes Verzeichnis muss also außerhalb von wwwroot liegen, wir werden ihm den Namen hidden geben. Wie aber können dann die Dateien angezeigt werden? Man braucht dazu ein Programm und dieses Programm kann man so absichern, dass es nur Zugriffe von zugelassenen Usern ermöglicht. Dieses Programm nennen wir default.aspx.

Im Verzeichnis hidden befinden sich zwei weitere Verzeichnisse hidden-access und hidden-projects. In hidden-access liegt das Programm und in hidden-projects liegen die zu schützenden Dateien.

Damit hidden-access über das Internet angesprochen werden kann, wird ihm das virtuelle Verzeichnis hide zugeordnet. Der User Network-Access bekommt auf dem Verzeichnis hidden-projects Schreibzugriff.

Der Name default.aspx wurde gewählt, damit man erkennt, dass es sich um eine typische Startdatei eines Webservers handelt. Der Aufruf funktioniert also sowohl mit (http://meinweb/hide/default.aspx) als auch ohne diesen Namen (http://meinweb/hide/), sofern default.aspx im virtuellen Verzeichnis als Startdatei definiert wurde.

Das virtuelle Verzeichnis hide ist ein virtuelles Verzeichnis ein Aliasname auf hidden-access und dieses Verzeichnis kann über das Web erreicht werden, nicht aber das zu hidden-access gleichrangige Verzeichnis hidden-projects, das die zu schützenden Verzeichnisse hidden-project-1... enthält.

meinweb                  Webordner von ClubComputer
  data
  logs
  wwwroot                Alles in wwwroot wird publiziert
    wp                   WordPress-Installation
  hidden
    hidden-access        alias hide
      default.aspx
      web.config
    hidden-projects      Projekte, die vor Einsicht zu schützen sind
      hidden-project-1
      hidden-project-2
      ...

Die zu verbergenden Dateien hidden-project-1... befinden sich im Verzeichnis hidden-projects. Die grüne Markierung zeigt die Dateien, die aus dem Internet sichtbar sind.

Zugriff nur durch zugelassene Personen

Eine WordPress-Installation zeigt bestimmte Seiten nur eingeloggten Benutzern. Auf diesen Seiten befindet sich ein iframe, das auf ein Programm http://meinweb/hide/ verlinkt, das die Dateien in nicht öffentlichen Verzeichnissen zeigt. Aber diese Dateinamen werden nur dann gezeigt, wenn der Aufruf von der passwortgeschützten WordPress-Seite erfolgt. Das iframe zeigt eine Liste von Dateien aus einem ansonsten unzugänglichen Verzeichnis.

Würde jemand über einen Browser die Adresse http://meinweb/hide/ aufrufen, sieht er gar nichts (derzeit sieht er einen Hilfetext), weil im das Programm in der Datei default.aspx den Zugriff dau verwehrt. Aber wie geht das?

Referrer

Wenn eine Seite in einem Browser aufgerufen wird, dann benennt die Server-Variable HTTP-Referrer jene andere Internetseite, von der die Seite angesprochen wurde, die also den Link zur aktuellen Seite enthält.

Der Referrer ist leer, wenn die Seite direkt über die Browser-Adresse erfolgt ist.

Damit kann nun ganz einfach die Sichtbarkeit gesteuert werden. Ist der Referrer leer, dann versucht ein Benutzer die für ihn nicht bestimmte Seite direkt aufzurufen. Daher bricht das Programm die Abfrage ab, denn es ist nicht erwünscht, dass die Inhalte durch einen Browseraufruf gesehen werden können.

Enthält der Referrer irgendeine andere Adresse, dann untersucht man die und unterscheidet zwischen den eigenen Seiten und fremden Seiten. Bei Zugriff von eigenen Seite erledigt das Programm den Aufruf, bei Zugriff von fremden Seiten wird die Abfrage abgebrochen. Um nicht jedes dieser Skripte neu formulieren zu müssen, legt man eine Liste akzeptierter Zugriffsseiten an, zum Beispiel Zugriffsseiten der Domänen im eigenen Besitz.

Wie kommt man zu dem Inhalt der Dateien?

Man hat nun über die passwortgeschützte WordPress-Seite Zugang zu einem geschützten Verzeichnis und kennt die dortigen Dateien. Aber wie kann man den Inhalt dieser Dateien am Browser anzeigen? Einen Link dazu gibt es ja definitionsgemäß nicht. Man braucht ein zweites Programm, das in der Lage ist, den Inhalt zum Browser zu senden, so, wie es ein Webserver tun würde. Dieses Programm ist ebenfalls in default.aspx enthalten und ist im Grunde ein extrem einfacher Webserver, der in der Lage ist den Inhalt einiger Dateitypen zu verarbeiten. Die dritte Datei web.config enthält Konfigurationsinformationen.

Warum nun diese beiden Funktionen

    • Anzeige eines Verzeichnisses
    • Anzeige einer Datei

In ein und demselben Programm default.aspx versteckt sind, hat den Grund, dass es einen gemeinsamen Kopfteil gibt, den man bei Aufteilung des Programms in beiden Teilprogrammen einbauen müsste. Dieser gemeinsame Eingangsteil untersucht nämlich die Berechtigung des Aufrufs und der ist bei beiden Funktionen gleich.

Wie kann nun das Programm default.aspx zwischen den beiden Aufrufarten unterscheiden? Das erfolgt über Kommandozeilenparameter. Für die Anzeige des Inhaltsverzeichnisses benötigt das Programm den Namen des Inhaltsverzeichnisses und dafür wird der Parameter d= (Directory) verwendet. Gibt es nur diesen Parameter, dann wird dieses Inhaltsverzeichnis gezeigt. Soll das Programm dagegen eine Datei zeigen, muss die Kommandozeile zusätzlich den Dateinamen enthalten, der über den Parameter f= (File) übergeben wird.

Konfiguration

Alles, was man konfigurieren kann, befindet sich in der Datei web.config im Abschnitt appSettings.

DirectoryHiddenAccess Name des Programmordners hidden-access
DirectoryHiddenProjects Name des Projektordners hidden-projects
MimeExtensions Liste der erlaubten Dateierweiterungen .jpg,.jpeg,.gif,.png,.bmp,.tif,.tiff,.txt,.pdf,.zip,.mp3,.mp4
MimeTypes Liste der zu den Dateierweiterungen gehörenden Mime-Types image/jpeg,image/jpeg,image/gif,image/png,image/bmp,image/tiff,image/tiff,text/plain,application/pdf,application/x-zip-compressed,audio/mp3,video/mp4
Filter Diese Dateien werden angezeigt *.gif,*.jpg,*.png,*.pdf
AllowedDomains Von diesen Domänen wird der Zugriff erlaubt iam.at,fiala.cc,klubderfreunde.at,ewkil.at
Target In welchem Fenster öffnet die Datei? _self oder _blank _self _parent _top FrameName

Angriff

Wie sicher ist nun dieses Konzept? Es dürfte für Programmierer nicht schwierig sein, sich dennoch Zutritt zu den geschützten Dateien zu verschaffen. Er muss dazu nur bei einem Aufruf der Seite default.aspx den Referrer programmatisch so einstellen, dass es so ausschaut, als würde er von einer erlaubten Seite kommen. Es muss dazu aber wissen, wie der Name des geschützten Projekts lautet. Diesen Namen müsste er auf der für ihn unsichtbaren WordPress-Seite ausspionieren. Der Angreifer muss also programmieren können und muss auch konkrete Kenntnisse über ein solches Projekt haben.

Diese Situation erinnert ein bisschen an Frau Kaiser aus dem Kaisermühlen-Blues, die der Polizei gemeldet hat, dass sie sich von Nachbarn belästigt fühlt. Als sie es dann vorführen sollte, hat sich herausgestellt, dass sie dazu ein Fernrohr braucht und dieses auf einem Sessel am Tisch aufstellen muss, um die “Belästigung” zu erleben.

Aber egal! Um es einem Angreifer noch etwas schwerer zu machen, ist im Aufruf ein Schlüssel erforderlich, der nur in der geschützten WordPress-Seite angegeben ist und den auch die Dokumentation nicht nennt. Wenn also jemand den Referrer vortäuscht, kommt er dennoch nicht an die Daten, weil das Programm zusätzlich ein nicht dokumentiertes Passwort erfordert.

Eigene Implementierung

Um Dateien auf der eigenen WordPress-Seite geschützt zu veröffentlichen, muss man

  • Panel: Dateistruktur hidden erstellen
  • Panel: Ordner hidden-access als virtuellen Ordner mit dem Namen hide definieren
  • Panel: virtuellen Ordner hide die Startdatei default.aspx definieren, andere löschen.
  • Panel: am Ordner hidden-projects Schreibrechte für den User Network-Access vergeben
  • Panel:/Ftp: die zu schützenden Dateien in den Ordner hidden-projects kopieren.
  • Panel: Dateien default.aspx und web.config in Ordner hidden-access kopieren. Diese Dateien kann man auf der Seite http://iam.at/hide/ aus den beiden Frames herauskopieren.
  • Panel: Konfigurieren der Datei web.config
  • WordPress: eine WordPress-Seite erstellen, die nur eingeloggten Usern sichtbar ist (siehe Beitrag “Private WordPress-Seite” )
  • WordPress: Kode auf dieser WordPress-Seite
    <iframe src="https://meinweb/hide/?d=Projektname" width="600" height="800"></iframe>

Umgang mit anderen Dateitypen

In web.config sind derzeit folgende Dateitypen zugelassen: *.gif,*.jpg,*.png,*.pdf. Braucht man andere Dateitypen, muss man diese neuen Dateiendungen in diese Liste aufnehmen. Darüber hinaus muss man auch darauf achten, dass die zugehörigen Mime-Typen und Endungen  in den Variablen MimeExtensions und MimeTypes eingetragen sind.

Titelbild aus pixabay.com

 

Franz Fiala

Präsident Clubcomputer / Herausgeber PCNEWS bei ClubComputer.at
Franz ist pensionierter HTL Lehrer (TGM), Präsident von ClubComputer, Herausgeber der Clubzeitung PCNEWS und betreut unser Clubtelefon und Internet Support. Er ist leidenschaftlicher Rapid Wien Fan.

Letzte Artikel von Franz Fiala (Alle anzeigen)