21x9.org

Sichere Mailkommunikation mit mTLS

Categories: [blog]
Tags: [imported]

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.