Static Content (static-content.conf)

Die Site static-content.conf stellt statische Resourcen bereit. Statische Resourcen sind Dateien oder Ordnerstruturen die über HTTP freigegeben werden sollen. I.d.R. wird hier der unveränderliche Content abgelegt, den die Sites (nach-) laden. Das sind z.B. die statischen Javascript Bibliotheken für den Betrieb einer Site oder aber auch Ordnerstrukturen, wie z.B. HTML Dokumente.

sudo -H a2ensite static-content

Die Installation dieser Static-Site wird empfohlen, da auch noch weitere Setups (z.B. Export/Import oder Apache WebDAV) von diesem Static Content profitieren. Jedoch wird nicht empfohlen, eine solche Konfiguration, die SSI (Serverside Includes) verwendet ohne weiteres im Internet zu betreiben.

chrome Resource

Die chrome Resource hat zur Aufgabe statischen Content, der zur Anzeige von WEB-Sites wie dem Autoindex erforderlich ist, bereit zu stellen. In dem chrome Ordner befinden sich beispielsweise die Icons zu den Dateitypen, die das Feature „Autoindex von Directories“ in seinen generierten HTML Dokumenten referenziert. Die Resource definiert sich wie unten stehend.

Alias /chrome /var/www/chrome

<Directory /var/www/chrome>

    Require all granted
    Allow from all

    AllowOverride None

    Options +Indexes +FollowSymLinks +IncludesNOEXEC

    HeaderName /chrome/header.shtml
    ReadmeName /chrome/footer.shtml

    AddType text/html .shtml
    AddHandler server-parsed .shtml

    <IfModule mod_headers.c>
        Header always set X-Robots-Tag "none"
    </IfModule>

</Directory>

Da dieser statische Content nur der Gestalltung dient, ist hierfür keine Autorisierung zum Zugriff auf Resourcen erforderlich, was über die Direktive Require all granted gesetzt wird. Es macht auch keinen Sinn, wenn eine Suchmaschine diese Gestalltungselemente indiziert, was mit dem X-Robots-Tag "none" konfiguriert wird (s.a. HTTP-Headers). Mittels Allow from all wird der Zugriff aus jedem Netz erlaubt. Um den Zugriff einzuschränken muss das all der Allow-Direktive durch entsprechende Netzmasken oder IPs ersetzt werden.

Alias Direktive

Mit der Alias Direktive aus dem Apache mod_alias Modul kann auf Resourcen verwiesen werden die nicht im DocumentRoot Ordner liegen. Die Resource wird dann unter der entsprechenden URL zur Verfügung gestellt.

Alias /chrome /var/www/chrome
<Directory /var/www/chrome>
   ...

Mit dieser Direktive wird der Content aus dem Ordner /var/www/chrome unter der URL https://localhost/chrome referenziert.

AllowOverride

Mit der Apache AllowOverride Direktive wird gesetzt, welche Otionen in einer .htaccess lokal in einem Ordner angepasst werden können. Mit

AllowOverride None

darf keine Option überschrieben werden. Andere sinnvolle Werte können z.B. Anpassungen an der Autorisierung und dem Autoindex sein:

AllowOverride AuthConfig Indexes

Hier im Setup werden lokale Anpassungen in .htaccess Dateien nicht erforderlich werden, manche Installation einer WEB-Anwendung ist aber auf Overerrides angewiesen.

Allow-Direktive

In der Allow-Direktive (Apache Access Control / Apache mod_acces_compat) können nicht nur IPs bzw. Netzmasken angeben werden, es ist auch möglich Domian- oder Host-Namen anzugeben. Es sind aber die Netzmasken den Host-/Domain-Namen vorzuziehen, da die Namensauflösung Zeit und Netztraffic in Anspruch nehmen kann und es nicht auszuschließen ist, dass der DNS (wiki)den der Apache benötigt um die IP Adresse in einem Namen aufzulösen – Teil eines Angriffszenarios ist, oder ob er einfach nur buggy ist.

Um eine solche Konfiguration strukturiert durchführen zu können müssen die Grundlagen der Natzmaskierung bekannt sein, die in der Exkursion: Netzmaske / IPv4 und IPv6 vermittelt werden. I.d.R. wird man den Zugriff aus den folgenden Netzen konfigurieren:

  • Netzweit all

  • IPv4 localhost: 127.0.0.0/8

  • IPv4 privates Class-A Subnetz 10.0.0.0/8

  • IPv4 privates Class-B Subnetz 192.168.0.0/16

  • IPv4 privates Class-C Subnetz 192.168.0.0/24

  • IPv6 localhost: ::1

  • IPv6 Link-Lokal Netz: fe80::/10

  • IPv6 Unique-Local Subnetz: fd00::/8

Die Allow, Order und Deny Direktiven wurden bereits im Deny from root gesetzt, es wurde alles dicht gemacht. Um eine Site Netzweit frei zu geben, muss die Allow-Direktive auf all gesetzt. werden

Allow from all

Um die Site in dem Link-Lokal Netzt frei zu geben eignet sich:

Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1

Die beiden letzten Beispiele basieren auf den vererbeten Order und die Deny Direktieven aus dem Deny from root Konzept. Die Vererbung kann oft ein hilfsreiches Gestaltungsmittel sein, bei der Gewährung von Zugriffsrechten auf eine Site empfiehlt es sich expliziet zu sein und auf eine Vererbung zu verzichten. Man muss dann zwar etwas mehr notieren, aber die Zugriffkontrolle ist damit zentral an der Site angebracht und unmissverständlich.

Order deny,allow
Deny from all
Allow from fd00::/8 192.168.0.0/16 fe80::/10 127.0.0.0/8 ::1

Autoindex von Directories

Zum Static Content gehört in diesem Setup noch die Installation des Apache mod_autoindex Moduls. Mit diesem Modul wird die Auflistung des Inhalts eines Ordners (eines Directory) in ein HTML Dokument umgewandelt und über HTTP an den WEB-Browser gegeben. Sozusagen, ein nur lesender Dateiexplorer über HTTP. Mit dem Autoindex kann in der Ordnerstruktur einer Resource navigiert werden. Die System-Dokumentation (sysdoc) oder der Export/Import Ordner sind Beispiele für diese Anwendung des Autoindex.

Mit dem Autoindex-Modul wird von Debian noch eine Default-Konfiguration ausgeliefert, die hier im Setup jedoch durch eine etwas verbesserte Konfiguration ersetzt wird.

  • Default: /etc/apache2/mods-available/autoindex.conf

  • Anpassung: /etc/apache2/conf-available/autoindex.conf

sudo -H mv autoindex.conf autoindex.conf-disabled
sudo -H a2enconf autoindex
sudo -H a2enmod autoindex

In der autoindex.conf wird das Setup für die Anzeige der Ordnerinhalte konfiguriert. Hier ein Auszug:

<IfModule mod_autoindex.c>

    IndexOptions FancyIndexing XHTML HTMLTable SuppressHTMLPreamble \
                 VersionSort FoldersFirst DescriptionWidth=* NameWidth=* \
                 Charset=UTF-8
    ...
    AddIconByType (IMG,/chrome/icons/16x16/mimetypes/gnome-mime-image.png) image/*
    AddIconByType (SND,/chrome/icons/16x16/mimetypes/gnome-mime-audio.png) audio/*
    AddIconByType (TXT,/chrome/icons/16x16/mimetypes/gnome-mime-text.png) text/*
    AddIconByType (VID,/chrome/icons/16x16/mimetypes/gnome-mime-video.png) video/*
    ...
    AddDescription "tar (tape) archive" .tar
    AddDescription "GZIP compressed document" .Z .z .gz .zip
    AddDescription "ZIP compressed document" .zip

Die Apache IndexOptions Direktive wird wie die Apache Options Direktive vererbt (vergleiche Autoindex aktivieren).

Die IndexOptions Direktive steht hier in einem globalen Kontext, damit wird sie auf jede (freigegebene) statische Resource vererbt. Will eine Autoindex-Site den FancyIndex-Style nicht eingeschaltet haben, dann muss diese Autoindex-Site IndexOptions -FancyIndex definieren. Die +/- Notation wird am Beispiel Autoindex aktivieren noch genauer erläutert.

In dem obigen Ausschnitt der Konfiguration ist auch zu sehen, dass für die Dateitypen (Mimetypes) die passenden Icons konfiguriert werden. Diese Icons werden in der Ordneransicht des Autoindex dann mit angezeigt. Die Icons werden in dem – vom Autoindex generierten – HTML Dokument als img-Tag eingebunden:

<img src="/chrome/icons/16x16/mimetypes/gnome-mime-image.png" />

Hinweis

Der Browser wird das Bild unter der URL https://myhostname/chrome/ nachladen. Hier schließt sich dann der Kreis von Autoindex und der statischen chrome Resource.

Autoindex aktivieren

Mit der Direktive Options +Indexes wird der chrome Ordner im WEB-Browser auch navigierbar (vergleiche chrome Resource).

Options +Indexes +IncludesNOEXEC +FollowSymLinks

Die Apache Options Direktive wird vererbt. Bereits im Root Ordner (vergleiche Deny from root) wurden die default Options im globalen Dateisystem-Kontext gesetzt. Diese werden auf alle Ordner (und somit auch auf den chrome Ordner) vererbt. Diese Vererbung kann überschrieben werden oder mittles des +/- Präfix an den Optionen spezialisiert werden.

Überschrieben würde sie z.B. mit Options Indexes. Das würde zwar den Autoindex aktivieren, jedoch hätte man alle Optionen aus dem globalen Kontext verloren. Da in diesem Setup Konzept wie die „der Verbung“ zur Anwendung kommen sollen (wir wollen die global einheitlich Optionen an einer Stelle setzen können) muss die Apache Options Direktive im Kontext des chrome Ordners spezialisiert werden.

Mit dem + vor dem Options +Indexes wird die Option aditiv zu den geerbeten Optionen hinzugefügt. Mit einem - vor der Option können geerbte Eigenschaften abgeschaltet werden. Soll beispielsweise eine Einstellung die aus dem globalen Kontext geerbt wurde im chrome Ordner abgeschaltet werden, so muss das - als Präfix verwendet werden (Options -Opt2Drop).

Hinweis

Wenn das +/- Präfix in einer Resource für eine Option angewendet wird, muss es für alle Optionen in dieser Resource angewendet werden. Direktieven wie Options Indexes führen dazu, dass der Autoindex zwar eingeschaltet würde, aber gleichzeitig alle geerbten Optionen verloren gehen würden (wegen dem fehlenden +/- vor Indexing). Solche gemischten Notationen führen zu verwirrenden Ergebnissen, weshalb man sich in einer Resource immer dafür entscheiden sollte die Vererbung zu spezialiseren (nur +/-) oder komplett zu verwerfen. Bei Letzterem müssen dann alle Optionen ohne das Präfix notiert werden.

Serverside Includes

Die Generierung der HTML-Seiten mit der Auflistung der Dateien in einem Ordner ist in diesem Setup mittels Server Side Includes (SSI) relalisiert (siehe Introduction to SSI).

SSI sind umstritten, sie sollten nur mit Umsicht eingesetzt werden. Dazu gehört, dass in KEINEM Fall die #exec -Direktieve verwendet wird! Hier im Setup werden SSI nur verwendet, um die Autoindex-Seiten etwas aufzubrezeln und es werden die SSI-Skripte NUR im Kontext des Chrome-Ordners aktiviert (vergleiche chrome Resource).

AddType text/html .shtml
AddHandler server-parsed .shtml

Im Chrome Ordner gibt es auch nur zwei kleine SSI-Skripte für den Header und die Readme des Autoindex. Will ein Autoindex in einem anderen Kontext diese verwenden, muss er nur die beiden Dateien aus dem Chrome-Ordner setzen.

HeaderName /chrome/header.shtml
ReadmeName /chrome/footer.shtml

Da auch der Chrome Ordner mit dem Autoindex navigierbar ist, werden sie auch im Chrome Ordner gesetzt (vergleiche chrome Resource).

Vorsicht

Andere Kontexte als der Chrome-Ordner sollen keine SSI-Skripte aktivieren. Sie benötigen keine AddHandler server-parsed .shtml Direktieve.