Microsoft Exchange ist ein in kleinen und mittelständischen Firmen verbreiteter Mail/Groupware-Server, welcher sich durch grafische Verwaltbarkeit und gute Integration mit den Office-Produkten des Herstellers auszeichnet. Aus Sicherheitsgründen kann es Sinn machen diesen Server nicht direkt ins Internet zu setzen, sondern die eingehenden Anfragen über ein vorgeschaltetes System zumindest grob filtern zu lassen. Ähnliches hatte ich für Webseiten bereits im Artikel „Apache als Reverse Proxy“ vorgestellt.
Exchange geht natürlich wieder eigene Wege – es werden viele Hardcoded-Pfade und ungewöhnliche Protokolltricks genutzt, welche entsprechend umgesetzt werden müssen. Hier gehe ich von einem Exchange-Server aus, welcher bereits vollständig für Zugriffe eingerichtet ist. Als Reverse Proxy kommt Apache 2.4.x zum Einsatz, Clients sind verschiedene Mobilgeräte (Android, iOS, Windows Phone) sowie Outlook 2013. Extern erreichbar ist der Proxy unter „mail.adlerweb.info„, der interne Server ist als „exchange1.lan.adlerweb.info“ bekannt.
Erster Schritt: OWA & Co.
OWA (Outlook Web Access) und OMA (Outlook Mobile Access) sind HTTP-basierte Browseroberflächen für den Postfachzugriff, vergleichbar mit den üblichen Webmailern vieler Anbieter. Da diese im Prinzip nur Webseiten sind ist die Konfiguration schnell erledigt. Zu beachten ist, dass Apache bei den URLs auf Groß- und Kleinschreibung achtet, wer also technikferne Benutzer hat sollte ggf. passend vorsorgen. Mit diesen Zeilen ist der Abruf per Browser schon mal möglich.
SSLProxyCACertificateFile /etc/ssl/private/interneca.crt ProxyPreserveHost On SSLProxyEngine on # http://stackoverflow.com/questions/3889574/apache-and-mod-proxy-not-handling-http-100-continue-from-client-http-417 RequestHeader unset Expect early # Rewrite the WWW-Authenticate header to strip out Windows Integrated Authentication (NTLM) and only use Basic-Auth -> http://social.technet.microsoft.com/Forums/exchange/en-US/7eb1f39f-c53f-49aa-9038-6962bfc386ca/autodiscover SetEnvIf user-Agent ".*MSIE.*" value BrowserMSIE Header unset WWW-Authenticate Header add WWW-Authenticate "Basic realm=DomainLogon" RequestHeader unset accept-encoding ProxyPreserveHost On #Outlook Web Access (Exchange >=2007) ProxyPass /owa https://exchange1.lan.adlerweb.info/owa ProxyPassReverse /owa https://exchange1.lan.adlerweb.info/owa ProxyPass /OWA https://exchange1.lan.adlerweb.info/owa ProxyPassReverse /OWA https://exchange1.lan.adlerweb.info/owa #WAP Zugriff (Exchange=2003) #ProxyPass /oma https://exchange1.lan.adlerweb.info/oma #ProxyPassReverse /oma https://exchange1.lan.adlerweb.info/oma #ProxyPass /OMA https://exchange1.lan.adlerweb.info/oma #ProxyPassReverse /OMA https://exchange1.lan.adlerweb.info/oma #Falls zuvor ein ISA/TMG im Einsatz war haben evtl einige User die HTML-Loginseite #gespeichert - leiten wir passend weiter. RewriteEngine on RewriteRule "^/CookieAuth.dll(.*)" "/OWA/" [R,L]
Zwieiter Schritt: Sonstiges
Es folgen weitere HTTP-Resourcen, welche keine spezielle Konfiguration benötigen. Dies umfasst z.B. öffentliche Ressourcen oder die Webseite zur Kennwortänderung
# OWA-URL fuer Exchange < =2007 ProxyPass /exchange https://exchange1.lan.adlerweb.info/exchange ProxyPassReverse /exchange https://exchange1.lan.adlerweb.info/exchange ProxyPass /Exchange https://exchange1.lan.adlerweb.info/exchange ProxyPassReverse /Exchange https://exchange1.lan.adlerweb.info/exchange # OWA Icons, CSS, JS, etc (Exchange >=2000 < =2007) ProxyPass /exchweb https://exchange1.lan.adlerweb.info/exchweb ProxyPassReverse /exchweb https://exchange1.lan.adlerweb.info/exchweb ProxyPass /ExchWeb https://exchange1.lan.adlerweb.info/exchweb ProxyPassReverse /ExchWeb https://exchange1.lan.adlerweb.info/exchweb # Öffentliche Ordner (Exchange <=2003, >=2007 interne Umleitung auf /OWA) ProxyPass /public https://exchange1.lan.adlerweb.info/public ProxyPassReverse /public https://exchange1.lan.adlerweb.info/public ProxyPass /Public https://exchange1.lan.adlerweb.info/public ProxyPassReverse /Public https://exchange1.lan.adlerweb.info/public # Einstellungen um per OWA das Kennwort zu aendern ProxyPass /iisadmpwd https://exchange1.lan.adlerweb.info/iisadmpwd ProxyPassReverse /iisadmpwd https://exchange1.lan.adlerweb.info/iisadmpwd # Out of Office & Free/Busy-Infos (Exchange >=2007) ProxyPass /EWS https://exchange1.lan.adlerweb.info/EWS ProxyPassReverse /EWS https://exchange1.lan.adlerweb.info/EWS ProxyPass /ews https://exchange1.lan.adlerweb.info/EWS ProxyPassReverse /ews https://exchange1.lan.adlerweb.info/EWS # Offline-Adressbuecher (Exchange >=2007) ProxyPass /OAB https://exchange1.lan.adlerweb.info/OAB ProxyPassReverse /OAB https://exchange1.lan.adlerweb.info/OAB ProxyPass /oab https://exchange1.lan.adlerweb.info/OAB ProxyPassReverse /oab https://exchange1.lan.adlerweb.info/OAB # Unified Messaging (Exchange >=2007) #ProxyPass /UnifiedMessaging https://exchange1.lan.adlerweb.info/UnifiedMessaging #ProxyPassReverse /UnifiedMessaging https://exchange1.lan.adlerweb.info/UnifiedMessaging #ProxyPass /unifiedmessaging https://exchange1.lan.adlerweb.info/UnifiedMessaging #ProxyPassReverse /unifiedmessaging https://exchange1.lan.adlerweb.info/UnifiedMessaging # Exchange Control Panel (Exchange >=2010) ProxyPass /ECP https://exchange1.lan.adlerweb.info/ECP ProxyPassReverse /ECP https://exchange1.lan.adlerweb.info/ECP ProxyPass /ecp https://exchange1.lan.adlerweb.info/ECP ProxyPassReverse /ecp https://exchange1.lan.adlerweb.info/ECP
Schritt 3: Auto-Discovery
Outlook nutzt eine fixe URL um Hinweise zur Selbstkonfiguration zu erhalten. Wer dies nutzt kann auch hier eine einfache HTTP-Weiterleitung bemühen:
# AutoDiscover externer Outlook-Client ProxyPass /autodiscover https://exchange1.lan.adlerweb.info/autodiscover ProxyPassReverse /autodiscover https://exchange1.lan.adlerweb.info/autodiscover ProxyPass /Autodiscover https://exchange1.lan.adlerweb.info/Autodiscover ProxyPassReverse /Autodiscover https://exchange1.lan.adlerweb.info/Autodiscover ProxyPass /AutoDiscover https://exchange1.lan.adlerweb.info/AutoDiscover ProxyPassReverse /AutoDiscover https://exchange1.lan.adlerweb.info/AutoDiscover
Schritt 4: Active Sync
Mobilgeräte verwenden häufig das „ActiveSync“-Protokoll. Im Prinzip auch HTTP, allerdings können einige Anforderungen den Exchange-Server ins Schwitzen bringen. Um hier den Apache nicht ungeduldig werden zu lassen wird der Timeout auf 5 Minuten erhöht.
# ActiveSync - PDA/Mobilsync & Push (Exchange >=2003) # Timeout 5Min um dem Exchange etwas zeit zu geben ProxyPass /Microsoft-Server-ActiveSync https://exchange1.lan.adlerweb.info/Microsoft-Server-ActiveSync connectiontimeout=600 ProxyPassReverse /Microsoft-Server-ActiveSync https://exchange1.lan.adlerweb.info/Microsoft-Server-ActiveSync
Schritt 5: RPC
Zuletzt folgt „das Monster“: Outlook selbst. Der Outlook-Client ist in der Lage seine RPC-Pakete über HTTP zu tunneln. Leider hält sich Microsoft hier (wie üblich) nicht an die gängigen Standards. Normalerweise wird eine HTTP-Verbindung geöffnet, der Request übermittelt und die Antwort empfangen. Outlook hingegen baut gleich 2 Verbindungen auf – auf einer wird gesagt „ich habe 1GB Daten“, dann werden 100 Byte als Anfrage gesendet und auf der Zweiten die Antwort erwartet. Da die 100 Byte weit von den angekündigten 1GB entfernt sind und die Info, dass nur ein Teil gesendet wird, seitens Outlook fehlt, wartet der Apache brav auf den Rest, Outlook sendet aber nichts ohne Antwort. Deadlock. Timeout.
Apache selbst geht hier den Weg namens „Pech gehabt„. Da die Microsoft-Methode viel Angriffsfläche bietet und nicht den Standards entspricht ist eine Nutzung offiziell nicht vorgesehen. Auch scheint Microsoft diese Standardverletzung patentiert zu haben, wer also etwas passendes Implementiert könnte ein böses Erwachen erleben. Ist man trotzdem nicht abgeschreckt und möchte Outlook weiterhin nutzen muss ein Addon Abhilfe schaffen: mod_proxy_msrpc. Für Arch Linux ist es jetzt im aktuellen AUR zu finden, alle Anderen können es mit wenigen Zeilen bauen:
cd /tmp git clone git://github.com/bombadil/mod_proxy_msrpc cd mod_proxy_msrpc/ ./configure make cp src/.libs/mod_proxy_msrpc.so /usr/lib/httpd/modules/
Der Zielpfad der letzten Zeile kann sich je nach Distro unterscheiden. Debian/Ubuntu und Gentoo nutzen /usr/lib/apache2/modules/. In der httpd.conf muss analog der anderen Module auch dieses geladen werden:
LoadModule proxy_msrpc_module modules/mod_proxy_msrpc.so
Im VHost selbst leiten wir den virtuellen RPC-Ordner passend weiter und weisen das neue Modul an den Protokollmurks zuzulassen:
OutlookAnywherePassthrough On ProxyPass /rpc https://exchange1.lan.adlerweb.info/rpc/ ProxyPassReverse /rpc https://exchange1.lan.adlerweb.info/rpc/
Schritt 6: Achja, TLS
Noch ein Hinweis für alle, die auf moderne Verschlüsselung setzen: Vergesst es. Outlook 2013 unterstützt lediglich TLS1.0 sowie SHA1, entsprechend alte Algorithmen müssen also erlaubt sein.
Quellen: