Sichere Mailkommunikation mit mTLS
Der Volkswagen-Konzern besteht, wie viele andere Unternehmen auch, auf verschlüsselte E-Mail-Kommunikation. Dies ist mit mTLS und Postfix leicht realisierbar. Hierzu sind jedoch einige Vorbereitungen und Anpassungen an der Postfix-Konfiguration nötig.
Als Zertifikat wird ein StartSSL-Zertifikat verwendet, welches auch für die Domain dieses Blogs genutzt wird.
Die Postfix-Konfiguration erfolgt über /etc/postfix/main.cf
:
# /etc/postfix/main.cf
# TLS parameters
smtpd_tls_cert_file=/etc/postfix/ssl/21x9.crt
smtpd_tls_key_file=/etc/postfix/ssl/21x9.key
smtpd_tls_CAfile=/etc/postfix/ssl/ca-bundle
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_security_level = may
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
smtp_tls_loglevel = 1
smtp_tls_CAfile = /etc/postfix/ssl/ca-certificates.crt
Der Parameter smtp_tls_security_level
legt durch may
fest, dass jeder Server grundsätzlich verschlüsselt kommunizieren darf, es wird aber keine Überprüfung des Zertifikats vergenommen. Volkswagen will hier jedoch eine höhere Sicherheitsstufe. Hierzu wird smtp_tls_policy_maps
verwendet:
# /etc/postfix/tls_policy
example.com secure match=www.example.com ciphers=high
audi.fr encrypt ciphers=high
audi.in encrypt ciphers=high
audi.it encrypt ciphers=high
bentleymotors.com.au encrypt ciphers=high
bentleymotorschina.com encrypt ciphers=high
bugatti.com encrypt ciphers=high
bugatti-auto.com encrypt ciphers=high
bugatti-auto.de encrypt ciphers=high
cert.volkswagen.de encrypt ciphers=high
glaesernemanufaktur.de encrypt ciphers=high
glaeserne-manufaktur.de encrypt ciphers=high
seat.fr encrypt ciphers=high
seat.com.cn encrypt ciphers=high
skoda.co.uk encrypt ciphers=high
skoda.com.au encrypt ciphers=high
skoda.fr encrypt ciphers=high
volkswagen.co.uk encrypt ciphers=high
volkswagen.de encrypt ciphers=high
volkswagen.fr encrypt ciphers=high
volkswagen.it encrypt ciphers=high
volkswagen.pt encrypt ciphers=high
porsche-india.in encrypt ciphers=high
Zunächst wird die E-Mail-Domain angegeben (sofern in den Mailadressen Subdomains verwendet werden kann auch .example.de
definiert werden) für die die folgenden Parameter gesetzt werden. secure
erzwingt unter anderen die Prüfung des Zertifikats (der Zertifikatanbieter (CA) muss hierzu in der Datei unter smtp_tls_CAfile
enthalten sein). match
wird verwendet, sofern der Domainname im Zertifikat vom Domainnamen des Servers abweicht. Abschließend werden noch die erlaubten ciphers
definiert. Für Volkswagen reicht die Verwendung von encrypt
anstelle von secure
aus.
Die tls_policy
muss nun noch über postmap /etc/postfix/tls_policy
aktiviert werden. Anschließend wird der Server über postfix reload
neu gestartet.
Ob das Zertifikat korrekt eingebunden wurde lässt sich mit openssl s_client -connect <SMTP-Relay-Server>:25 -starttls smtp
testen.
Eine erfolgreiche Verbindung muss folgenden Logfileeintrag aufweisen:
# /var/log/mail.log
Verified TLS connection established to mail.example.com[89.1.1.1]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Taucht hingegen nur folgende Meldung auf, funktioniert zwar die grundsätzliche Verschlüsselung, es findet aber keine Zertifikatsprüfung statt:
# /var/log/mail.log
Untrusted TLS connection established to mail.example.com[89.1.1.1]:25: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Sofern statt secure
nur encrypt
in der tls_policy
verwendet wird lautet die Meldung Trusted TLS connection...
. Ist dies nicht der Fall muss meist lediglich noch der CA vertraut werden (indem das entsprechende Zertifikat in smtp_tls_CAfile
hinterlegt wird).
Die Zertifikate der Volkswagen-CA können unter http://certdist.volkswagen.de/pdcert/certdist/DownloadCA heruntergeladen werden (VW-CA-PROC-06 sowie VW-CA-ROOT-04). Sie liegen in einem Binärformat vor (DER
) und müssen daher zur Verwendung in smtp_tls_CAfile
noch umgewandelt werden:
openssl x509 -inform der -in VW-CA-ROOT-04.cer -out VW-CA-ROOT-04.pem
openssl x509 -inform der -in VW-CA-PROC-06.cer -out VW-CA-PROC-06.pem
Die so erzeugten Zertifikate werden dann einfach an die Liste der bereits in smtp_tls_CAfile
enthaltenen Zertifikat angefügt:
cat VW-CA-ROOT-04.pem >> /etc/postfix/ssl/ca-certificates.crt
cat VW-CA-PROC-06.pem >> /etc/postfix/ssl/ca-certificates.crt
Um festzustellen welche CAs derzeit für Postfix als vertrauenswürdig hinterlegt sind kann folgendes Perl-Script verwendet werden:
#!/usr/bin/perl
#
# Splits a certficate file with multiple entries up into
# one certificate perl file
#
# Artistic License
#
# v0.0.1 Nick Burch <nick@tirian.magd.ox.ac.uk>
#
my $filename = shift;
unless($filename) {
die("Usage:\n cert-split.pl <certificate-file>\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");
my $ifile = "";
my $thisfile = "";
while(<INP>) {
$ifile .= $_;
$thisfile .= $_;
if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
print "Found a complete certificate:\n";
print `echo "$thisfile" | openssl x509 -noout -issuer -subject`;
print "\n";
}
}
close INP;
print "Completed\n";
Der Befehl openssl
selbst würde immer nur das jeweils erste Zertifikat auslesen.