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:

# Datei /etc/apache2/sites-available/000-default.conf (Ubuntu) <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <VirtualHost>

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.:

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:

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!

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:

# erlaubt den Zugriff vom Rechner mit der IP-Adresse 192.168.0.2 Require ip 192.168.0.2 # erlaubt den Zugriff aus dem Adressbereich 10.0.*.* Require ip 10.0 # erlaubt den Zugriff aus einem IPv6-Adressbereich Require ip 2001:1234:789a:0471::/64 # erlaubt den Zugriff für einen bestimmten Hostnamen Require host intern.meine-firma.de # erlaubt den Zugriff für *.meine-firma.de Require host meine-firma.de # erlaubt den Zugriff von localhost (IPv4 und IPv6) Require local # erlaubt den Zugriff für authentifizierte Benutzer Require valid-user # erlaubt den Zugriff von überall Require all granted # blockiert jeden Zugriff Require all denied

Wenn Sie für ein <Directory> mehrere Bedingungen formulieren, dann reicht es, wenn eine dieser Bedingungen erfüllt ist:

<Directory /var/www/cms> Require local Require ip 192.168 Require host meine-firma.de </Directory>

Mit <RequireAll> können Sie mehrere Bedingungen durch ein logisches Und kombinieren. Apache liefert die angeforderte Seite nur, wenn alle Bedingungen gleichzeitig zutreffen.

<Directory /var/www/internal-wiki> <RequireAll> Require valid-user Require ip 192.168.17 </RequireAll> </Directory>

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:

# für Apache 2.2 <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order Deny,Allow Deny from all Allow from 192.168.1 Allow from localhost Allow from .sol </Directory>

Noch deutlich einfacher ist hier die Apache-2.4-Syntax:

# für Apache 2.4 <Directory /var/www/> Require local </Directory>

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.

root# cd /var/www-private root# htpasswd -c passwords.pwd username New password: ******** Re-type new password: ******** Adding password for user username

Weitere Benutzername/Passwort-Paare werden mit htpasswd ohne die Option -c hinzugefügt:

root# cd /var/www-private root# htpasswd passwords.pwd name2 New password: ******** Re-type new password: ******** Adding password for user username

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:

# in /etc/apache2/sites-available/xxx (Debian/Ubuntu) ... # passwortgeschütztes Verzeichnis <Directory "/var/www/admin/"> AuthType Basic AuthUserFile /var/www-private/passwords.pwd AuthName "admin" Require valid-user </Directory>

Kurz eine Erklärung der Schlüsselwörter:

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.