Probleme bezüglich DNS und Apache

Das Resümee zu diesem Thema könnte lauten: Konfigurieren Sie den Apache nicht so, dass er bei der Auswertung der Konfigurationsdateien auf die DNS-Auflösung angewiesen ist. Benötigt der Apache die DNS-Auflösung, um die Konfigurationsdateien auswerten zu können, kann der Server unzuverlässig werden (nicht starten) oder es kann zu Denial-of-Service- und Theft-of-Service-Attacken kommen und Benutzer können in der Lage sein, Anfragen anderer Benutzer zu "stehlen".

Ein einfaches Beispiel <VirtualHost www.abc.dom>
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>

Damit der Apache korrekt funktioniert, benötigt er unbedingt zwei Informationen über jeden virtuellen Host: den Servernamen und mindestens eine IP-Adresse, an die der Server gebunden wird und auf die er reagiert. Das oben angeführte Beispiel enthält keine IP-Adresse, daher muss der Apache über DNS die Adresse von www.abc.dom ermitteln. Steht das DNS aus irgend welchen Gründen gerade nicht zur Verfügung, wenn der Server seine Konfigurationsdatei analysiert, dann wird dieser virtuelle Host nicht konfiguriert und ist daher auch nicht in der Lage, auf Anfragen zu reagieren (vor der Apache-Version 1.2 wurde der Server nicht einmal gestartet).

Im folgenden Auszug aus der Konfiguration wird davon ausgegangen, dass www.abc.dom die Adresse 10.0.0.1. hat:

<VirtualHost 10.0.0.1>
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>

Diesmal muss der Apache eine reversive DNS-Auflösung durchführen, um den Servernamen dieses virtuellen Host zu ermitteln. Schlägt diese reversive Suche fehl, wird der virtuelle Host partiell deaktiviert (vor der Version 1.2 wäre der Server nicht einmal gestartet worden). Handelt es sich um einen namensbasierten virtuellen Host, dann ist er total deaktiviert, während ein auf IP-Adressen basierender Host meist funktioniert. Muss der Apache aber eine vollständige URL mit dem Servernamen für den Server erzeugen, kommt keine gültige URL zu Stande.

Mit folgenden Zeilen können beide Probleme vermieden werden:

<VirtualHost 10.0.0.1>
ServerName www.abc.dom
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>
Denial-of-Service

Es kann zu mindestens zwei Arten von Denial-of-Service-Attacken kommen. Wird eine ältere Version als die Version 1.2 ausgeführt, lässt sich der Server nicht einmal mehr booten, wenn eine der oben erwähnten DNS-Suchen für einen der virtuellen Hosts fehlschlägt. In einigen Fällen kann diese DNS-Suche auch außer Kontrolle geraten. Ist abc.dom beispielsweise eine Ihrer Kunden, der sein eigenes DNS kontrolliert, dann kann er Ihren Server (vor Version 1.2) am Booten hindern, indem er einfach den Datensatz www.abc.dom löscht.

Eine andere Form ist noch wesentlich heimtückischer. Betrachten Sie folgende Konfiguration:

<VirtualHost www.abc.dom>
  ServerAdmin webgirl@abc.dom
  DocumentRoot /www/abc
</VirtualHost>

<VirtualHost www.def.dom>
  ServerAdmin webguy@def.dom
  DocumentRoot /www/def
</VirtualHost>

Angenommen, Sie haben www.abc.dom die Adresse 10.0.0.1 und www.def.dom die Adresse 10.0.0.2 zugewiesen. Nehmen wir weiter an, def.dom hat die Kontrolle über ein eigenes DNS. Unter diesen Voraussetzungen ist def.dom in der Lage, den gesamten für abc.dom bestimmten Verkehr abzufangen. Hierfür muss lediglich www.def.dom auf die Adresse 10.0.0.1 gesetzt werden. Da die Kontrolle nicht bei Ihnen liegt, können Sie nicht verhindern, dass www.def.dom auf eine beliebige Adresse verweist.

Anfragen für die Adresse 10.0.0.1 (einschließlich all derer, bei denen die Benutzer URLs in der Form http://www.abc.dom/was_auch_immer eingegeben haben) werden alle vom virtuellen Host def.dom bedient. Um besser zu verstehen, warum das geschieht, müssen Sie etwas mehr darüber wissen, wie der Apache eingehende Anfragen mit dem virtuellen Host, der sie bedient, abgleicht. Eine einfache Beschreibung finden Sie unter Tiefergehende Erörterung der Zuweisung virtueller Hosts.

Die Adresse des Hauptservers

Die Erweiterung um die namensbasierten Hosts mit der Apache-Version 1.1 macht es erforderlich, dass der Apache die IP-Adresse(n) des Host kennt, auf dem httpd ausgeführt wird. Diese Adresse wird entweder mit der globalen Direktive ServerName (falls vorhanden) oder mit einem Aufruf der C-Funktion gethostname ermittelt (die das Gleiche zurückliefern sollte wie die Eingabe von hostname in der Befehlszeile). Anschließend wird eine DNS-Suche für diese Adresse durchgeführt. Zur Zeit lässt solche Suche nicht verhindern.

Ist zu befürchten, dass diese DNS-Suche fehlschlägt, weil der Server nicht verfügbar ist, kann der Hostname in die Datei /etc/hosts eingetragen werden (wo er vielleicht bereits steht, damit der Rechner korrekt hochgefahren wird). Anschließend muss sichergestellt werden, dass der Rechner so konfiguriert ist, dass er die Datei /etc/hosts auch benutzt, wenn die DNS-Suche fehlschlägt. Je nach dem verwendeten Betriebssystem muss hierfür die Datei /etc/resolv.conf oder die Datei /etc/nsswitch.conf bearbeitet werden.

Muss der Server aus irgend welchen Gründen keine DNS-Auflösung durchführen, kann das Problem auch durch Setzen der Umgebungsvariablen HOSTRESORDER auf local umgangen werden. Das alles hängt vom verwendeten Betriebssystem und den Auflösungsbibliotheken ab. Wird die Umgebung nicht mit mod_env gesteuert, sind auch CGIs davon betroffen. Hinweise finden Sie in den Man-Pages und unter dem Stichwort "Häufig gestellte Fragen" für das Betriebssystem.

Tipps zur Vermeidung dieser Probleme
Aussichten

Die Situation hinsichtlich DNS ist sehr unerfreulich. Für Apache 1.2 wurde versucht, dass der Server bei DNS-Problemen wenigstens bootet, was aber nicht ausreichen kann. Die Verwendung expliziter IP-Adressen in Konfigurationsdateien ist im heutigen Internet, wo Neuadressierungen eine Notwendigkeit sind, auf jeden Fall ein unangebrachtes Vorgehen.

Eine mögliche Lösung des oben beschriebenen Problems der Theft-of-Service-Attacken wäre die Durchführung einer reversiven DNS-Suche für die bei der einfachen Suche zurückgegebenen IP-Adresse und ein Vergleich der beiden Namen. Stimmen sie nicht überein, würde der virtuelle Host deaktiviert. Dafür muss die reversive DNS-Auflösung korrekt konfiguriert sein (was den meisten Administratoren wegen der üblichen Verwendung der "doppelt reversiven" DNS-Suchen durch FTP-Server und TCP-Wrapper Probleme bereitet).

Auf jeden Fall scheint ein zuverlässiges Booten eines Webservers mit virtuellen Hosts unmöglich, wenn keine IP-Adressen verwendet werden. Partielle Lösungen wie die Deaktivierung von Teilen der Konfiguration können je nach den Aufgaben des virtuellen Hosts noch nachteiliger sein, als überhaupt nicht booten zu können.

Beim Einsatz von HTTP/1.1 und Browsern und Proxies die den Host-Header benutzen, ist es möglich die Verwendung von auf IP-Adressen basierenden Hosts gänzlich zu vermeiden. In diesem Fall muss ein Webserver in der Konfigurationsphase keine DNS-Suchen durchführen.