Ralf Zimmermann SIEGNETZ.IT GmbH

Apache

Apache & mod_ssl SSLCipherSuite

Zurück zum Seitenanfang | Publiziert am

In dieser Apache-2.4 Konfiguration wird SSLv3 deaktiviert. SSLv2 wird in Apache 2.4 nicht mehr unterstützt und muss daher nicht ausgenommen werden. Der Parameter SSLHonorCipherOrder on stellt sicher, dass Clients die vom Server präferierte Cipher Suite Liste benutzen, und nicht umgekehrt. Die SSLCipherSuite Konfiguration unterstützt PFS, und deaktiviert unsichere Cipher Suites. Wird 3DES nicht mit aufgeführt, werden ältere Clients wie Windows XP nicht mehr unterstützt.

Konfiguration ohne 3DES

SSLProtocol all -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:ECDH+AESGCM:ECDH+AES:ECDH:HIGH:MEDIUM:!RC4:!3DES:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP'

Konfiguration mit 3DES

SSLProtocol all -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA:EECDH:EDH+AESGCM:EDH:+3DES:ECDH+AESGCM:ECDH+AES:ECDH:AES:HIGH:MEDIUM:!RC4:!CAMELLIA:!SEED:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP'

Apache & Letsencrypt Zertifikate

Zurück zum Seitenanfang | Aktualisiert am

Damit die Zertifikatskette sauber konfiguriert ist, muss das Intermediate Zertifikat mit eingebunden werden. Dies gestaltet sich je nach Apache Version unterschiedlich.

Apache2.2 Konfiguration

SSLCertificateFile    /etc/letsencrypt/live/siegnetz.de/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/siegnetz.de/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/siegnetz.de/chain.pem

Apache2.4 Konfiguration

SSLCertificateFile    /etc/letsencrypt/live/siegnetz.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/siegnetz.de/privkey.pem

mod_rewrite Konfiguration

Bei der Ausstellung von Zertifikaten kann es Probleme mit dem mod_rewrite geben. Typische Anwendungen wo momentan diese Probleme auftreten sind Typo3, Wordpress oder z.B. Owncloud. Um das Rewriting des acme-challenge Pfades zu unterbinden, kann folgende Rewrite Condition in die Webserverkonfiguration oder .htaccess eingebunden werden.


  RewriteRule ^\.well-known/acme-challenge - [L]


Hier ein Beispiel in der .htaccess einer Owncloud Konfiguration.

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^\.well-known/acme-challenge - [L]
  RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L]
  RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L]
  RewriteRule ^\.well-known/carddav /remote.php/carddav/ [R=301,L]
  RewriteRule ^\.well-known/caldav /remote.php/caldav/ [R=301,L]
  RewriteRule ^apps/calendar/caldav\.php remote.php/caldav/ [QSA,L]
  RewriteRule ^apps/contacts/carddav\.php remote.php/carddav/ [QSA,L]
  RewriteRule ^remote/(.*) remote.php [QSA,L]
  RewriteRule ^(build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
  RewriteRule ^(\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
</IfModule>


Werden Webbereiche mit einer Certification Authority abgesichert und Clients verifiziert, dann kann es zu Zugriffsproblemen mit Letsencrypt kommen. Damit Zertifikate erstellt oder erneuert werden können, muss der Pfad /.well-known/acme-challenge aufrufbar sein können. Da der Webbereich nur für Clients mit verifizierten Zertifikaten aufrufbar ist, können diese Anfragen fehlschlagen. Mittels mod_rewrite kann man den Pfad z.B. per unverschlüsselter HTTP Anfrage verfügbar machen. Hier ein Beispiel.

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.*$
        RewriteRule ^ https://%{HTTP_HOST}/%{REQUEST_URI} [L,QSA,R=permanent]
</IfModule>

Apache als Exchange Reverse Proxy

Zurück zum Seitenanfang | Publiziert am

Es gibt verschiedene Szenarien in denen ein Reverse Proxy notwendig ist. Diese Beispielkonfiguration ist Teil einer Umstellung auf eine Mobile Device Management Lösung die zukünftig nur noch Clients akzeptiert die den Firmenrichtlinien ensprechen. Die Vorlage für diese Konfiguration stammt aus dem ZNIL WIKI. Wir haben verschiedene Reverse Proxy Konfigurationen getestet, aber nur diese funktionierte problemlos. Unter anderem haben wir mit Nginx, Pound Proxy und Squid Proxy getestet.

In aktuellen Distributionen existiert mittlerweile das Apache Modul libapache2-mod-proxy-msrpc. Das Modul ermöglicht RPCoverHTTPS. Unter Debian Jessie lässt sich das Modul mit folgendem Befehl installieren.

aptitude install libapache2-mod-proxy-msrpc

Note: Wer das Modul aus den Quellen kompilieren muss, findet diese unter https://github.com/bombadil/mod_proxy_msrpc.

Notwendige Apache Module aktivieren

a2enmod headers
a2enmod rewrite
a2enmod proxy_http
a2enmod ssl
a2enmod proxy_msrpc

Exchange Zertifikat umwandeln

openssl pkcs12 -in exchange-cert.pfx -nocerts -out exchange-cert-private.key
openssl rsa -in exchange-cert-private.key -out exchange-cert.key
rm exchange-cert-private.key
openssl pkcs12 -in exchange-cert.pfx -clcerts -nokeys -out exchange-cert.cert

DNS Records für Client DNS Autodiscover

Microsoft Clients die Autodiscover nutzen um die passenden Exchange Einstellungen zu finden, führen folgende DNS Abfragen durch. Dies ist notwendig falls Outlook keinen DC für die Abfrage des SCP findet.

  1. Client sucht nach https://siegnetz.de/autodiscover/autodiscover.xml
  2. Client sucht nach https://autodiscover.siegnetz.de/autodiscover/autodiscover.xml
  3. Client sucht DNS Eintrag _autodiscover._tcp.siegnetz.de → IN SRV 0 0 443 exchange.siegnetz.de
  4. Client Client sucht nach DNS SRV FQDN Dienst z.B. exchange.siegnetz.de
  5. Outlook fordert Bestätigung für Link https://exchange.siegnetz.de/autodiscover/autodiscover.xml
  6. Outlook lädt XML Datei von https://exchange.siegnetz.de/autodiscover/autodiscover.xml

In dem entsprechenden Zonen File sollten folgende DNS Records definiert werden:

  1. autodiscover IN A <external-ip>
  2. _autodiscover._tcp IN SRV 0 0 443 <external-hostname>

Apache Reverse Proxy Konfiguration

Note: Für den /ews Pfad muss im IIS des Exchange noch die Standardauthentifizierung aktiviert werden. Dadurch funktioniert dann auch das Autodiscovery und auch der Abwesenheitsassistent.

In dieser Beispielkonfiguration ist der Apache Reverse Proxy unter der IPv4 Adresse 10.1.1.1 und der Exchange Server unter der IPv4 Adresse 10.2.2.2 erreichbar.

<VirtualHost 10.1.1.1:80>
ServerName exchange.siegnetz.de
ServerAlias autodiscover.siegnetz.de
 
ServerAdmin postmaster@siegnetz.de
 
ErrorLog /var/log/apache2/reverse-proxy-error.log
CustomLog /var/log/apache2/reverse-proxy-access.log combined
 
Header always set X-Frame-Options SAMEORIGIN
 
Header set Server Apache
 
Header unset X-AspNet-Version
Header unset X-OWA-Version
Header unset X-Powered-By
 
# Nachfolgende Zeile löst den "Expectation Failed Apache 417" Fehler beim AutoDiscover etc.
RequestHeader unset Expect early
 
# Nachfolgende Zeilen sind um die Authentifizierung zu ermöglichen - NTLM-Funktioniert durch den Proxy nicht, deshalb Basis-Authentifizierung erzwingen
SetEnvIf User-Agent ".*MSIE.*" value BrowserMSIE
Header unset WWW-Authenticate
Header add WWW-Authenticate "Basic realm=exchange.siegnetz.de"
 
ProxyRequests Off
 
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/owa(.*) https://exchange.siegnetz.de/owa$1 [R,L]
RewriteRule ^/ecp(.*) https://exchange.siegnetz.de/ecp$1 [R,L]
RewriteRule ^/Microsoft-Server-ActiveSync(.*) https://exchange.siegnetz.de/Microsoft-Server-ActiveSync$1 [R,L]

# Kann z.B für die Ablage von Root-CA's verwendet werden 
DocumentRoot /var/www/exchange.siegnetz.de/web
 
<Directory />
    Order deny,allow
    Deny from all
</Directory>
 
<Directory /var/www/exchange.siegnetz.de/web>
    DirectoryIndex index.php index.html
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>
 
<Proxy *>
        Order deny,allow
        Allow from all
</Proxy>
 
</VirtualHost>
  
<VirtualHost 10.1.1.1:443>
 
ServerName exchange.siegnetz.de
ServerAlias autodiscover.siegnetz.de
 
ServerAdmin postmaster@siegnetz.de
 
ErrorLog /var/log/apache2/reverse-proxy-error.log
CustomLog /var/log/apache2/reverse-proxy-access.log combined
 
Header always set X-Frame-Options SAMEORIGIN
 
Header set Server Apache
 
Header unset X-AspNet-Version
Header unset X-OWA-Version
Header unset X-Powered-By
 
RequestHeader unset Expect early
 
#SetEnvIf User-Agent ".*MSIE.*" value BrowserMSIE
Header unset WWW-Authenticate
Header add WWW-Authenticate "Basic realm=exchange.siegnetz.de"
 
ProxyRequests Off
ProxyPreserveHost On
 
SSLProxyEngine On

# Diese Parameter wurden im Lab gesetzt, da wir kein valides Zertifikat eingesetzt haben.
# In einer produktiven Umgebung sollten die Paramater auskommentiert werden.
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
  
# owa
ProxyPass /owa https://10.2.2.2/owa
ProxyPassReverse /owa https://10.2.2.2/owa
ProxyPass /OWA https://10.2.2.2/OWA
ProxyPassReverse /OWA https://10.2.2.2/OWA
ProxyPass /Owa https://10.2.2.2/Owa
ProxyPassReverse /Owa https://10.2.2.2/Owa
 
# Einstellungen um per OWA das Kennwort zu aendern
ProxyPass /iisadmpwd https://10.2.2.2/iisadmpwd
ProxyPassReverse /iisadmpwd https://10.2.2.2/iisadmpwd
 
# ecp
ProxyPass /ecp https://10.2.2.2/ecp
ProxyPassReverse /ecp https://10.2.2.2/ecp
ProxyPass /ECP https://10.2.2.2/ECP
ProxyPassReverse /ECP https://10.2.2.2/ECP
ProxyPass /Ecp https://10.2.2.2/Ecp
ProxyPassReverse /Ecp https://10.2.2.2/Ecp
 
# ews -> Exchange Web Services
ProxyPass /ews https://10.2.2.2/ews
ProxyPassReverse /ews https://10.2.2.2/ews
ProxyPass /EWS https://10.2.2.2/EWS
ProxyPassReverse /EWS https://10.2.2.2/EWS
ProxyPass /Ews https://10.2.2.2/Ews
ProxyPassReverse /Ews https://10.2.2.2/Ews
ProxyPass /exchange https://10.2.2.2/exchange
ProxyPassReverse /exchange https://10.2.2.2/exchange
ProxyPass /Exchange https://10.2.2.2/Exchange
ProxyPassReverse /Exchange https://10.2.2.2/Exchange
ProxyPass /exchweb https://10.2.2.2/exchweb
ProxyPassReverse /exchweb https://10.2.2.2/exchweb
ProxyPass /public https://10.2.2.2/public
ProxyPassReverse /public https://10.2.2.2/public
 
# Microsoft-Server-ActiveSync
ProxyPass /Microsoft-Server-ActiveSync https://10.2.2.2/Microsoft-Server-ActiveSync connectiontimeout=600
ProxyPassReverse /Microsoft-Server-ActiveSync https://10.2.2.2/Microsoft-Server-ActiveSync
 
# AutoDiscover  -> Autodiscover for non-AD integrated Clients (Mac, eg.)
ProxyPass /autodiscover https://10.2.2.2/autodiscover
ProxyPassReverse /autodiscover https://10.2.2.2/autodiscover
ProxyPass /Autodiscover https://10.2.2.2/Autodiscover
ProxyPassReverse /Autodiscover https://10.2.2.2/Autodiscover
ProxyPass /AutoDiscover https://10.2.2.2/AutoDiscover
ProxyPassReverse /AutoDiscover https://10.2.2.2/AutoDiscover
 
# RPC over http(s) / Outlook Anywhere
OutlookAnywherePassthrough On
ProxyPass /rpc https://10.2.2.2/rpc
ProxyPassReverse /rpc https://10.2.2.2/rpc
 
# Zeichensatz spezifieren fuer Umlaute
AddDefaultCharset ISO-8859-1

# Kann z.B für Ablage von Root-CA's genutzt werden 
DocumentRoot /var/www/exchange.siegnetz.de/web
 
<Directory />
    Order deny,allow
    Deny from all
</Directory>
 
<Directory /var/www>
    DirectoryIndex index.php index.html
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>
 
<Proxy *>
        SetEnv proxy-nokeepalive 1
        SetEnv force-proxy-request-1.0 1
        Order deny,allow
        Allow from all
</Proxy>
 
SSLEngine on
SSLCertificateFile    /etc/ssl/exchange-cert.cert
SSLCertificateKeyFile /etc/ssl/exchange-cert.key
 
BrowserMatch "MSIE [2-6]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 
</VirtualHost>

Seitenfang