Courier-MTA: Logjam-Attacke umgehen

Courier-MTA: Logjam-Attacke umgehen

Beim Empfang mancher E-Mails meldet der Courier-MTA in der Datei /var/log/mail.info folgenden Fehler:

courieresmtpd: STARTTLS failed: couriertls: accept:
error:1409442F:SSL routines:SSL3_READ_BYTES:
tlsv1 alert insufficient security

Dieser Fehler tritt auf, wenn SMTP mit Verschlüsselung aktiv ist, jedoch die Diffie-Hellman(DH)-Parameter zu "kurz" sind und daher eine sogenannte Logjam-Attacke möglich wird. Erkennt der versendende Mailserver, dass eine Logjam-Attacke möglich ist, kann er die verschlüsselte Übertragung ablehnen.

Bezüglich Debian 8 mit Courier werden derzeit (Juni 2015) standardmäßig 768 bit für die DH-Parameter bei Verwendung von OpenSSL verwendet.

Manche Mailprovider (z. B. googlemail) akzeptieren 768 bit klaglos, anderen Mailprovidern (z. B. web.de) sind 768 bit jedoch zu unsicher für eine verschlüsselte Übetragung. Konsequenterweise müssten diese Anbieter die Übertragung der kompletten E-Mail eigentlich ablehnen (der empfangende Mailserver hat an dieser Stelle bereits signalisiert, dass er eine verschlüsselte Übertragung unterstützt). Statt einer unsicheren verschlüsselten Übertragung überträgt web.de die Daten jedoch vermutlich unverschlüsselt. Zumindest lässt sich bei mir feststellen, dass Mails trotz des genannten Fehlers ankommen. Es gibt jedoch auch anderslautende Erfahrungen, nach denen Mails auf manchen Servern nicht ankommen (mit anderen MTA's bzw. Distributionen).

Diffie-Hellman-Parameter bei einem Courier-Mailserver auf 2048 oder 4096 bit anheben

Wenn man das Programm mkdhparams ausführt, wird eine Datei /etc/courier/dhparams.pem erzeugt, welche DH-Parameter der Länge 768 bit enthält. Da 768 bit manchem Mailprovider zu kurz und damit zu unsicher sind, sollte man sie auf mindestens 1024 bit anheben, um überhaupt E-Mails austauschen zu können. Aus Sicherheitsgründen sollte man mindestens 2048 bit wählen, und auch weil die 1024 bit Mindestanforderung mancher Mailprovider vermutlich bald angehoben werden wird. Empfehlung: Man kann (wie der apache-Webserver) die DH-Parameter so lang wählen wie das Zertifikat lang ist (also z. B. 4096 bit DH-Parameter für ein 4096 bit Zertifikat).

Bisherige Datei löschen:

rm /etc/courier/dhparams.pem

/etc/courier/dhparams.pem mit korrekten Permissions erzeugen (hier noch 768 bit!):

mkdhparams

Überschreiben mit 2048 bit

openssl dhparam -out /etc/courier/dhparams.pem 2048

Überschreiben mit 4096 bit

openssl dhparam -out /etc/courier/dhparams.pem 4096

service courier-mta-ssl restart

Danach eine Mail von web.de auf den eigenen Mailserver schicken und mit

tail -f /var/log/mail.info

und kontrollieren, ob der Fehler nicht mehr erscheint.

Zukünftig muss man aufpassen, dass mkdhparams nicht ausgeführt bzw. keine neue dhparams.pem erzeugt wird: So lange kein Patch zur Verfügung steht, würde mkdhparams die dhparams.pem wieder mit 768 bit erzeugen. Alternativ kann man die Umgebungsvariable BITS, wie in man mkdhparams beschrieben, setzen.

Test auf Verwendung von Diffie-Hellman

Ein Testlauf mit openssl, eingeschränkt auf Diffie-Hellman-Ciphern,

openssl s_client -CApath /etc/ssl/certs/ -starttls smtp -cipher 'DH' -connect mail.example.com:25 | grep Cipher

liefert z. B. die Ausgabe:

New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384

Wobei DHE bedeutet, dass Diffie-Hellman zur Anwendung kommt. Beginnt die Cipher mit DHE (oder ECDHE), dann steht Perfect Forward Secrecy (PFS) zur Verfügung. Die Ausgabe kann abweichen, je nachdem welche Cipher Client und Server aushandeln.

Neben dem (E)SMTP-Port 25 kann man auch den Port 587 testen. Dieser ist für den SMTP-Versand von authentifizierten Benutzern gedacht.

Sofern der Mailserver den Port 465 unterstützt, kann man auch diesen testen. Im Gegensatz zu Port 25 sollte der Mailserver auf Port 465 nur verschlüsselte Verbindungen zulassen (SMTPS).

Weiter kann man pop3s auf Port 995 und imaps auf Port 993 testen:

openssl s_client -CApath /etc/ssl/certs/ -cipher 'DH' -connect mail.example.com:995
openssl s_client -CApath /etc/ssl/certs/ -cipher 'DH' -connect mail.example.com:993

Das Verwenden einer DHE-Cipher ermöglicht den Logjam-Angriff erst. Daher müssen die soeben genannten Ports 25, 587, 465, 995 und 993 nun im Folgenden noch auf sichere DH-Parameter überprüft werden.

Test der Diffie-Hellman-Parameter

Zur Sicherheit sollte man zusätzlich testen, ob die DH-Parameter tatsächlich die gewünschte Länge haben. Mit openssl als Client kann man den Nachrichtenaustausch zwischen Mailserver und Client näher betrachten: Die Option -msg führt dazu, dass openssl einen sogenannten ServerKeyExchange ausgibt.

openssl s_client -CApath /etc/ssl/certs/ -msg -starttls smtp -connect mail.example.com:25

Die Ausgabe enthält Angaben zur Länge der verwendeten DH-Parameter:

<<< TLS 1.2 Handshake [length 060f],
ServerKeyExchange 0c 00 06 0b aa aa aa aa aa aa aa aa aa aa aa aa

Mit 0c für den Nachrichtentyp ServerKeyExchange und darauf folgend 00060b für die Länge in Byte, wobei hexadezimal 0x00060b = 1547 Byte im Dezimalsystem ergibt. Man kann auch einfach von der angezeigten Length die ersten 4 Byte abziehen, also 0x060f - 0x4 = 0x060b = 1547.

Hier einige Test-Ausgaben:

Standardeinstellung für Debian 8 (jessie) ist, Stand Januar 2016, die Verwendung von mkdhparams mit 768 bit Länge. Mit 768 bit Schlüssellänge ergeben sich 0x0002cb = 715 Byte:

mkdhparams 

512 semi-random bytes loaded
Generating DH parameters, 768 bit long safe prime, generator 2
<<< TLS 1.2 Handshake [length 02cf],
ServerKeyExchange 0c 00 02 cb aa aa aa aa aa aa aa aa aa aa aa aa

openssl dhparam -out /etc/courier/dhparams.pem 768

Generating DH parameters, 768 bit long safe prime, generator 2
<<< TLS 1.2 Handshake [length 02cf],
ServerKeyExchange 0c 00 02 cb aa aa aa aa aa aa aa aa aa aa aa aa

Mit 1024 bit Schlüssellänge ergeben sich 0x00030b = 779 Byte:

openssl dhparam -out /etc/courier/dhparams.pem 1024

<<< TLS 1.2 Handshake [length 030f],
ServerKeyExchange 0c 00 03 0b aa aa aa aa aa aa aa aa aa aa aa aa

Mit 2048 bit Schlüssellänge ergeben sich 0x00040b = 1035 Byte:

openssl dhparam -out /etc/courier/dhparams.pem 2048

<<< TLS 1.2 Handshake [length 040f],
ServerKeyExchange 0c 00 04 0b aa aa aa aa aa aa aa aa aa aa aa aa

Mit 4096 bit Schlüssellänge ergeben sich 0x00060b = 1547 Byte:

openssl dhparam -out /etc/courier/dhparams.pem 4096

<<< TLS 1.2 Handshake [length 060f],
ServerKeyExchange 0c 00 06 0b aa aa aa aa aa aa aa aa aa aa aa aa

Ausblick

Für Debian ist bereits ein Patch unterwegs, welches standardmäßig 2048 bit bei der Verwendung von mkdhparams vorsieht. Sobald dieses Patch über Updates ausgerollt wird, kann man die eigenen Anpassungen ggf. wieder herausnehmen.