Für verschiedene Unternehmen und ISPs haben wir in den letzten Tagen die SSL/TLS-Einrichtungen vorgenommen oder verbessert und insb. auch Perfect Forward Secrecy (PFS) eingerichtet, das durch die NSA-Abhöraffäre bekannt geworden ist. Dieses Howto beschreibt die PFS-Einrichtung für Postfix und Dovecot, so daß gut geschützte SSL/TLS-Verbindungen angeboten werden können.
Die NSA-Diskussionen haben aufgerüttelt: Was eigentlich schon seit über einem Jahrzehnt klar war und wovor wenige Rufern in der Wüste (ungehört) gewarnt haben, ist ins Bewußtsein gerückt: Geheimdienste hören im großen Stil, teilweise flächendeckend, Internet Traffic ab. Nur das tatsächliche Ausmaß hat letztenendes überrascht.
Vielen Unternehmen und ISPs ist in den letzten Wochen ins Bewußtsein gerückt, daß Datenverschlüsselung über SSL/TLS überhaupt nötig wird -- nicht wenige auch große Provider haben selbst das bislang nicht genutzt.
Andererseits hat sich in der Wahrnehmung ebenso festgesetzt, daß eine schlechte Verschlüsselung nicht ausreicht und es mit "irgendeinem" SSL/TLS nicht getan ist. Viel mehr noch: Solange damit zu rechnen ist, daß Unternehmen und große ISPs mit den Geheimdiensten kooperieren und ggf. auch Zugriff auf Schlüssel ermöglichen, oder solange damit zu rechnen ist, daß Geheimdienste auf anderem Weg Kenntnis der benutzten Schlüssel erlangen können, ist auch ein Schutz gegen eine nachträgliche Entschlüsselung nötig. Ein heute (unentschlüsselbar) aufgezeichneter Netzwerkverkehr soll nicht in einigen Monaten oder Jahren nachträglich noch entschlüsselt werden können.
Die Lösung dieses Problems heißt "Perfect Forward Secrecy" (PFS) und ist in aktuellen Softwareversionen vorhanden, muß aber oft noch manuell aktiviert werden. Die nachfolgende Anleitung beschreibt den status quo und die nötigen Schritte in aller Kürze.
Perfect Forward Secrecy (PFS) basiert auf der Idee, daß Client und Server ihre Kommunikation über einen zusätzlichen temporären Schlüssel absichern, der wechselt. Da der Verbindungsaufbau so gestrickt ist, daß der Schlüssel selbst gar nicht ausgetauscht werden muß, kann der jeweils benutzte Sitzungsschlüssel selbst auch nicht aufgezeichnet werden. Eine nachträgliche Entschlüsselung einer früher aufgezeichneten Session ist damit nicht mehr möglich.
Grundlage von PFS sind Verfahren nach dem Diffie-Hellmann-Verfahren (DHE), bzw. in der weiterentwickelten (etwas performanteren) Variante Elliptic Curve Diffie Hellmann (ECDHE). Sobald man in seinen Logfiles oder beim Debugging mit openssl diese Kürzel in den verwendeten Ciphern findet, ist PFS aktiv.
Hilfreich sind immer aktuelle Versionen, so wird ECDHE erst ab openssl 1.x unterstützt, was aber mittlerweile gut verbreitet ist.
So richten wir Perfect Forward Secrecy (PFS) bei Dovecot und Postfix ein:
Prüfen Sie, ob Sie Postfix > 2.6 (ideal: > 2.8) und openssl > 0.9 (ideal: > 1.0) haben:
openssl version postconf mail_version
Für Postfix müssen dann zwei Diffie-Hellmann-Schlüssel erzeugt und in die main.cf eingebunden und einige kleine Anpassungen zur besseren Schlüsselauswahl vorgenommen werden. Die Anhebung des tls_loglevels sorgt dafür, daß die verwendeten Ciphers im Logfile auftauchen -- anschließend sollten dort (EC)DHE-Ciphers verzeichnet werden.
Diese Kommandoabfolge kann per Cut & Paste in die eigene Shell übernommen werden:
openssl dhparam -out /etc/postfix/dh_512.pem -2 512 openssl dhparam -out /etc/postfix/dh_2048.pem -2 2048 postconf -e "smtpd_tls_dh1024_param_file = /etc/postfix/dh_2048.pem" postconf -e "smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem" postconf -e "smtpd_tls_eecdh_grade = strong" postconf -e "tls_preempt_cipherlist = yes" postconf -e "smtpd_tls_loglevel = 1" postconf -e "smtp_tls_loglevel = 1" postfix reload
Achtung: Alte openssl-Versionen müssen mit "openssl gendh..." statt "openssl dhparam..." aufgerufen werden:
openssl gendh -out /etc/postfix/dh_512.pem -2 512 openssl gendh -out /etc/postfix/dh_2048.pem -2 2048 postconf -e "smtpd_tls_dh1024_param_file = /etc/postfix/dh_2048.pem" postconf -e "smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem" postconf -e "smtpd_tls_eecdh_grade = strong" postconf -e "tls_preempt_cipherlist = yes" postconf -e "smtpd_tls_loglevel = 1" postconf -e "smtp_tls_loglevel = 1" postfix reload
tls_preempt_cipherlist wird erst ab Postfix 2.8 ausgewertet, wird von vorherigen Versionen aber einfach ignoriert.
Anschließend kann nach DHE oder ECDHE im Mail-Logfile gegreppt werden oder ein manueller Login-Test mit openssl vorgenommen werden (siehe unten).
Dovecot unterstützt ab 2.1.x das normale DHE-Verfahren und ab 2.2.x das performantere ECDHE-Verfahren. Idealerweise ist openssl in einer Version > 1.0 verfügbar.
doveconf | head -n1 openssl version
Dovecot benutzt dann von Hause aus Perfect Forward Secrecy (PFS), was jedoch nicht in den Logfiles verzeichnet ist. Über den Platzhalter "%k" läßt sich das in den Logzeilen ergänzen. Dazu paßt man in /etc/dovecot/conf.d/10-logging.conf an:
login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k"
Anschließend kann nach DHE oder ECDHE im Mail-Logfile gegreppt werden oder ein manueller Login-Test mit openssl vorgenommen werden.
Mit einem klassischen SSL-Verbindungsaufbau über openssl läßt sich leicht testen, ob das eigene System entsprechende DHE- oder ECDHE-Verfahren anbietet.
openssl s_client -starttls smtp -connect mx2.heinlein-support.de:25 openssl s_client -starttls imap -connect imap.heinlein-support.de:143
und im Output ist dann die Cipher-Zeile interessant:
Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384
Leider obliegt es in den meisten Fällen dem Client, welches der angebotenen Schlüsselverfahren er auswählt -- und alte Softwareversionen greifen dabei nicht immer auf DHE-VErfahren zurück. So diskutiert Mike Kuketz in seinem Blog derzeit, was die optimale Reihenfolge der angebotenen Ciphers ist um insb. Apple Mail auf die Sprünge zu helfen.
Wir werden das selbst weiter bei uns im Praxisbetrieb testen und in den nächsten Tagen unseren Blog-Eintrag entsprechend aktualisieren.
Kommentare
19 Antworten zu Perfect Forward Secrecy (PFS) für Postfix und Dovecot einrichten
Vielen Dank - so erzielt man mit wenig Aufwand viel Wirkung! Ein typischer Peer-Tip :-)
Hallo Peer,
wir haben bei einigen Kunden Zarafa im Einsatz. Deren IMAP-Implementation kann meines Wissens kein PFS. Ist es ein Problem, das ganze erstmal nur bei Postfix einzurichten ? Macht das überhaupt Sinn ?
Gruss Peter
Naja, alles, was besser verschlüsselt ist, hilft halt. Und wenn Postfix PFS kann, dann sind auch ausgehende E-Mails besser verschlüsselt. Warum also nicht?
Es gibt ein Problem zwischen Postfix und Debian Exim version bis 4.80-3,
vgl. http://www.postfix.org/announcements/postfix-2.10.2.html und http://cdn.postfix.johnriley.me/mirrors/postfix-release/official/postfi…
In Debian Jessie und Ubuntu 13.10 ist Postfix 2.10.2+ bereits enthalten.
LG,
Raoul
Hallo Raoul, Danke für diesen Hinweis. Diesen Bug hatten wir im Juni/Juli gemeldet und fleißig mit Wietse und Viktor ausdiskutiert; das das nun im aktuellen Release gefixt ist, hatte ich selber noch gar nicht mitbekommen. Sehr schön!
Hallo Peer,
aus dem applied crypto settings pdf:
main.cf:
-----------
# applied crypto settings
smtpd_tls_mandatory_protocols = ! SSLv2 , ! SSLv3
smtpd_tls_mandatory_ciphers = high
tls_high_cipherlist = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
smtpd_tls_eecdh_grade = ultra
master.cf
-------------
submission inet n - n - - smtpd
-o smtp_tls_security_level=encrypt
-o tls_preempt_cipherlist=yes
so ist dann auch beim submission alles lecker.
bis zur Mailserverkonferenz?,
beste grüße
marko
Besten Dank.
Funktioniert bestens auf meinem Debian 7.3 Server (postfix/dovecot). Allerdings hat das bereits ohne die oben gezeigten Zeilen funktioniert: Trusted TLS connection established to mx00.gmx.net[213.165.67.99]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM
-SHA384 (256/256 bits) beim Versand an einen GMX-Empfänger. Wie auch immer, ich werde das sicher beim nächsten Mailserver explizit beachten.
Beim Abholen via Thunderbird (eine aktuelle Version vorausgesetzt) sollte man via about:config TLS v1.2 einschalten: security.tls.version.max=3 und security.tls.version.min=1. Wenn man einen eigenen Server unter Debian 7.x betreibt ist das natürlich kein Problem und kann dann auch fix auf TLS 1.2 (natürlich abhängig vom verwendeten Client) festgenagelt werden. Für die nicht so Glücklichen gilt wohl ausprobieren.
OT: ein aktuelles K9Mail verwendet beim IMAP-Login TLSv1 with cipher RC4-MD5 (128/128 bits), beim Versenden via postfix/submission kann es aber TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits) - immerhin ;) Es gibt angeblich ein aktuelles Developer-Build vom Nov. 2013, das dieses Manko teilweise behebt: http://code.google.com/p/k9mail/downloads/detail?name=k9-4.701-release… und auch dem IMAP-Login eine halbwegs sichere Cipher beschert...
Mir fehlt eine Vorschaufunktion ;)
Torsten
Mi 140211.06:14.
Wieder so ein völlig nutzloser Eintrag. Miemand kann ihn verwenden. muss ich jetzt an einer UNI 1Jahr IT büffeln?
Meine Frage, muss auch der Mail-Empfänger wieder Schlüssel hantieren ?
Grüsse fritz3366
Hi Leute, diese howto hat mir sehr geholfen. Vielen Dank.
Mir ist aufgefallen, dass gmail im header vermerkt, ob und wie die mails verschluesselt empfangen worden sind:
Received: from ....
by mx.google.com with ESMTPS id ...
for
(version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
Wie bekomme ich meinen Postfix dazu?
RTFM kann auch helfen :)
-----------------------------------------
To include information about the protocol and cipher used as well as the client and issuer CommonName into the "Received:" message header, set the smtpd_tls_received_header variable to true. The default is no, as the information is not necessarily authentic. Only information recorded at the final destination is reliable, since the headers may be changed by intermediate servers.
Example:
/etc/postfix/main.cf:
smtpd_tls_received_header = yes
Sie haben vollauf richtig erkannt, daß es sich hier um einen Fachbeitrag für IT-Systemadministratoren handelt. Normale Endanwender haben mit PFS nichts zu tun und administrieren üblicherweise auch keine Server. Insofern würde ich Ihnen empfehlen, mehr als nur ein Jahr IT zu büffeln.
Moin,
ich habe meinen Postfix (2.10.2) nach dieser Anleitung konfiguriert und dann versucht mit OpenSSL (1.0.1e) die Verbindung zu testen.
Ergebnis:
Protocol : TLSv1.1
Cipher : ECDHE-RSA-AES256-SHA
Eigentlich hätte ich jetzt TLSv1.2 erwartet, meine main.cf enthält dazu folgendes:
smtp_tls_mandatory_protocols = TLSv1.2, TLSv1.1, TLSv1, SSLv3, !SSLv2
smtpd_tls_mandatory_protocols = TLSv1.2, TLSv1.1, TLSv1, SSLv3, !SSLv2
Hab ich da was übersehen? Woran kann es liegen, dass Postfix nicht TLSv1.2 spricht?
Viele Grüße,
Thomas
[…] ich auch nicht, aber seit heute spricht mein Postfix brav PFS mit mir. Dank der Anleitung hier: http://www.heinlein-support.de/blog/security/perfect-forward-secrecy-pf… ist mein Mailverkehr nun erstmal wieder NSA-sicher, so hoffe […]
Hallo Peer,
RedHat scheint den PFS-Support auch schon für Dovecot <2.1 implementiert zu haben. Ich habe das ganze hier gerade auf einem CentOS 6.5 mit Dovecot 2.0.9 eingerichtet:
doveconf | head -n1
# 2.0.9: /etc/dovecot/dovecot.conf
openssl s_client -starttls imap -connect imap.example.com:143
SSL-Session:
Protocol : TLSv1.2
Cipher : DHE-RSA-AES256-SHA
Hallo,
wie ist das Zusammenspiel des erzeugten PEM-Zertifkats und einen beglaubigten Zertifikats einer öffentlichen CA. Macht es Sinn das PEM aus der beglaubigten CRT zu erzeugen oder spielt das keine Rollen. Meine Frage begründet sich in einer Zeile im Header.
(using TLSv1.2 with cipher DHE-RSA-AES256-SHA256 (256/256 bits))
(No client certificate requested)
Das "no client ..." läßt mich glauben, dass ein PEM aus einen beglaubigten Zertifikat reibungsloser arbeitet.
Viele Grüße,
Clark
Hallo,
vielen Dank für die tolle Anleitung.
Funktioniert das alles, wenn man nur einen 2048-Bit-DH-Schlüssel einbindet?
Sprich, wenn ich nur den "non export" EDH eingebe, und auf dem 512-Bit "export EDH" verzichte.
Meine CA stellt nämlich keine Schlüssel unter 2048-Bit aus.
Vielen Dank im Voraus.
Markus Pacchali erwähnte, dass auf seinem RedHat System mit Dovecot 2.0.9 schon PFS eingesetzt würde.
Das habe ich nun auch auf meinem System mit Ubuntu 12.04.5 LTS getestet und da scheint es auch schon so zu sein:
<code>...
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : DHE-RSA-AES256-GCM-SHA384
...</code>
Es gab da in der Vergangenheit immer etwas Verwirrung und widersprüchliche Aussagen zu der Frage, ab wann openssl ein PFS unterstützt. Ganz einfach: Auch ältere openssl-Versionen können schon DHE-Ciphers und damit PFS (so auch hier). Aber erst neuere Versionen können das bessere und vor allem performantere ECDHE. Aus diesem Grunde sagt man aus Performancegründen, daß man für PFS (erst) die neueren openssl-Versionen benutzen kann/sollte. Rein technisch gesehen ist das aber so nicht wirklich richtig.
Super Anleitung. Aber irgendwie bekomme ich meinen postfix nicht dazu einen ECDHE Cipher zu verwenden. Egal wie oft ich die Anleitung durchgehe es wird immer "DHE-RSA-CAMELLIA256-SHA" ausgewählt (openssl s_client -starttls smtp -crlf -connect myhost:25). OpenSSL ist 1.0.1e, postfix 2.9.6 (Debian Wheezy). Irgendwelche Ideen?