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