33.2Webverzeichnisse einrichten und absichern
Nach der Grundkonfiguration von Apache werden Sie in der Regel verschiedene Webverzeichnisse einrichten, die jene HTML- und PHP-Dateien enthalten, aus denen sich Ihre Webseite zusammensetzt. Wenn Sie also beispielsweise WordPress als CMS für Ihre Webseite einrichten möchten, laden Sie die Installationsdateien herunter, richten ein für Apache erreichbares Verzeichnis ein und packen die Dateien dort aus. Dieser Abschnitt beschäftigt sich natürlich nicht mit den Details der WordPress-Installation, erläutert aber, welche Einstellungen Sie in Apache für das Verzeichnis vornehmen müssen, in dem Sie WordPress oder phpMyAdmin oder ownCloud oder irgendeine andere Webapplikation einrichten möchten.
Auf den folgenden Seiten gehe ich dabei von der Apache-Standardkonfiguration aus, wie Sie sie unter Ubuntu bzw. Debian vorfinden. Wenn Sie mit einer anderen Distribution arbeiten, gibt es bei der Standardkonfiguration kleine Variationen. Die hier präsentierten Schlüsselwörter und Arbeitstechniken gelten aber auch dort.
Unter Ubuntu ist Apache so vorkonfiguriert, dass für die Standard-Website Dateien aus dem Verzeichnis /var/www verwendet werden. Die erforderlichen Einstellungen befinden sich in der Datei /etc/apache2/sites-available/000-default.conf:
Eine Debian- bzw. Ubuntu-spezifische Besonderheit der Defaultkonfiguration besteht darin, dass alle Einstellungen in einer <VirtualHost>-Gruppe gebündelt sind. <VirtualHost>-Gruppen dienen dazu, Einstellungen für mehrere eigenständige Hosts (Websites) voneinander zu trennen (siehe Abschnitt 33.3, »Virtuelle Hosts«). Der Host in der Datei default ist allerdings weder an eine IP-Adresse noch an einen Hostnamen gekoppelt und gilt aus diesem Grund für alle Webzugriffe, die nicht einem speziellen virtuellen Host zugeordnet werden können.
Host-Konfiguration
Mit den im Folgenden beschriebenen Schlüsselwörtern zur Konfiguration einer <VirtualHost>-Gruppe werden die Details des Hosts festgelegt – also die Herkunft der Daten, die E-Mail-Adresse des Administrators, der Ort der Logging-Dateien etc.:
-
DocumentRoot gibt an, in welchem Verzeichnis sich die HTML-Dateien befinden.
-
ServerAdmin gibt die E-Mail-Adresse des Administrators des virtuellen Hosts an. Die Adresse wird z.B. bei Fehlermeldungen angezeigt. Sie sollten hier eine E-Mail-Adresse angeben, die tatsächlich aktiv ist. Üblich ist webmaster@hostname.
-
ServerSignatur steuert, ob Apache bei selbst generierten Dokumenten (Fehlermeldungen, Verzeichnislisten etc.) am Ende eine Signatur hinzufügen soll. Die Signatur besteht aus der Apache-Version und dem Hostnamen. Mit ServerSignatur=EMail wird auch die E-Mail-Adresse des Administrators hinzugefügt.
-
LogLevel bestimmt, in welchem Ausmaß Webserver-Probleme protokolliert werden sollen. Mögliche Werte reichen von emerg (nur kritische Fehler protokollieren, die zum Ende von Apache führen) bis debug (alles protokollieren, selbst Debugging-Texte). Sinnvolle Einstellungen sind in der Regel error oder warn. Letztere Einstellung gilt per Default.
-
ErrorLog gibt den Dateinamen der Protokolldatei für Fehlermeldungen an.
-
CustomLog gibt den Dateinamen des Zugriffsprotokolls an. In dieser Datei protokolliert Apache jede erfolgreiche Übertragung einer Datei. An den zweiten Parameter übergeben Sie entweder den Namen eines vordefinierten Loggingformats oder eine Zeichenkette mit eigenen Formatanweisungen. Die erlaubten Formatcodes sind hier beschrieben:
http://httpd.apache.org/docs/2.4/de/mod/mod_log_config.html
Unter Ubuntu sind in apache2.conf einige Formate vorkonfiguriert, z.B. combined oder common.
-
ErrorDocument gibt an, wie Apache auf Fehler reagieren soll. Als ersten Parameter geben Sie die Fehlernummer an (z.B. 404 für not found), im zweiten Parameter den Namen einer lokalen Datei bzw. die Adresse einer externen Seite, die in diesem Fall angezeigt werden soll. Der Dateiname muss relativ zu DocumentRoot angegeben werden. Die wichtigsten Fehlercodes sind:
400
Bad Request
401
Authorization Required
403
Forbidden
404
Not Found
500
Internal Server Error
Eine Liste aller Apache-Statuscodes finden Sie hier:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Standardmäßig ist ErrorDocument nicht konfiguriert. Um unschöne Fehlermeldungen zu vermeiden, sollten Sie sich die Mühe machen, eine Fehlerseite einzurichten und deren Ort mit ErrorDocument anzugeben.
-
Alias stellt eine Zuordnung zwischen einem Webverzeichnis und einem beliebigen Verzeichnis der Festplatte (auch außerhalb von DocumentRoot) her. Beispielsweise bewirkt Alias /mytool /usr/local/mytool, dass bei Zugriffen auf http://meinserver.de/mytool die Dateien aus dem Verzeichnis /urs/local/mytool gelesen werden.
In der Regel müssen Sie für jedes alias-Verzeichnis in einer <Directory>-Gruppe die Zugriffsrechte einstellen (siehe den folgenden Abschnitt). Zu Alias gibt es die Variante ScriptAlias, die zur Definition von Verzeichnissen mit CGI-Scripts dient.
Verzeichniskonfiguration
Im Anschluss an diese Einstellungen, die für den gesamten virtuellen Host gelten, können Sie in einer oder mehreren <Directory "/verzeichnis/">-Gruppen die Eigenschaften für einzelne Verzeichnisse Ihres Hosts einstellen. Die folgende Liste nennt hierfür nur die wichtigen Schlüsselwörter:
-
DirectoryIndex gibt an, welche Datei Apache senden soll, wenn eine Adresse mit / endet und somit ein ganzes Verzeichnis betrifft (standardmäßig index.html). Es dürfen auch mehrere Dateien angegeben werden. In diesem Fall arbeitet Apache alle Angaben der Reihe nach bis zum ersten Treffer ab (z.B. DirectoryIndex index.php index.html).
-
Options ermöglicht die Angabe diverser Optionen, die für das Verzeichnis gelten. Dazu zählen:
CGI-Scripts ausführen
symbolische Links verfolgen
Include-Dateien hinzufügen (Modul mod_include)
Dateiliste anzeigen, wenn index.html fehlt
automatische Sprachauswahl (Modul mod_negotiation)
Standardmäßig gilt in Apache die Einstellung All. Damit sind alle Optionen mit der Ausnahme von MultiViews aktiv. Die Ubuntu-Konfiguration ist etwas restriktiver: Für das gesamte Dateisystem gilt Options FollowSymLinks, für das /var/www-Verzeichnis gilt Options Indexes FollowSymLinks MultiViews.
Um einzelne Optionen gegenüber den Voreinstellungen eines übergeordneten Verzeichnisses wieder zu deaktivieren, muss ein Minuszeichen vorangestellt werden. Ein vorangestelltes Pluszeichen ist ebenfalls erlaubt, hat aber keine Wirkung: Die Option ist genau so aktiviert, als wäre sie ohne Pluszeichen angegeben.
Aus Sicherheitsgründen sollte für Options die Devise »Weniger ist mehr« gelten: Die Option Indexes verrät neugierigen Websurfern die Namen aller Dateien, die sich in einem Verzeichnis befinden, sofern Sie einmal index.html vergessen. Das ist ein potenzielles Sicherheitsrisiko. MultiView brauchen Sie nur für mehrsprachige Websites mit automatischer Sprachauswahl. Bietet Ihre Seite so etwas nicht, können Sie auch auf diese Option verzichten.
-
AllowOverride gibt an, welche Einstellungen verzeichnisspezifisch durch eine .htaccess-Datei verändert werden dürfen. Zur Auswahl stehen:
Authentifizierungsverfahren einstellen
Datei- und Dokumenttypen einstellen
Verzeichnisindex modifizieren
Zugriffsrechte ändern (Allow, Deny, Order)
Verzeichnisoptionen ändern
Standardmäßig sind in Apache alle Möglichkeiten aktiv, d. h., jede Option kann verändert werden. Bei den meisten Distributionen ist die Standardkonfiguration aus Sicherheitsgründen aber restriktiver. So ist unter Debian und Ubuntu für alle relevanten Verzeichnisse None voreingestellt (siehe /etc/apache2/apache2.conf).
Verzeichnisse absichern
Auf einen zentralen Punkt bin ich bisher noch nicht eingegangen: auf die Steuerung der Zugriffsrechte für Verzeichnisse. Die Apache-Versionen 2.2 und 2.4 unterscheiden sich hierbei deutlich.
In Apache 2.2 können Sie innerhalb der <Directory>-Gruppe mit Order, Allow und Deny einstellen, unter welchen Umständen Apache Dateien aus dem jeweiligen Verzeichnis lesen und weitergeben darf.
Zugriffsregeln gelten auch für alle Unterverzeichnisse, sofern nicht explizit in einer weiteren <Directory>-Gruppe andere Regeln definiert werden. Die Zugriffsregeln für das Verzeichnis / geben daher Standardregeln für das gesamte Dateisystem vor!
-
Order Allow,Deny bedeutet, dass zuerst alle Allow- und dann alle Deny-Regeln ausgewertet werden. Wenn auf einen Seitenzugriff keine Regel angewendet werden kann, wird der Zugriff blockiert.
-
Order Deny,Allow dreht die Reihenfolge der Regeln um. Beachten Sie aber: Wenn bei einem Seitenzugriff keine Regel passt, ist der Zugriff erlaubt! Diese Regel gilt in Apache standardmäßig.
-
Allow from gibt an, von welchen Hostnamen bzw. IP-Adressen Zugriffe erlaubt sind – also beispielsweise Allow from 213.214.215.216 bekannteseite.de. IP-Adressbereiche können Sie in der Form 213.214 oder 213.214.0.0/255.255.0.0 oder 213.214.0.0/16 (für 213.214.*.*) angeben. Bei Hostnamen gilt site.de auch für www.site.de, sub.site.de etc. Die Regel Allow from all erlaubt jeden Zugriff.
-
Deny from funktioniert gerade umgekehrt und blockiert den Zugriff für die angegebenen Hosts bzw. Adressen.
Per Default gilt Order Deny,Allow, und mangels anderer Regeln ist somit der gesamte Zugriff auf alle Verzeichnisse blockiert! Wenn Sie Webdateien in anderen Verzeichnissen unterbringen, vergessen Sie nicht, den Zugriff darauf zu erlauben.
Unter Apache 2.4 gelten die drei Schlüsselwörter Order, Allow und Deny als obsolet. Die Schlüsselwörter werden aber weiterhin vom Modul mod_access_compat verarbeitet. Dieses Modul steht bei den meisten Apache-2.4-Installationen zur Verfügung und stellt sicher, dass ein Apache-2.4-Update nicht die gesamte bisherige Konfiguration über den Haufen wirft.
Bei einer Neukonfiguration wird der Einsatz des neuen Schlüsselworts Require empfohlen. Die folgenden Beispiele zeigen verschiedene Anwendungsformen:
Wenn Sie für ein <Directory> mehrere Bedingungen formulieren, dann reicht es, wenn eine dieser Bedingungen erfüllt ist:
Mit <RequireAll> können Sie mehrere Bedingungen durch ein logisches Und kombinieren. Apache liefert die angeforderte Seite nur, wenn alle Bedingungen gleichzeitig zutreffen.
Wenn Sie Apache zur firmeninternen Kommunikation einrichten, können Sie den Webzugriff auf das lokale Netzwerk beschränken. Wenn das lokale Netzwerk den Adressbereich 192.168.1.* und die lokale Domain .sol nutzt, sieht die richtige Konfiguration für /var/www so aus:
Noch deutlich einfacher ist hier die Apache-2.4-Syntax:
Eine alternative Vorgehensweise besteht darin, mit Listen die IP-Adresse der lokalen Netzwerkschnittstelle anzugeben. Das setzt voraus, dass die IP-Adresse statisch ist. Nehmen wir an, der Server hat zwei Netzwerkschnittstellen: eine für die Verbindung in das Internet und eine zweite für das LAN mit der IP-Adresse 192.168.1.17. Dann bewirkt Listen 192.168.1.17, dass Apache nur noch auf Anfragen aus dem lokalen Netzwerk reagiert. Listen gilt allerdings für die gesamte Apache-Konfiguration, nicht nur für einzelne Verzeichnisse oder virtuelle Hosts. Listen funktioniert gleichermaßen unter Apache 2.2 und Apache 2.4.
Eine dritte Variante ist die Verwendung einer Firewall: Die Firewall muss den Empfang von Paketen verweigern, die von außen (also aus dem Internet) kommen und an die Ports 80 und 443 (https) gerichtet sind. Die Verwendung einer Firewall ist generell eine gute Idee, weil sie vollkommen unabhängig von Apache funktioniert.
Passwortschutz für Webverzeichnisse
Häufig sollen Webverzeichnisse nur nach einer Authentifizierung durch einen Benutzernamen und das dazugehörende Passwort freigegeben werden. Apache sieht hierfür ein einfaches Verfahren vor, das gleichermaßen in den Versionen 2.2 und 2.4 funktioniert.
Der erste Schritt hin zum Passwortschutz ist eine Passwortdatei. Die Datei sollte aus Sicherheitsgründen außerhalb aller Webverzeichnisse angelegt werden, um einen Zugriff per Webadresse auszuschließen. Das folgende Beispiel geht davon aus, dass die Passwortdatei im Verzeichnis /var/www-private gespeichert wird. Wenn Sie ein neues Verzeichnis einrichten, achten Sie darauf, dass Apache hierfür Leserechte hat. Unter CentOS/Fedora/RHEL müssen Sie auch SELinux im Auge haben und das Passwortverzeichnis entweder innerhalb von /var/www einrichten oder nach dem Erzeugen des Verzeichnisses den SELinux-Kontext korrekt einstellen.
Um eine neue Passwortdatei anzulegen, verwenden Sie das Kommando htpasswd mit der Option -c (create). Das Passwort wird selbstverständlich verschlüsselt.
Weitere Benutzername/Passwort-Paare werden mit htpasswd ohne die Option -c hinzugefügt:
Es gibt nun zwei Varianten, um Apache so zu konfigurieren, dass die Passwortdatei tatsächlich berücksichtigt wird. Die erste Variante setzt voraus, dass Sie die Konfiguration direkt in einer Apache-Konfigurationsdatei durchführen, unter Debian oder Ubuntu also in /etc/apache2/sites-available/default für die Standard-Website des Servers bzw. in .../sitename für einen virtuellen Host. Bei der zweiten Variante erfolgt die Konfiguration in der Datei .htaccess, die sich innerhalb des Webverzeichnisses befindet.
Damit die Passwortdatei von Apache berücksichtigt wird, müssen Sie in die <Directory>-Gruppe diverse Authentifizierungsoptionen einfügen. Wenn es für das zu schützende Verzeichnis noch keine eigene <Directory>-Gruppe gibt, legen Sie eine neue Gruppe an. Dabei werden automatisch alle Optionen vom übergeordneten Verzeichnis übernommen. Sie müssen also nur die Authentifizierungsoptionen hinzufügen. Die folgenden Zeilen geben hierfür ein Muster:
Kurz eine Erklärung der Schlüsselwörter:
-
AuthType gibt den Authentifizierungstyp an. Ich gehe hier nur auf den Basic-Typ ein.
-
AuthUserFile gibt den Ort der Passwortdatei an.
-
AuthName bezeichnet den Bereich (Realm), für den der Zugriff gültig ist. Der Sinn besteht darin, dass Sie nicht jedes Mal einen Login durchführen müssen, wenn Sie auf unterschiedliche Verzeichnisse zugreifen möchten, die durch dieselbe Passwortdatei geschützt sind. Sobald Sie sich mit einer bestimmten AuthName-Bezeichnung eingeloggt haben, gilt dieser Login auch für alle anderen Verzeichnisse mit diesem AuthName.
-
Require valid-user bedeutet, dass als Login jede gültige Kombination aus Benutzername und Passwort erlaubt ist. Alternativ können Sie hier auch angeben, dass ein Login nur für ganz bestimmte Benutzer erlaubt ist:
Require user name1 name2
Die oben skizzierte Vorgehensweise ist nur möglich, wenn Sie Zugang zu den Apache-Konfigurationsdateien haben, d.,h., wenn Sie selbst der Webadministrator sind. Ist das nicht der Fall, kann eine gleichwertige Absicherung auch durch die Datei .htaccess erfolgen, die sich im zu schützenden Verzeichnis befindet. In dieser Datei müssen sich dieselben Anweisungen befinden, die vorhin innerhalb der <Directory>-Gruppe angegeben wurden, also AuthType, AuthUserFile, AuthName und Require.
.htaccess erfordert AllowOverride AuthConfig
.htaccess-Dateien werden nur beachtet, wenn innerhalb des Webverzeichnisses eine Veränderung der Authentifizierungsinformationen zulässig ist. Die (übergeordnete) <Directory>-Gruppe muss AllowOverride AuthConfig oder AllowOverride All enthalten.