Nützliche OpenSSL-Server Parameter

Useful SSL-Server Parameter

Hi, hier drunter finden sich die SSL Parameter die ich für das Hosten dieser Webseite verwende und auch noch ein paar Alternativen und andere nützliche Dinge.

SSL Konfiguration dieser Seite

Ich verwende aktuell Nginx mit der folgenden Konfiguration. Ich habe diese in einem eigenen File, was ich je SSL Vhost per Include einbinde. Die meisten Parameter sollten mit anderen Webbrowsern identisch oder zumindest ähnlich sein.

ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_dhparam /etc/nginx/dh4096.pem;

add_header Strict-Transport-Security max-age=31536000;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header "Content-Security-Policy" "default-src https://rediske.me:443 'unsafe-eval' 'unsafe-inline' 'self'";
add_header "X-XSS-Protection" "1; mode=block";

Nachfolgend ein paar Parameter erklärt, Hauptsächlich nur warum so, für weitere Informationen sei auf die jeweilige Dokumentation verwiesen.

Grundsätzliche Konfiguration

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Ich erlaube hier nur noch TLS ab Version 1, alles andere benötige ich nicht mehr und ist wegen Sicherheitslücken auch nicht mehr zu empfehlem. Allerdings kann es sein, das bestimmte Appliances oder Embedded Geräte nur SSLv3 sprechen und keine Update verfügbar sind, dann sollte entsprechende SSLv3 ergänzt werden. Der Cipher String muss dann natürlich auch entpsrechend angepasst werden.

Bevorzuge Server Cipher

ssl_prefer_server_ciphers on;

Per Default bestimmt der Client welches die präferierten Cipher sind, damit drehen wir das um.

Cipher String

EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4

Das ist das eigentliche Herz, dieser String sollte in allen Produkten funktionieren die OpenSSL verwenden.

Die Reihenfolge gibt auch an, welche der Server präferiert.

Vorsicht: Diese Konfiguration sperrt zum Beispiel Windows XP mit InternetExplorer 6 aus!

Diffie-Helman Parameter

ssl_dhparam /etc/nginx/dh4096.pem;

Die meisten Webserver/SSL Implementationen kommen mit vorerzeugten Parametern, aber man kann Sie auch selber erzeugen und ist dann nicht von Problemen betroffen, sollten mit den mitgelieferten mal was nicht stimmen.

Der Befehl zum erzeugen:

openssl dhparam -out dh4096.pem 4096

Vorsicht: Das kann sehr sehr lange dauern, je nach verfügbarer Entropie! Sprich ein schneller Prozessor hilft nicht unbedingt.

Strict Transport Security

add_header Strict-Transport-Security max-age=31536000;

Sorgt dafür, dass ein Browser für den Zeitraum der angegeben ist nur SSL mit dem Host spricht, initial kann ein HTTP Zugriff erfolgen, da der Parameter natürlich erst gesetzt wird, wenn eine SSL-Verbindung aufgebaut wurde. Sollte man generell vielleicht nicht so hoch setzen wie ich das hier getan habe.

Hinweis: Es ist bekannt geworden, dass wohl bestimmte Seiten den Header zum Usertracking verwenden, das funktioniert indem man jedem Besucher einen anderen Zeitraum gibt, zusammen mit anderen Parametern ist so ein Tracking recht einfach möglich. Ob die Browser mitlerweile gegemaßnahmen ergreifen, z.B. nur bestimmte Werte tatsächlich setzen und andere ggf. runden, weiß ich leider nicht.

Weitere Header

Diese dienen nur als weitere Sicherung, Erklrärung efolgt später mal.

Nützliche Tests

Qualy Labs

Qualy Labs

Hier kann man seinen Webserver prüfen lassen, manchmal ändern sich die Einstufungen ohne guten Hinweis, aber ansonsten sehr Hilfreich, auch finden sich auf der Seite weitergehende Informationen.

Export Cipher Test

openssl s_client -connect SERVERNAME:465 -cipher EXPORT

Damit kann man prüfen ob ein bestimmter Cipher oder eine Gruppe vom Server unterstützt werden, in diesem Fall die Gruppe EXPORT. Die EXPORT Gruppe ist anfällig und sollte daher nicht verwendet werden.

Weitere Quellen

raymii.org Strong SSL Security on NGINX

links

social