Reverse-Proxy-Server – Kernkomponente in Sicherheitsarchitekturen

Der sichere Betrieb von Web- oder Exchange-Servern stellt Netzwerkadministratoren vor ein Problem: Zwar sollen Onlinedienste wie das Web oder E-Mail über das öffentliche Netzwerk verfügbar sein; eine direkte Anbindung an das Internet macht die Systeme jedoch anfällig für Malware und manuelle Einbrüche. Oft kommt daher eine vermittelnde Netzwerkkomponente zum Einsatz – ein sogenannter Reverse-Proxy.

Was ist ein Reverse-Proxy-Server?

Grundsätzlich handelt es sich bei einem Proxy-Server um eine Kommunikationsschnittstelle im Netzwerk, die Anfragen entgegennimmt und stellvertretend an einen Zielrechner weiterleitet. In Unternehmensnetzen kommt ein solcher Aufbau zum Einsatz, um Client-Geräten einen kontrollierbaren Zugang zum Internet zu gewähren. Der als Proxy konfigurierte Server stellt in diesem Fall die einzige Verbindung ins öffentliche Netz dar. Man spricht von einem Forward-Proxy.

Ein Forward-Proxy kanalisiert alle Anfragen aus dem internen Netzwerk und leitet diese mit der eigenen Absenderadresse an die Zielserver im Internet weiter. Auch Serverantworten erreichen zuerst den Proxy, bevor sie an die entsprechenden Client-Geräte verteilt werden. Diese bleiben somit anonym – es sei denn, es handelt sich um einen transparenten Proxy. Um Bandbreite zu sparen und den Webseitenabruf zu beschleunigen, werden Proxy-Server in der Regel so programmiert, dass sie häufig angefragte Inhalte im Cache zwischenspeichern und somit ohne erneute Serveranfrage direkt ausspielen können.

Während ein Forward-Proxy Client-Geräte in einem Netzwerk vor Einflüssen aus dem Internet schützt, arbeitet ein Reverse-Proxy dem Namen entsprechend in umgekehrter Richtung. Ein solcher Proxy-Server wird als zusätzliche Sicherheitskomponente vor einen oder mehrere Webserver geschaltet, um Anfragen aus dem Internet stellvertretend entgegenzunehmen und an einen Backend-Server im Hintergrund weiterzuleiten.

Als dem Netzwerk vorgeschaltete Kommunikationsschnittstelle kann ein Reverse-Proxy verschiedene Funktionen übernehmen, die der Sicherheit der Backend-Server dienen und den Datenverkehr optimieren.

Definition

Ein Reverse Proxy ("umgekehrter Proxy") ist eine zusätzliche Schutzmaßnahme, die vor einen oder mehreren Webservern geschaltet werden kann.
Im Gegensatz zu einem Proxy wird die Adressumsetzung in der entgegengesetzten Richtung durchgeführt.
Die Aufgabe des Reverse Proxys ist es Anfragen von Servern stellvertretend anzunehmen und an den entsprechenden Client weiterzuleiten.
Dabei gewährt der Reverse Proxy einem oder mehreren Clients eines externen Netzes den Zugriff auf ein internes Netz.

Reverse-Proxy: Funktion und Anwendungsgebiete

Reverse-Proxys werden in der Regel von einer Firewall abgesichert in einem privaten Netzwerk oder einer vorgelagerten demilitarisierten Zone (DMZ) installiert. Dabei stellt der Reverse-Proxy ähnlich wie der Forward-Proxy die einzige Verbindung zwischen Internet und privaten Netzwerk dar. Alle Anfragen an die Backend-Server im LAN durchlaufen somit dieselbe Kommunikationsschnittstelle, bevor sie an die eigentlichen Zielsysteme weitergeleitet werden. Eine solche Bündelung ermöglicht es, den eingehenden Datenverkehr zu kontrollieren, mehrere Server unter derselben URL zur Verfügung zu stellen, Anfragen gleichmäßig auf verschiedene Server zu verteilen und den Datenabruf durch Caching zu beschleunigen. Für den Einsatz eines Reverse-Proxy-Servers ergeben sich somit folgende Anwendungsgebiete:

  • Anonymisierung: Als einziger Zugang zum internen Netzwerk fängt ein Reverse-Proxy sämtliche Anfragen an Server im Hintergrund ab und agiert Client-Programmen gegenüber so, als ob sie es mit dem eigentlichen Zielsystem zu tun hätten. Dazu leitet der Proxy die Anfragen an die entsprechenden Zielsysteme im LAN weiter, nimmt deren Antworten entgegen und spielt diese an die anfragenden Clients aus. Die eigentlichen Backend-Server bleiben somit anonym.
  • Schutz und Verschlüsselung: Ein vorgeschalteter Reverse-Proxy bietet die Möglichkeit, Kontrollsysteme wie Virenscanner oder Paketfilter zu installieren, die die Server im Hintergrund zusätzlich absichern. Somit stellt der Proxy-Server ein weiteres Glied in der Sicherheitskette zwischen Internet und privatem Netzwerk dar. Darüber hinaus lassen sich Reverse-Proxy-Server zur Verschlüsselung einsetzen. Die Auslagerung der SSL-Zertifikate auf den Proxy entlastet die Webserver im Hintergrund.
  • Load-Balancing: Durch einen vorgeschalteten Reverse-Proxy lässt sich eine URL mit diversen Servern im privaten Netzwerk verknüpfen. Dies bietet die Möglichkeit, eingehende Anfragen auf mehrere Server zu verteilen. Ein solches Load-Balancing beugt der Überlastung einzelner Systeme vor und wirkt bei Ausfällen kompensierend. Ist ein Server aufgrund von Hardware- oder Software-Fehlern nicht erreichbar, verteilt das Load-Balancing-Modul des Proxys eingehende Anfragen auf verbleibende Server um. Die Verfügbarkeit von Serverdiensten wird so auch bei Ausfällen weiterhin sichergestellt.
  • Caching: Um die Geschwindigkeit von Serverdiensten zu beschleunigen, bietet der Reverse-Proxy eine Funktion, mit der sich Serverantworten zwischenspeichern lassen. Dieses Caching ermöglicht dem Proxy-Server, sich wiederholende Anfragen entweder teilweise oder komplett selbst zu beantworten. Dabei werden statische Inhalte wie Bilder oder häufig aufgerufene dynamische Webseiten im Cache des Proxys vorgehalten. So müssen keine oder deutlich weniger Daten vom Backend-Server abgerufen werden, wodurch sich die Zugriffsrate auf Webdienste deutlich beschleunigt. Da bei Inhalten, die sich schnell ändern, nicht immer sichergestellt werden kann, dass der Cache des Proxys die aktuelle Version enthält, besteht jedoch die Gefahr, dass anfragende Clients veraltete Informationen ausgespielt bekommen.
  • Kompression: Mit entsprechender Software ausgestattet lässt sich ein Reverse-Proxy zur Kompression eingehender und ausgehender Daten einsetzen. Ein beliebtes Programm zur Kompression von Websites ist gzip, das oft in Kombination mit Apache oder nginx zum Einsatz kommt.

Apache als Reverse-Proxy einrichten

Um einen Reverse-Proxy einzurichten, bietet sich der Apache HTTP Server an. Der weltweit beliebteste Webserver verfügt über diverse Erweiterungsmodule für verschiedene Proxy-Funktionen und lässt sich schon mit wenigen Codezeilen entsprechend konfigurieren. Die folgende Schritt-für-Schritt-Anleitung zeigt, wie man eine Apache-Installation auf dem Betriebssystem Ubuntu um das benötigte Modul erweitert und eine Konfigurationsdatei für die Weiterleitung erstellt.

Der quelloffene Apache HTTP Server wird von der Apache Software Fundation kostenlos zur Verfügung gestellt. Eine Einführung in die Webserver-Software finden Sie in unserem Artikel "Apache-Webserver einrichten und konfigurieren".

Schritt 1: Installation der Apache-Proxy-Module

Um einen Apache HTTP Sever als Reverse-Proxy nutzen zu können, benötigen Sie das Modul mod_proxy. Dieses implementiert die Kernfunktionalitäten und lässt sich um diverse Zusatzmodule erweitern:

  • mod_proxy_http beinhaltet alle Proxy-Funktionen für HTTP und HTTPS-Anfragen. Das Zusatzmodul unterstützt die Protokollversionen sind HTTP/0.9, HTTP/1.0 und HTTP/1.1.
  • mod_proxy_ftp wird benötigt, um Proxy-Funktionen für FTP-Anfragen zur Verfügung zu stellen.
  • mod_proxy_connect hält Proxy-Funktionen für ein SSL-Tunneling bereit.
  • mod_proxy_ajp implementiert das Apache-JServ-Protocol (AJP). Dieses wird im Rahmen des Load-Balancings genutzt, um Anfragen an Applikationsserver im Hintergrund weiterzuleiten.
  • mod_cache, mod_disk_cache und mod_mem_cache implementieren Caching-Funktionen, die es ermöglichen, Inhalte auf dem Apache-Server zwischenzuspeichern.
  • mod_proxy_html ermöglicht ein Rewriting von HTML-Links.
  • mod_headers ermöglicht die Manipulation von HTTP-Kopfdaten.
  • mod_deflate implementiert eine Kompressionsfunktion.

Um das Modul mod_proxy inklusive aller Zusatzmodule zu installieren, ist lediglich folgende Kommandozeile erforderlich:

sudo apt-get install libapache2-mod-proxy-html

Dieses Tutorial konzentriert sich auf die Grundfunktionen des Apache-Moduls mod_proxy. Eine detaillierte Beschreibung der Zusatzmodule inklusive aller benötigten Direktiven findet sich in der offiziellen Dokumentation des Apache-Projekts.

Schritt 2: Aktivierung der benötigten Module

Um einzelne Module der Apache-Proxy-Funktion zu aktivieren, kommt der Befehl a2enmod zum Einsatz. Bereits aktivierte Module lassen sich durch a2dismod deaktivieren. Um einen einfachen Reverse-Proxy für einen nachgelagerten Webserver zu erstellen, genügt es, die Module mod_proxy und mod_proxy_http zu laden:

sudo a2enmod proxy 
sudo a2enmod proxy_http

Nachdem die Module aktiviert wurden, muss der Apache HTTP Server neu gestartet werden:

sudo apache2 reload

Schritt 3: Erstellen der Konfigurationsdatei

Damit der Reverse-Proxy Anfragen aus dem Internet entgegennehmen und an den richtigen Server im lokalen Netz weiterleiten kann, ist es nötig, die Konfigurationsdatei 000-default.conf im Verzeichnis /etc/apache2/sites-enabled zu deaktivieren und durch eine Virtual-Host-Datei wie beispiel.conf zu ersetzen. Dabei empfiehlt es sich, für jeden Zielserver mit eigener IP eine separate Virtual-Host-Datei nach folgendem Schema anzulegen:

<VirtualHost *:80>
 ServerName domain.tld
 ServerAlias www.domain.tld
 ProxyRequests Off
 ProxyPass / http://123.456.7.89/
 ProxyPassReverse / http://123.456.7.89/
</VirtualHost> 

Anweisungen zur Proxy-Funktion werden innerhalb der Direktive <VirtualHost> definiert. Das Start-Tag beinhaltet zudem die IP-Adresse inklusive Portnummer, an der der als Reverse-Proxy konfigurierte Apache auf Anfragen lauschen soll. Sollen dabei alle IP-Adressen einbezogen werden, kommt wie im Beispiel der Platzhalter * zum Einsatz. Angaben innerhalb des VirtualHost-Tags werden ebenfalls in Form von Direktiven angegeben. Anders als das VirtualHost-Tag weisen diese Argumente auf, die definieren, wie eingehende Anfragen und Antwortpakete zu bearbeiten sind. Essenziell sind dabei vor allem die Direktiven ServerName, ProxyPass und ReversePass.

  • ServerName: Die Direktive ServerName definiert, unter welchem primären Namen ein Server im Internet erreichbar ist. Dieser muss entweder via DNS oder über die /etc/hosts auflösbar sein. Im Beispiel wird der Apache-Server angewiesen, alle Anfragen an domain.tld entgegen zu nehmen.
  • ProxyPass: Die Direktive ProxyPass definiert die Zieladresse für eine Weiterleitung. Alle Anfragen, die sich an die unter ServerName hinterlegte öffentliche Adresse richten, werden vom Reverse-Proxy an die interne Adresse weitergeleitet, die im Argument der Direktive ProxyPass hinterlegt wurde. Im Beispiel wäre das die fiktive IP 123.456.7.89.
  • ProxyPassReverse: Ein Proxy-Server nimmt nicht nur Anfragen entgegen, er leitet auch die Antwortpakete des Backend-Servers an die Clients weiter. Um zu verhindern, dass diese Antworten mit falschen Header-Informationen (nämlich denen des Servers im Hintergrund) ausgeliefert werden, schreibt die Direktive ProxyPassReverse die Header der Serverantworten so um, dass diese zum Proxy-Server passen. Der Backend-Server bleibt somit anonym.

Darüber hinaus finden sich im Beispiel zwei weitere Direktiven: ServerAlias und ProxyRequests. Diese stellen keine Basisfunktionen für den Proxy-Server zur Verfügung und sind daher fakultativ.

  • ServerAlias: Die Direktive ServerAlias ermöglicht es, neben dem primären Servernamen einen alternativen Namen für den Zielserver zu definieren.
  • ProxyRequest: Die Direktive ProxyRequests mit dem Argument Off verhindert, dass der Apache HTTP Server als Forward-Proxy genutzt wird, um einem möglichen Missbrauch vorzubeugen.

Wurden die Regeln für die Proxy-Funktion definiert, muss die Konfiguration über das Terminal aktiviert werden:

sudo a2ensite beispiel.conf

Der Apache HTTP Server nimmt nun alle Anfragen an domain.tld oder www.domain.tld entgegen und leitet diese in Form von Proxy-Requests an einen Backend-Server mit der IP 123.456.7.89weiter.