Ich werde hier aufführen, wie man einen apache2-Webserver so konfiguriert, dass deren TLS-Zertifikate die Bestnote des Qualys Lab SSL Checkers erreichen.

Zuerst wird SSL und SNI aktiviert. Mittels SNI (Server Name Indication) kann ein Server für mehrere Webseiten TLS-Zertifikate unter der gleichen IP-Adresse hosten. Der Hostname des Servers wird während des TLS-Handshakes in die Client-Hello-Message eingefügt. Das ist z.B. bei Shared Hosts notwendig, da viele Websiten darüber laufen. Dies sollte man also mit folgender Config-Zeilen aktivieren:

<IfModule mod ssl.c>
SSLEngine on
SSLStrictSNIVHostCheck on

Die hier aufgeführte Beispiel Config wurde bei der apache2.4.18 Version getestet. Diese Version unterstützt noch kein TLSv1.3, daher wird aktuell nur TLSv1.2 aktiviert. Die Unterstützung für TLSv1.0 und TLSv1.1 wird ab 2020 aus den Browsern entfernt, daher werden diese Versionen gar nicht erst aktiviert. Außerdem werden die Optionen StrictRequire und StdEnvVars aktiviert, damit die Satisfy Any Direktive keine Einstellungen überschreiben kann und für CGI-Dateien die Umgebungsvariablen zur Verfügung gestellt werden. Das machen folgende Config-Zeilen

SSLProtocol -ALL +TLSv1.2
SSLOptions +StrictRequire
<FilesMatch"\.(cgi|shtml|phtml|php|php5)$">
SSLOptions +StdEnvVars
</FilesMatch>

Als Verschlüsselungsverfahren werden vier als aktuell sehr sicher geltende Verfahren mit Ephemeral Diffie-Hellman Modifikation eingesetzt und so aktiviert:

SSLCipherSuite "ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES128-GCM-SHA256 !RC4 !eNULL !aNULL !MEDIUM !LOW !EXP"

Dann folgen weitere Konfigurationen. SSLSessionTickets werden abgeschaltet, damit Perfect Forward Secrecy möglich ist. SSLCompression wird deaktiviert, weil bei Aktivierung ein möglicher Angriffsvektor entsteht (ssl crime attack). Dann wird SSLHonorCipherOrder aktiviert, damit sich alle Clients an die vorgegebene Reihenfolge der Verschlüsselungsverfahren des Servers halten. Außerdem wird SSLOCSPEnable aktiviert, damit der client certificate chain von einem OCSP validiert werden darf. Zuletzt wird noch SSLUseStapling aktiviert, damit die OCSP Antwort für das Zertifikat in den TSL Handshake integriert wird. Dafür ist ein Cache nötig, der auch noch konfiguriert wird.

SSLSessionTickets off
SSLCompression off
SSLHonorCipherOrder on
SSLOCSPEnable on
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)

Zertifikat und Key müssen natürlich noch bekannt gegeben werden.

<VirtualHost *:433>
SSLCertificateFile /path/to/fullchain.pem
SSLCertificateKeyFile /path/to/key.pem
</VirtualHost>

Dann sendet der Server noch einen Header um HSTS (HTTP Strict Transport Security) zu aktivieren. Dies teilt dem Browser mit, dass für eine vorbestimmte Zeit ausschließlich TLS Verbindungen zu diesem Server verwendet werden sollen.

<IfModule mod_headers.c>
Header always append X-Frame-Options SAMEORIGIN
Header always set Strict-Transport-Security "max-age=31536000;
includeSubDomains"
</IfModule>

Ein paar weitere Hardening-Options sollte man noch vornehmen, auch wenn diese nicht alle zwingend mit TLS zu tun haben. Versionsnummern verbergen und permanent von unverschlüsselt auf verschlüsselt umleiten (Port 80 zu 443).

ServerSignature off
ServerTokens Prod
php_admin_flag expose_php off
<VirtualHost *:80>
Redirect permanent http://domain.tld/ https://domain.tld/
</VirtualHost>
</IfModule mod_ssl.c>

Der TLS Checker von Qualys zeigt außerdem an, dass der Server durch die oben genannten Konfigurationsparameter folgende Funktionen unterstützt:

  • Certificate Transparency
  • Secure Renegotation
  • Forward Secrecy (ROBUST) (wegen ECDHE-Ciphern)

Dadurch erhält man die Bestnote A+.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.