EMail Datenschutz – Mail Header filtern

Vor einigen Tagen fiel mir bei der Untersuchung  des, auch an dieser Stelle behandelten, TLS-Fehlers auf, das die E-Mail Header aller über meinen Server vesandten EMails die folgenden beiden Header-Zeilen enthalten.:

Received: from [192.168.*.*] (ip********.dynamic.kabel-deutschland.de [95.91.*.*])
by server.angststalt.de (Postfix) with ESMTPSA id A64D13FCE1
for <*****@*****.de>; Mon, 26 Mar 2018 21:46:44 +0200 (CEST)
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101
Thunderbird/52.6.0

Ich bin mir, mit Blick auf den 25. Mai 2018 nicht sicher ob eine EMail diese zusätzlichen, nicht für die Erfüllung des Dienstes erforderlichen, Metadaten weiterhin beinhalten darf.
(Lieber Leser, liebe Leserin, wenn Du eine Online-Rechtsberatung erteilen darfst und dich mit der EU-Datenschutz-Grundverordnung auskennst, würde ich mich über einen Kommentar ↓ von Dir sehr freuen!)

Da ich es persönlich nicht mag wenn Daten versteckt vorliegen (in diesem Fall im EMail-Header) die nicht benötigt werden aber dritten unter bestimmten Umstenden helfen können mir zu schaden habe ich mich für die Entfernung der Header-Zeilen entschieden. Auch ein Blick in die RFC5321, und einige eigene Tests, zeigen das diese beiden Header-Zeilen nicht für die Zustellung verwendet werden und somit die Entfernung nicht schadet.

Vorgehen:

1.) Den EMail-Server Prüfen

Mit dem Postfix-Konfigurationsparameter header_checks kann ich die EMails am einen PCRE Filter weitergeben und verändern lassen.
Mit dem Postfix-Konfigurationsparameter smtpd_sasl_authenticated_header Erweitere ich den EMail-Header um einen Eintrag über den zur Authentifizierung am EMail-Server genutzten Benutzernamen.

postconf -n header_checks 2>/dev/null
postconf -n smtpd_sasl_authenticated_header 2>/dev/null

Ich bekomme für beide Konfigurationen eine leere Antwort, daher schaue ich nach den Defaultwerten.:

postconf -d header_checks 2>/dev/null
header_checks =
postconf -d smtpd_sasl_authenticated_header 2>/dev/null
smtpd_sasl_authenticated_header = no

2.) EMail-Server Konfiguration anpassen

Da ich vor habe den Filter über PCRE umzusetzen benötige ich das Debian Paket postfix-pcre, welches die Unterstützung dür die gewünschten Perl Regular Expressions für Postfix mitbringt.:

sudo apt install postfix-pcre
The following NEW packages will be installed:
postfix-pcre
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 320 kB of archives.
After this operation, 373 kB of additional disk space will be used.

Nach dem das Paket installiert ist lege ich auf dem Server eine Datei mit dem Namen „header_checks“, im Postfix Verzeichnis, an. In dieser Datei werden die Filterregeln hinterlegt.:
sudo vi /etc/postfix/header_checks

/^Received: .*\(Authenticated sender:.*/ IGNORE
/^Received: by server\.angststalt\.de .*from userid [0-9]+\)/ IGNORE
/^User-Agent:/ IGNORE

Im Anchluss verlange ich vom Postfix dem Benutzernamen, der zur Anmeldung am EMail-Server verwendet wurde in die Header einzufügen und die Mail Header über meinen Filter zu leiten.:

postconf -e smtpd_sasl_authenticated_header=yes
postconf -e header_checks=pcre:/etc/postfix/header_checks

Nach dem folgenden neustart von Postfix kann ich mir eine Testnachricht senden und die Header prüfen.

service postfix restart

Bei meinem Vergleich des neuen EMail-Headers mit dem EMail-Header einer älteren EMail, die ich mir vor der Einrichtung des Filters gesandt habe, fehlen die von mir zu begin beanstandeten Header Zeilen.

Korrektur für Postfix TLS-Fehler „untrusted issuer“

Postix Logo mit Schriftzug Postfix

Ich konnte mal wieder, beim EMail-Versand von meinem EMail-Server (Postfix) zu GMX einmal wieder keine EMails zustellen. Aus der aktuellen Fehlermeldung, welche in der Mail Delivery Notification erwähnt wird, geht hervor das es einen Zertifikatsfehler gab.

In den Postfix Logfiles erscheint die TLS-Fehlermeldung „untrusted issuer“.:

Mar 27 16:05:12 server postfix/smtp[6752]: certificate verification failed for mx01.emig.gmx.net[212.227.17.5]:25: untrusted issuer /C=DE/O=Deutsche Telekom AG/OU=T-TeleSec Trust Center/CN=Deutsche Telekom Root CA 2
Mar 27 16:05:12 server postfix/smtp[6752]: A602E3FF5C: Server certificate not trusted
Mar 27 16:05:12 server postfix/smtp[6752]: certificate verification failed for mx00.emig.gmx.net[212.227.15.9]:25: untrusted issuer /C=DE/O=Deutsche Telekom AG/OU=T-TeleSec Trust Center/CN=Deutsche Telekom Root CA 2
Mar 27 16:05:12 server postfix/smtp[6752]: A602E3FF5C: to=<********@gmx.de>, relay=mx00.emig.gmx.net[212.227.15.9]:25, delay=1.2, delays=0.12/0.03/1/0, dsn=4.7.5, status=deferred (Server certificate not trusted)

Der Aussteller des Zertzifikats des GMX-EMail Servers war meinem Postfix nicht bekannt.
Das SSL-Zertifikat des GMX EMail Server ist mit dem von der „Deutsche Telekom Root CA 2“ signiert. War über eine Suche im Internet schnell gefunden. Die erste Zeile des Zertifikats ist in der Datei /etc/ssl/certs/ca-certificates.crt enthalten.

Die erste Zeile des Zertifikats der Telekom lautet.: MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc

In meiner Suche konnte ich einfach feststellen das das CA-Zertifikat der Telekom ab der Zeile 1110 in der Datei ca-certificates.crt enthalten ist.:

~]> grep -n MIIDnzCCAoeg /etc/ssl/certs/ca-certificates.crt
1111:MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc

Da in der CA-Datei auf meinem Server das Zertifikat enthalten ist prüfe ich gegen welche CA-Zertifikate Datei mein Postix die Zertifikate der Kommunikationspartner auf Gültigkeit zu prüfen:

postconf -n smtp_tls_CAfile 2>/dev/null
smtp_tls_CAfile =

Ich hatte also versäumt meinem Postfix die aktuell CA Zertifikate Datei bekanntzugeben.
Ich habe mit postconf den CAfile bekannt gegeben.

postconf -e smtp_tls_CAfile=/etc/ssl/certs/ca-certificates.crt

Und anschließend meinen MTA neu gestartet.

service postfix restart

Abschließend werden meine EMails endlich wieder ohne Fehlermeldung auch an den Mailserver von GMX zugestellt.

Mar 27 16:17:44 server spamd[1256]: prefork: child states: II
Mar 27 16:17:45 server postfix/smtp[7300]: 9ACD13FF62: to=<********@gmx.de>, relay=mx01.emig.gmx.net[212.227.17.5]:25, delay=1.2, delays=0.12/0.03/0.79/0.29, dsn=2.0.0, status=sent (250 Requested mail action okay, completed: id=1MvIfx-1ejZeK2V9d-00qsAg)
Mar 27 16:17:45 server postfix/qmgr[7226]: 9ACD13FF62: removed

Postfix Konfiguration main.cf aufräumen

Postix Logo mit Schriftzug Postfix

Leider wird die Postfix konfiguration /etc/postfix/main.cf häufig mit vielen Daten der Defaultkonfiguration „vermüllt“ und wird damit unübersichtlich.

Vorüberlegung: Wir müssen die main.cf also irgendwie Filtern, eine Feste Reihenfolge zu erhalten wäre ein positiver Nebeneffekt da sich die Regeln so besser einpägen.

Mit dem Befehl postconf können wir die aktuell verwendete Postfix Konfiguration ausgeben lassen. In dieser Ausgabe sind alle Konfigurationsparameter enthalten, ob manuell gesetzt oder der Defaultwert, in dieser Ausgabe ist er enthalten.

Mit der Option „-d“ kann man von postconf auch die Defaultkonfiguration verlangen. Das an den Beiden Ausgaben ist, das postconf die Konfiguration Optionen immer in der gleichen Reihenfolge Ausgibt und somit mittels diff die beiden Konfigurationen verglichen werden können.

Nach dem diff der beiden konfigurationen müssen alle Zeilen die sich verändert haben, diese Beginnen mit einem Größer als Zeichen „>“ beibehalten werden und die beiden ersten Zeichen, Das Größer als Zeichen und das Leerzeichen, verworfen werden um eine vollständige und Funktionierende main.cf als Ausgabe zu erhalten.

OLD=$(mktemp); trap 'rm "$OLD"' 0;\
NEW=$(mktemp); trap 'rm "$NEW"' 0;\
/usr/sbin/postconf -d > "$OLD";\
/usr/sbin/postconf > "$NEW";\
diff "$OLD" "$NEW"|\
grep '^>'|\
awk '{print substr($0,3)}';\
rm "$OLD" "$NEW"

Die aus der Ausführung dieses Einzeilers entstandene main.cf Datei kann die alte Konfigurationsdatei bedenkenlos ersetzen.

Nachtrag:

Bei mir wurde der Hostname überraschend nicht mit in die Konfiguration übernommen, es muss nach dem Ersetzen der Konfiguration noch mittels postconf der Hostname in die Konfiguration eingetragen werden.:

postconf myhostname=DNS-Reverse/PRT Record

 

IMAP über die Shell testen

Um einen IMAP Server zu testen ist ein EMail Programm immer nur die zweite Wahl, besser prüfst Du via Telnet oder OpenSSL.

Das IMAP Protokoll ist ein Klartext Protokoll, die Befehle sind Verständliche englischsprachige Wörter wie Beispielsweise Login, List, Select, Fetch, Store und so weiter.

Login in den EMail-Server

Der Zugriff ist unverschlüsslt via Telnet mit dem folgenden Aufruf nutzbar.:

telnet imap.example.com 143

Der verschlüsselte Zugriff via SSL erfolgt mittels ssl-Client openssl.:

openssl s_client -crlf -connect imap.example.com:993

Bei aktuellen IMAP Servern wird immer häufiger der unverschlüsselte Zugriff unterbunden, so das der Verschlüsselte IMAP Zugriff über das Tool OpenSSL die einzig nutzbare der beiden vorgestellten Möglichkeiten darstellt.

Der Login auf dem IMAP-Server erfolgt über den Befehl LOGIN.:

? LOGIN [Benutzername] [Passwort]

Klassischerweise wird als Benutzername die EMail-Adresse selbst verwendet. In einigen Fällen ist der Benutzername auch nur der erste Teil der EMail-Adresse bis zum, und ohne das @-Zeichen. In einigen seltenen Fällen hat der Benutzername eines IMAP-Servers auch keine Gemeinsamkeiten mit der abzufragenden EMail-Adresse. Genauere Informationen zu den Zugangsdaten Deines EMail-Postfachs erhälst Du von dem Betreiber des EMail-Servers.

Die IMAP-Befehle werden durch einen Tag begonnen, ich verwende hier als Tag einfach ein Fragezeichen.
Häufig wird als Tag eine Zahl verwendet oder das Tag enthält eine Zahl, die bei jedem Aufruf erhöht wird. Das Tag wird verwendet da Theoretisch mehrere Befehle gesendet werden können bevor die Antwort auf den vorherigen Befehl empfangen wird und auf diesem Web die Antworten den Befehlen zugeordnet werden können.
Alle IMAP-Befehle sind nicht case-sensitiv, so das diese nicht wie in meinen Beispielen immer groß geschrieben werden müssen.

Abrufen von EMails

Die Ordner im Postfach

Um zu erfahren welche Ordner auf dem EMail-Server anlegegt sind dient der Befehl LIST.

? LIST "" "*"

Als Antwort auf den Befehl LIST erhälst Du eine Liste mit den im Postfach angelegten Ordnern und des Ordner-Trennzeichens. Bei manchen EMail-Servern wird ein Punkt als Trennzeichen verwendet. Die Verwendung des Punktes kann einen Ordner wie Test.Ordner, bei fehlendem Ordner Test, zu einem Unterverzeichnis ohne Verzeichnis in dem das Unterverzeichnis liegt machen. Mozilla Thunderbird und Microsoft Outlook zeigen diesen „imaginären Ordner“ Test dann in Grau an, der Ordner Test kann nicht ausgewählt werden.)

Die EMails in den Ordnern

Die Anzahl der EMails in den einzelnen Ordnern kann durch den Befehl STATUS erfragt werden. Es werden die drei Optionen (MESSAGES) für alle Nachrichten, (RECENT) für nicht als gelesen markierte EMails und (UNSEEN) für noch nicht abgerufene EMails unterstützt.

? STATUS INBOX (MESSAGES)
? STATUS INBOX (RECENT)
? STATUS INBOX (UNSEEN)

Betreten eines Ordners

Ein Ordner kann zum mit EXAMINE zum Lesen oder mit SELECT zum lesen und Schreiben betreten werden.

? EXAMINE INBOX
? SELECT INBOX

Abrufen einer EMail

Es können verschiedene verschiedene Teile einer EMail abgerufen werden. Die beiden wichtigsten FETCH Optionen sind rfc822.text für den Inhalt einer EMail und rfc822.header für die EMail-Header. Es können aber auch die Größe (RFC822.SIZE) oder die FLAGS einer EMail abgefragt werden.

? FETCH 1 rfc822.text
? FETCH 1 rfc822.header
? FETCH 1 RFC822.SIZE
? FETCH 1 FLAGS

Anlegen und löschen eines Ordners

Zum Anlegen eines EMail-Ordners wird der Befehl CREATE verwendet, zum umbenennen RENAME und zum löschen der Befehl DELETE.

? CREATE Test
? RENAME Test temptare
? DELETE temptare

EMail Flags

? STORE 1 -FLAGS \SEEN
? STORE 1 +FLAGS \Answered
? STORE 1 FLAGS \DELETED

Als gelöscht markierte EMails löschen

? EXPUNGE

Idle Status

? IDLE
? DONE

Suchen im Postfach

? SEARCH BODY "Metzger"
? SEARCH SEEN SINCE 1-Jan-2017 NOT FROM "Schmitt" SMALLER 10000 SUBJECT "Blog"
? SORT (SUBJECT) UTF-8 SINCE 1-Mai-2017

Abmelden

? LOGOUT

EMail löschen

? STORE 1:20 flags \Deleted
? EXPUNGE

Die Fähigkeiten des IMAP Servers erfahren

? CAPABILITY

Wikipedia Artikel zum Internet Message Access Protocol
RFC3501 – INTERNET MESSAGE ACCESS PROTOCOL

Die Trinität der Mailserver

Ohne diese werden die Server von anderen EMail Servern im Internet nicht akzeptiert.
Es folgend Fehlermeldungen wie
– 550 inconsistent or no DNS PTR record for IP-ADRESSE
– 550 5.7.1 Sorry, your helo has been denied
– 550 Bad DNS PTR resource record

„A – PTR – EHLO“
Der A-Record einer Subdomain muss auf die IP-Adresse des EMail Servers zeigen.

~$ host example.com
~$ dig -t A example.com

Der PTR (DNS Reverse Eintrag) der IP-Adresse des EMail Servers muss auf diese Subdomain zeigen.

~$ host 1.2.3.4
~$ dig ptr 4.3.2.1.in-addr.arpa

Das EHLO (HELO) des EMail Servers muss die oben genutzte Subdomain zurückgeben.

Bei einer Verbindung via Telnet muss dieser PTR Record im EMail-Banner und in der EHLO Antwort vorhanden sein:

~$ telnet example.com. 25
Trying 1.2.3.4...
Connected to example.com.
Escape character is '^]'.
220 example.com ESMTP MAILServerdienst
ehlo test
250-example.com

Bei meinem EMail Server sieht dies dann wie folgend aus:
Der PTR Record:

~$ dig PTR 163.118.214.85.in-addr.arpa

; <<>> DiG 9.3.4-P1.2 <<>> PTR 163.118.214.85.in-addr.arpa
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27856
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;163.118.214.85.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
163.118.214.85.in-addr.arpa. 1777 IN    PTR     server.angststalt.de.

;; Query time: 1 msec
;; SERVER: 81.169.163.106#53(81.169.163.106)
;; WHEN: Fri Sep  9 11:21:12 2016
;; MSG SIZE  rcvd: 79

Alternativ via host:

~$ host 85.214.118.163
163.118.214.85.in-addr.arpa domain name pointer server.angststalt.de.

Der A-Record:

~$ dig A mail.angststalt.de.

; <<>> DiG 9.3.4-P1.2 <<>> A mail.angststalt.de.
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31184
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mail.angststalt.de.            IN      A

;; ANSWER SECTION:
mail.angststalt.de.     7157    IN      A       85.214.118.163

;; Query time: 1 msec
;; SERVER: 81.169.163.106#53(81.169.163.106)
;; WHEN: Fri Sep  9 11:20:02 2016
;; MSG SIZE  rcvd: 52

und der EHLO Eintrag des EMail Servers:

~$ telnet server.angststalt.de. 25
Trying 85.214.118.163...
Connected to server.angststalt.de.
Escape character is '^]'.
220 server.angststalt.de ESMTP Postfix
ehlo example.com
250-server.angststalt.de
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

 

Postfix Mail-Queue wichtige Befehle

Die gesamte Mail-Queue löschen:

postsuper -d ALL

Alle Mails der Queue anzeigen:

mailq | less

Die entsprechende queue_id merken/kopieren

postsuper -d ID

Alle Emails von oder zu einer Adresse löschen:

mailq | tail +2 | awk 'BEGIN { RS = "" } / user@loteks\.de$/ { print $1 } ' | tr -d '*!' | postsuper -d -

alle Mails auf „hold“ setzen:

postsuper -h ALL

Eine einzelne Mails auf „hold“ setzen:

 postsuper -h ID

Alle Mails im Status „hold“ ausliefern:

postsuper -H ALL

Eine einzelne Mails ausliefern:

postsuper -H ID

Auslieferung erzwingen:

postqueue -f