Direkt zum Inhalt
20.08.2013 - Fachbeitrag

Perfect Forward Secrecy (PFS) für Postfix und Dovecot einrichten

verschluessung e-mail perfect forward secrecy pfsFü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.

 

Perfect Forward Secrecy schützt gegen nachträgliche Entschlüsselung


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.

Diffie-Hellmann-Verfahren bieten PFS


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:

Einrichtung von Perfect Forward Secrecy (PFS) in Postfix


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).

 

Einrichtung von Perfect Forward Secrecy (PFS) in Dovecot


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.

PFS mit openssl debuggen/testen


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

 

Die richtige Schlüsselauswahl bei alten Clients (AppleMail)


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

w-Icon
Werner Flamme
21. August 2013 um 16:25

Vielen Dank - so erzielt man mit wenig Aufwand viel Wirkung! Ein typischer Peer-Tip :-)

p-Icon
Peter Beck
09. October 2013 um 13:12

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

p-Icon
Peer Heinlein
15. October 2013 um 19:26

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?

r-Icon
Raoul Bhatia
20. October 2013 um 20:47

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

p-Icon
Peer Heinlein
20. October 2013 um 22:35

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!

m-Icon
marko weber
17. January 2014 um 08:45

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

t-Icon
Torsten Flammiger
28. January 2014 um 17:57

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

f-Icon
fritz3366
12. February 2014 um 07:16

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

i-Icon
Ingo Schmitt
13. March 2014 um 14:48

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?

i-Icon
Ingo Schmitt
15. March 2014 um 00:22

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

p-Icon
Peer Heinlein
16. March 2014 um 15:31

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.

t-Icon
Thomas
27. March 2014 um 11:51

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

p-Icon
Perfect Forward Secrecy nun auf www.stacktracer.de | stacktracer&#039;s Blog
17. June 2014 um 11:49

[…] 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 […]

m-Icon
Markus Pachali
14. September 2014 um 22:57

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

c-Icon
Clark
23. October 2014 um 15:33

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

c-Icon
Christian
17. November 2014 um 12:52

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.

f-Icon
Frank
24. March 2015 um 12:54

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>

p-Icon
Peer Heinlein
25. March 2015 um 08:08

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.

k-Icon
Karl-Heinz
21. April 2015 um 18:46

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?