Im Rahmen der Neuinstallation eines Servers habe ich mich mal wieder des Themas „Anonymisierung der Client-Headerdaten“ angenommen. Bei Nutzung von Postfix habe ich mich hierbei dessen header_checks-Funktionalität bedient. Die Einstellung basiert mal wieder auf des IPSmail-Howtos (siehe voriger Blogpost).
Ich nutze zusätzlich den sogenannten „Submission“-Dienst auf Port 587. Über diesen Port werden nur Mails von authentifizierten Benutzern versandt. Um ihn zu nutzen, ist in der master.cf dieser Dienst zu aktivieren. Dazu sollte es genügen, die Kommentarzeichen vor dem bereits standardmäßig vorhandenen Dienst zu entfernen. Zusätzlich muss eine zusätzliche Zeile eingefügt werden, die es uns erlaubt, über Submission eingereichte Mails (authentifizierte Nutzer) von denen über Port 25 eingehenden (i.d.R. andere Mailserver) zu unterscheiden. Damit werden dann lediglich die Daten unserer Clients und nicht solche von anderen Mailservern angepasst.
Das Setup in master.cf für submission sollte dann so aussehen:
submission inet n – – – – smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o cleanup_service_name=subcleanup
Die letzte Zeile definiert „subcleanup“ als zu benutzenden Namen für den cleanup-Dienst, wenn Mails über Port 587 eingehen. Dieser Dienst muss nun ebenfalls in der master.cf definiert werden:
subcleanup unix n – – – 0 cleanup
-o header_checks=pcre:/etc/postfix/submission_header_checks
Dieser subcleanup-Dienst beinhaltet nun gegenüber dem regulären cleanup-Dienst einen Verweis auf die header_checks-Datei /etc/postfix/submission_header_checks. Diese Datei kann eine Reihe von regulären Ausdrücken enthalten, die die Header-Einträge bearbeiten.
Als Beispiel hier zunächst, wie bei mir vorher der Mailheader aussah, der von meiner Postfix-Installation hinzugefügt wurde:
Received: from [10.10.1.109] (e182201243.adsl.alicedsl.de [83.2.1.243])
(Authenticated sender: blahblub@meinedomain.com)
by mail.meinedomain.com (Postfix) with ESMTPSA id 17415808C9
for <recipient@gmx.net>; Sun, 16 Dec 2012 17:04:11 +0100 (CET)
(Die Daten habe ich leicht verschleiert…)
Damit das so aussieht, müssen zwei Optionen in der main.cf von Postfix gesetzt sein:
smtpd_sasl_authenticated_header = yes
smtpd_tls_received_header = no
Der Parameter smtpd_sasl_authenticated_header-Parameter fügt die Information „Authenticated sender“ oben hinzu. Der Parameter smtpd_tls_received_header würde, wenn aktiviert, zusätzliche Informationen über die TLS-Parameter hinzufügen. Für die folgenden Schritte ist der Parameter deaktiviert – der folgende reguläre Ausdruck passt sonst nicht.
Über den regulären Ausdruck soll nun nicht einfach die entsprechende Header-Zeile entfernt werden, da dies eventuelle Spamfilter anschlagen lassen könnte und zudem nicht RFC-konform ist. Stattdessen soll die tatsächliche IP-Adresse durch eine anonymisierte ersetzt werden:
/^Received: from [.*?] ([-.[:alnum:]]* [.*?])(s+)(Authenticated sender: ([[:alnum:]]+@[.[:alnum:]]+))(s+)by mail.meinedomain.com (Postfix) with (E?SMTPS?A?) id ([A-Fd]+)(s+)(.*)?/
REPLACE Received: from [127.0.0.1] (localhost [127.0.0.1])${1}(Authenticated sender: authenticated)${3}by mail.meinedomain.com (Postfix) with ${4} id ${5}${6}${7}
Der erste Teil des regulären Ausdrucks – bis vor REPLACE – erkennt nun die oben angegebene Header-Zeile. Der zweite Teil – nach REPLACE – gibt den Ersatztext aus. Teilweise greife ich auf die erkannten Werte aus dem ursprünglichen Header wieder zu (Erkennung durch Nutzung von „()“ im ersten Teil, Zugriff durch ${n} im REPLACE-Teil). So kann bei Bedarf durch Anpassung auch die ursprüngliche IP-Adresse oder der authentifizierte Benutzer wieder eingesetzt werden. Insbesondere greife ich die Zeilenumbrüche aus dem Quell-Header ab, damit die Ersetzung genauso formatiert wird wie das Original.
Die geänderten Header sehen nun so aus:
Received: from [127.0.0.1] (localhost [127.0.0.1])
(Authenticated sender: authenticated)
by mail.meinedomain.com (Postfix) with ESMTPSA id 809F7818C9
for <recipient@gmx.net>; Sun, 16 Dec 2012 17:26:58 +0100 (CET)
Standardmäßig sollte in den Mail-Logs nun ein Eintrag a la „replace: header“ erscheinen. Ebenfalls wirft Postfix dort Fehlermeldungen aus, wenn etwas nicht klappen sollte.