E-Mail über sicheres LMTP bei Dovecot einliefern

Abstract

Ab Version 2.2.16 unterstützt Dovecots LMTP-Server endlich sicherens LMTP über STARTTLS. Ich zeige wie es geht!

Ab Version 2.2.16 (oder 2.2.15 mit aktuellem Patch) unterstützt Dovecots LMTP-Server endlich STARTTLS. Dovecot kann damit endlich LMTPS anbieten. Wer Wert auf eine verschlüsselte Datenübertragung legt, kann jetzt auch die letzte Wegstrecke einfach absichern.

Bevor ich die STARTTLS-Konfiguration des LMTP-Servers zeige, kurz ein paar Worte wie man sicheres LMTP mit Dovecot bisher machen musste. Vor der LMTPS-Version gab es hier nur zwei Möglichkeiten, die den einen oder anderen Nachteil haben:

SMTP + STARTLS zum Mailstore
Transport über verschlüsseltes SMTP bis zum Server auf dem Dovecot läuft. Dort Einlieferung über einen restriktiv geschützten Dovecot LMTP UNIX-Domain-Socket. Sicher und gut, aber jede Mail wird zweimal auf die Platte geschrieben. Einmal wenn sie vom MTA angenommen wird und das zweite Mal wenn sie an den Dovecot LMTP-Server übergeben wird und der sie dann in die Mailbox schreibt. Auf einem entspannte Mailsystem ist das problemlos machbar. Auf grossen Systemen, dort wo I/O der leistungsbegrenzende Faktor ist, kostet diese Methode nahezu 100% mehr I/O.
SSL-Tunnel
Transport über eine mit stunnel geschützte Strecke zum LMTP-Server. Auch gut, nur wird das System damit komplexer und damit auch fehleranfälliger. In den Headern der E-Mail sieht es ausserdem so aus, als würde die Mail ungeschützt transportiert. Das wirft Fragen auf, die sich im sicherheitsbewußten Umfeld zwischen Unglaube und offener Beschimpfung bewegen.

Mit dem kommenden Release 2.2.16 bietet der Dovecot LMTP-Server nun auch STARTTLS an.

Note

Wer es nicht erwarten kann oder gleich handeln will, zieht sich den Patch von http://hg.dovecot.org/dovecot-2.2/rev/297192cfbd37.

Sobald ein gepatchter Dovecot vorliegt, muss erst einmal normales TLS mit Schlüssel und Zertifikat in ´/etc/dovecot/conf.d/10-ssl.conf` eingerichtet werden. Wir dann der LMTP-listener in 10-master.conf aktiviert, bietet Dovecot nun auch automatisch STARTTLS in der LMTP-Session an:

service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
  mode = 0660
  user = postfix
 }
################
 # Create inet listener only if you can't use the above UNIX socket
 inet_listener lmtp {
   # Avoid making LMTP visible for the entire internet
   address = 127.0.0.1
   port = 24
 }
}
###############

Jetzt können E-Mails an den Dovecot Mailstore über LMTPS eingeliefert werden. Das folgende Beispiel zeigt wie ein lmtps-Service für Postfix eingerichtet wird, der STARTTLS erzwingt. Dazu muss in /etc/postfix/master.cf folgender Abschnitt eingefügt werden:

lmtps     unix  -       -       -       -       -       lmtp
         -o lmtp_use_tls=yes
         -o lmtp_enforce_tls=yes
         -o lmtp_tls_mandatory_protocols=!SSLv2,!SSLv3
         -o lmtp_tls_protocols=!SSLv2,!SSLv3
         -o lmtp_tls_mandatory_ciphers=high
         -o lmtp_tls_ciphers=high
         -o lmtp_send_xforward_command=yes
         -o lmtp_tls_security_level=encrypt
         -o lmtp_tls_note_starttls_offer=yes
         -o lmtp_address_preference=ipv4

In der zentralen Konfigurationsdatei /etc/postfix/main.cf sorgt folgender Eintrag dann dafür, dass E-Mails der virtuellen Domains über den lmtps-Service sicher in den Mailstore geroutet werden:

virtual_transport  = lmtps:inet:mailstore:24

Note

Über die TLS-geschützte Strecke ist damit auch der mailstore sicher angebunden.

Im Log des Mailstore finden sich dann Einträge, die den STARTTLS-gesicherten Transport protokollieren:

2014-11-17T15:58:19.516398+01:00 mail dovecot: lmtp(19281): Connect from 127.0.0.1
2014-11-17T15:58:19.516798+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x10, ret=1: before/accept  initialization
2014-11-17T15:58:19.516808+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: before/accept initialization
2014-11-17T15:58:19.516817+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2002, ret=-1: unknown state
2014-11-17T15:58:19.517092+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2002, ret=-1: unknown state
2014-11-17T15:58:19.517119+01:00 mail dovecot: lmtp(19281): Debug: SSL_get_servername() failed
2014-11-17T15:58:19.517134+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 read client hello A
2014-11-17T15:58:19.517147+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 write server hello A
2014-11-17T15:58:19.517251+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 write certificate A
2014-11-17T15:58:19.522535+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 write key exchange A
2014-11-17T15:58:19.522553+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 write server done A
2014-11-17T15:58:19.522562+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 flush data
2014-11-17T15:58:19.522579+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2002, ret=-1: SSLv3 read client certificate A
2014-11-17T15:58:19.525910+01:00 mail dovecot: message repeated 2 times: [ lmtp(19281): Debug: SSL: where=0x2002, ret=-1: SSLv3 read client certificate A]
2014-11-17T15:58:19.527497+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 read client key exchange A
2014-11-17T15:58:19.527572+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 read finished A
2014-11-17T15:58:19.527596+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 write change cipher spec A
2014-11-17T15:58:19.527614+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 write finished A
2014-11-17T15:58:19.527625+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2001, ret=1: SSLv3 flush data
2014-11-17T15:58:19.527631+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x20, ret=1: SSL negotiation finished successfully
2014-11-17T15:58:19.527648+01:00 mail dovecot: lmtp(19281): Debug: SSL: where=0x2002, ret=1: SSL negotiation finished successfully

Update

Mit Patch http://hg.dovecot.org/dovecot-2.2/rev/1d811ffd1832 sollte dann auch ein Hinweis im Header der E-mail über den sicheren LMTP Transport zu finden sein. Dieser kann z.B. so aussehen:

Return-Path: <user2@...de>
Delivered-To: user1@...de
Received: from mail...de ([1.2.3.4])
       (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
       by mail......de (Dovecot) with LMTP id VBx9LOlLb1QwZwAAx/OdvQ
       for <user1@....de>; Fri, 21 Nov 2014 15:27:53 +0100
Received: by mail......de (Postfix, from userid 0)
       id 3jkg8T49x4zMnpWr; Fri, 21 Nov 2014 15:27:53 +0100 (CET)
Robert Schetterer, 17. November 2014

   dovecot    lmtps    tls