Umleitung auf einen anderen DNS-Namen und erzwingen von HTTPS innerhalb eines VirtualHosts

Wenn man eine Webseite mit mehreren DNS-Namen betreibt, möchte man meistens nur ein SSL-Zertifikat für diese erwerben. Eine solche Webseite wird bei einem Apache Webserver zudem meistens innerhalb eines VirtualHost konfiguriert. Daraus ergibt sich somit die Anforderung, innerhalb eines VirtualHost bei einem Apache Webserver gleich zwei Weiterleitungen zu konfigurieren.

  1. Eine Weiterleitung von http://<hostname1>.<domain>.de auf http://<hostname2>.<domain>.de
  2. Eine Weiterleitung von  http://<hostname2>.<domain>.de auf https://<hostname2>.<domain>.de

Damit der Browser keine Warnmeldung ausgibt, muss dass Zertifikat für den richtigen DNS-Namen ausgestellt sein. Deshalb ist es sehr wichtig, dass die Weiterleitungen nicht gleichzeitig sondern nacheinander ausgeführt werden. Beim ersten Aufruf der Seite muss nur auf den zweiten DNS-Namen umgeleitet werden. Beim zweiten Aufruf der Seite (der dann ja schon über den zweiten DNS-Namen erfolgt) muss dann von HTTP auf HTTPS umgeleitet werden.

Die serverseitige Umleitung von einer URL auf die andere Erfolg bei Apache üblicherweise über das Modul mod_rewrite. Bevor man dieses verwendet, muss es aktiviert werden. Dies geschieht bei Debien oder Ubuntu mit den folgendem Befehl.

a2enmod rewrite

Danach muss der Apache neu gestartet werden, damit das Modul geladen wird. Dies erledigt man bei einem neueren Ubuntu z.B. mit dem folgenden Befehl.

service apache2 restart

Die Regel für eine Weiterleitung besitzt bei Apache sogenannte Flags. Diese legen die genaue Funktionsweise der Weiterleitung fest. Um eine Weiterleitung durch Ersetzen zu erreichen wird das Flag R benötigt. Das Flag R steht für Replace und bedeutet, dass Teile der URL durch etwas anderes ersetzt werden. Wenn die Weiterleitung zudem dauerhaft sein soll, ist bei dem Flag R zudem ein Grund 301 hilfreich. Dieser Grund signalisiert, dass die Weiterleitung dauerhaft sein soll. Das Flag wird dann als „R=301“ geschrieben.

Obwohl die Konfiguration für beide Weiterleitungen in der Konfiguration von demselben VirtualHost steht, darf nur eine zur Zeit ausgeführt werden. Dies wird durch das Flag L erreicht. Dieses Flag steht für Last und bedeutet, dass beim Greifen der Rewrite-Regel keine weitere Rewrite-Regel ausgeführt wird. Es wird also immer nur eine Regel pro Aufruf ausgeführt.

Zudem ist wichtig, dass als erstes die Regel für die Weiterleitung auf den ersten DNS-Namen kommt. Erst danach darf die Regel für die Weiterleitung auf HTTPS kommen.

Wenn man all diese Bedingungen beachtet, sollten Rewrite-Regeln wie folgt aussehen.

RewriteEngine on
RewriteCond %{HTTP_HOST}   ^hostname1\.domain\.de$ [NC]
RewriteRule   ^/(.*)$ http://hostname2.domain.de/$1  [R=301,L]
 
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Weitere Informationen zum mod_rewrite gibt es auf den entsprechenden Webseiten beim Apache-Projekt unter http://httpd.apache.org/docs/current/mod/mod_rewrite.html oder https://httpd.apache.org/docs/current/rewrite/flags.html zu finden.

Apache als Reverseproxy für den Webzugriff auf einen Exchangeserver

Um einem Exchangeserver zusätzlich zu schützen kann es sinnvoll sein die Webzugriffe auf diesen über einen Reverseproxy in der DMZ laufen zu lassen. Hierfür eignet sich besonders gut der Apache Webserver, der kostenlos ist und hervorragend als Proxy eingesetzt werden kann. Er kann mit den Modulen alias, headers und proxy und wenigen Zeilen Konfiguration als Reverseproxy eingerichtet werden.

Outlook Web Access über Reverseproxy

Dazu müssen als erstes die Module für den Apache aktiviert werden. Bei Debian kann die mit dem Befehlt a2enmod erfolgen.

Danach müssen zwei virtuelle Hosts konfiguriert werden, welche die Anfragen an den Exchangeserver weiter reichen. Da auch die verschlüsselte SSL-Webseite auf Inhalte der normalen Webseite zugreift, sollte man in jedem Fall auch die normale Webseite einrichten. Die Konfiguration könnte dabei etwa wie folgt aussehen:



   ServerName webmail.example.org
   # This secures the server from being used as a third party
   # proxy server
   ProxyRequests Off

   ProxyVia On

   DocumentRoot /var/www/exchange/
   RequestHeader set Front-End-Https "On"

   ServerName mail.example.com

   #Einträge für Outlook Web Access
   ProxyPass /exchange/ http:///exchange/
   ProxyPassReverse /exchange/ http:///exchange/
   ProxyPass /exchweb/ http:///exchweb/
   ProxyPassReverse /exchweb/ http:///exchweb/
   ProxyPass /public/ http:///public/
   ProxyPassReverse /public/ http:///public/

   #Eintrag für Outlook Mobile Access
   ProxyPass /oma http:///oma/
   ProxyPassReverse /oma http:///oma/

   #Eintrag damit Mobile Endgeräte synchronisieren können
   ProxyPass /Microsoft-Server-ActiveSync http:///Microsoft-Server-ActiveSync/
   ProxyPassReverse /Microsoft-Server-ActiveSync http:///Microsoft-Server-ActiveSync/

   ProxyPreserveHost On



   # This secures the server from being used as a third party
   # proxy server
   ProxyRequests Off

   # Allows the proxying of a SSL connection
   SSLProxyEngine On
   ProxyVia On

   DocumentRoot /var/www/exchange/
   RequestHeader set Front-End-Https "On"

   ServerName mail.example.com

   # Set up SSL to work with this host
   SSLEngine On
   SSLCertificateFile /etc/apache/webmail-proxy/server.crt
   SSLCertificateKeyFile /etc/apache/webmail-proxy/server.key


   #Einträge für Outlook Web Access
   ProxyPass /exchange/ http:///exchange/
   ProxyPassReverse /exchange/ http:///exchange/
   ProxyPass /exchweb/ http:///exchweb/
   ProxyPassReverse /exchweb/ http:///exchweb/
   ProxyPass /public/ http:///public/
   ProxyPassReverse /public/ http:///public/

   #Eintrag für Outlook Mobile Access
   ProxyPass /oma http:///oma/
   ProxyPassReverse /oma http:///oma/
   
   #Eintrag damit Mobile Endgeräte synchronisieren können
   ProxyPass /Microsoft-Server-ActiveSync http:///Microsoft-Server-ActiveSync/
   ProxyPassReverse /Microsoft-Server-ActiveSync http:///Microsoft-Server-ActiveSync/

   ProxyPreserveHost On

Und schon sollte es funktionieren. Bei einem Zugriff auf https://mail.example.com/exchange/ sollte man den Outlook Webaccess zu fassen bekommen (natürlich nur, wenn auf dem Exchangeserver auch ein OWA installiert und konfiguriert ist und der DNS-Eintrag auch wirklich auf den Apache zeigt).