TLS 1.3 mit NGINX auf Debian 10 einrichten

von Thomas


Erstellt am 20.11.2019


Glasfaserkabel am Switch

Vorwissen

Nach knapp 10 Jahren ist eine neue Version des Transport Layer Security (TLS) im RFC 8446 standardisiert worden. Wegen diesem Protokoll ist es relativ sicher, dass eine Bestellung in einem Onlineshop bei einem selbst landet und nicht plötzlich bei jemand Unbekanntem in einem anderem Land.

TLS 1.3 vs 1.2

Die Vorteile von der neuen Version sind schnell aufgezeigt:

  • Mehr Sicherheit
  • Geschwindigkeitsvorteil
  • Keine Version Downgrades

Mehr Sicherheit

Die Erfinder der ersten Verschlüsselungsprotokolle kamen auf die Idee, von der eigentlichen Klartextnachricht zunächst den MAC (message authentication code) zu bilden und erst anschließend die Verschlüsselung drüber zu legen. Das stellte sich bereits vor Jahren als Schwachstelle heraus. Mit dem Angriff Padding Oracle ist es möglich die Verbindung zu manipulieren.
TLS 1.3 räumt endgültig auf und zwingt die Authenticated Encryption (AE) zu nutzen. Die Integrität und Verschlüsselung ist somit in einem Schritt gewährleistet.

Geschwindigkeitsvorteil von TLS 1.3

Das Ver- und Entschlüsseln mit AES wird heutzutage sehr nativ unterstützt, was somit keine Bremse ist. Der Verbindungsaufbau erzeugt einiges an Overhead. TLS Version 1.2 hat zwei Roundtrips benötigt. In der neuen Version ist es lediglich noch einen.

TLS Handshake Version 1.2 und Version 1.3

Downgrades verhindern

In der Version 1.3 des TLS wird weitestgehend digital signiert, was Man-in-the-Middle Attacken vom Client verhindern und vorbeugen soll. Es soll nicht mehr möglich sein, das ausgehandelte Kryptoverfahren auf ein knackbares, wie in den Angriffen FREAK und Logjam praktiziert, herunterzubrechen.

TLS 1.3 in NGINX konfigurieren

Mit Debian 10 werden alle Voraussetzungen erfüllt, die benötigt werden um TLS 1.3 zu verwenden. Nginx muss mindestens in der Version 1.14 oder neuer vorliegen. Der Webserver muss mit der Version Openssl 1.1.1 oder neuer kompiliert sein. Das lässt sich einfach mit folgendem Befehl herausfinden:

user@srv ~ # nginx -V
nginx version: nginx/1.14.2
built with OpenSSL 1.1.1c  28 May 2019 (running with OpenSSL 1.1.1d  10 Sep 2019)
TLS SNI support enabled

Wie und in welcher Datei letzten Endes die TLS Konfiguration vorgenommen wird, ist dem Nutzer überlassen. Ich empfehle eine Datei unter /etc/nginx/conf.d/tls.conf hinzuzufügen, um alle TLS Konfigurationen einheitlich zu halten. Die Datei muss anschließend in der /etc/nginx/nginx.conf hinzugefügt werden. Dateien fügt man wie folgt in der conf hinzu:

include /etc/nginx/conf.d/*.conf;

Die eigentliche TLS Konfiguration in der /etc/nginx/conf.d/tls.conf kann wie folgt aussehen:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_dhparam /etc/nginx/dh-certs/dhparam4096.pem;
ssl_ecdh_curve secp384r1; 

Bedeutung:

  • ssl_protocols: Bietet dem Client die möglichen Versions-Protokolle an, die für die Verbindung verwendet werden können.
  • ssl_ciphers: Sind die Algorithmen für die anschließende symmetrische Verschlüsselung. Hier ist darauf zu achten, dass mindestens 256 Bit starke Algorithmen verwendet werden.
  • ssl_prefer_server_ciphers: Sollte der Client die Version TLS 1.0 anfordern, verweigert der Server diese und verweist den Client darauf die in ssl_protocols angegebenen Versionen zu nutzen.
  • ssl_session_cache: Gibt die Größe und Art des Caches an, welcher verwendet werden kann.
  • ssl_session_timeout: Ist eine Zeitspanne, nach der die TLS Parameter erneut werden. Dieser Wert ist per default bereits auf fünf Minuten gesetzt.
  • ssl_dhparam: Spezifiziert eine Datei, welche Diffie Hellman Parameter mitbringt. Die Datei muss explizit erstellt werden.
  • ssl_ecdh_curve: Gibt die Kurve für die ECDHE Ciphers an, welche verwendet werden soll. Aus Sicherheitsgründen sollte hier mindestens secp384r1 verwendet werden.

Erstellung dhparam4096.pem

Um bessere Sicherheit zu gewährleisten erstellen wir Diffie Hellmann Parameter. Wir geben Sie dem Server mit, sodass er sie beim Verbindungsaufbau nutzen kann. Hier ist bei der Erstellung 4096 Bit best Practice. Sie verhindern ein Downgrade der Verbindung gegen den Angriff Logjam .

openssl dhparam -out /etc/nginx/dh-certs/dhparam4096.pem 4096

Weitere Optimierungen

Die Sicherheitsempfehlungen für Webserver ändern sich fast täglich. Es ist nötig, sich immer aktuell zu halten, um einen perfekten Schutz zu gewährleisten. Zusätzlich sollte überlegt werden weitere Sicherheitsmaßnahmen im nginx für TLS zu treffen.
Auf der Webseite von nginx kann überprüft werden, was es für zusätzliche Optionen gibt.

Weitere Tools um seine Verbindung zu testen und zu optimieren sind folgende: