EMail-Konten mit doveadm Syncronisieren / sichern

Postix Logo mit Schriftzug Postfix

Eine möglichst kurze Anleitung zum Syncronisieren von EMail-Konten via doveadm. Diese Anleitung ist speziel für EMail-Konten während eines Umzugs auf einen neuen EMail-Server.

Es muss zuerst sichergestellt sein das von dem neuen Server eine SSH-Verbindung zu dem alten Server mit einem Key hergestellt werden kann.
Aus diesem Grund ändere ich auf dem alten Server die Option PermitRootLogin für den SSH Dienst in der Datei /etc/ssh/sshd_config auf yes.

Anschließend kann ein neuer RSA-Key für die SSH Verbindung angelegt und auf den alten Server kopier werden.:

ssh-keygen -t rsa -C "Key for the historic Server to sync mail"
scp -p .ssh/id_rsa.pub [email protected]:
ssh [email protected]
cat id_rsa.pub >> .ssh/authorized_keys
exit

Um ein Postfach auf dem neuen Server vom alten Server zu synchronisieren kann der Befehl doveadm genutzt werden:

doveadm sync -u [email protected] ssh [email protected] -i ~/.ssh/id_rsa doveadm dsync-server -u [email protected]

Wenn Du die Syncronisation von einigen wenigen Postfächern temporär zu jeder Viertelstunde durchführen möchtest kannst Du diesen Aufruf auch über den folgenden Cronjob erledigen lassen.

*/15 * * * * doveadm sync -u [email protected] ssh [email protected] -i ~/.ssh/id_rsa doveadm dsync-server -u [email protected] >/dev/null 2>&1

Die Syncronisation erfolgt in beide richtungen, wenn eine EMail auf dem alten Server und eine EMail auf dem neuen Server eingeht sind diese beiden EMails nach der Syncronisation auf beiden Servern verfügbar.

Postfix: Zugriff von bestimmten IP-Adressen blockieren

Postix Logo mit Schriftzug Postfix

Es gibt immer wieder EMail-Versender die mir mit ihren Spam EMails gewaltig auf die Nerven gehen. Die Absender geben an, das es sich um einen Newsletter handelt, jedoch bewirkt ein abbestellen des Newsletters nur das noch mehr „Newsletter“ zugestellt werden.

Da diese Newsletter bei mir immer von der gleichen IP-Adresse kommen habe ich mir einen gängigen Weg gesucht die Kommunikation mit dieser Adresse vollständig zu unterbinden.

1. IP-Adresse ermitteln

Im EMail-Header ist die gesuchte IP-Adresse die erste vorkommende IP-Adresse die nicht zum eigenen Server gehört.
In meinem Beispiel-EMail-Header ist es die IP-Adresse 192.0.2.85.
(Keine Sorge, der gesammte EMail-Header ist made up, er sieht nur möglichst echt aus. Die IP-Adressen sind IP-Adressen die laut RFC zu Dokumentationszwecken bestimmt sind.)

Return-Path: <[email protected]ef.de>
Delivered-To: [email protected]
Received: from mail.example.org
by mail.example.org (Dovecot) with LMTP id NfYUAK7XSFviHAAALzVKdg
for <[email protected]>; Fri, 13 Jul 2018 18:47:42 +0200
Received: by mail.example.org (Postfix, from userid 114)
id D79F53FE5E; Fri, 13 Jul 2018 18:47:41 +0200 (CEST)
Authentication-Results: mail.example.org;
dkim=pass (1024-bit key; unprotected) header.d=cadbdcedcbfabdadef.de [email protected] header.b="UKjn3gGF";
dkim-atps=neutral
X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mail.example.org
X-Spam-Level: *
X-Spam-Status: No, score=1.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,
DKIM_VALID_AU,HTML_IMAGE_RATIO_04,HTML_MESSAGE,MIME_HTML_ONLY,URIBL_BLOCKED
autolearn=no autolearn_force=no version=3.4.1
Received: from mta5085.cadbdcedcbfabdadef.com (mta5085.cadbdcedcbfabdadef.com [192.0.2.85])
by mail.example.org (Postfix) with ESMTPS id 669E73FD27
for <[email protected]>; Fri, 13 Jul 2018 18:47:39 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=teneo; d=cadbdcedcbfabdadef.de;
h=MIME-Version:From:To:Reply-To:Date:Subject:Content-Type:Content-Transfer-Encoding:Message-ID; [email protected];
bh=OBg4dbrG8hhFyJR7HMx+3IDg91CCOeaN9fnJCAVA6oE=;
b=UKjn3gGF5j9dxocn0xfFlMVHW+bbvUjere1rI99nga/TVlqu5OQFSOFkwJNUjgklof9Mi/9DIHrf
gafjAml+Onn6z29PSoAid1Rrn+K67B5XxKVk0qrHjSen3jMIf6SPdQRB9rQzvh7uIUAhmyLCVAnC
zbc2RugGh4/eZEvVYu4=
Received: from mta003.example.com (198.51.100.78) by mta5085.cadbdcedcbfabdadef.com id h93bqk1bessq for <[email protected]>; Fri, 13 Jul 2018 18:47:32 +0200 (envelope-from <[email protected]>)
X-ARF: b98b6becf874558246b684f462613228
Feedback-ID: 5283550-b98b6becf874558246b684f462613228:b98b6becf874558246b684f462613228:newsletter:cadbdcedcbfabdadef
MIME-Version: 1.0
From: "cadbdcedcbfabdadef"<[email protected]>
To: [email protected]
Reply-To: [email protected]
Date: 13 Jul 2018 18:47:32 +0200
Subject: Micro-SD-Karten
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
Message-ID: <[email protected]>

2. Datei für den Filter erstellen

Um die Datei zu erzeigen benutze ich den Editor vim. Nach dem starten des Editors mittels folgendem Befehl…:

vi /etc/postfix/access_client

…kann mittels Taste [i] der Eingabemodus gesartet werden.

# IP Adresse und IP-Netze die ich blockiere
192.0.2.85 REJECT

Nach der Eingabe kann mittels Taste [ESC] und folgender Eingabe von :wq die Datei geschlossen und gespeichert werden.

Anschließend die Datei mit postmap kompilieren, so das Postfix direkt etwas mit dem Filter anfangen kann.:

postmap hash:/etc/postfix/access_client

Durch diesen Aufruf wird eine Datei access_client.db im Ordner etc/postfix/ angelegt.

3. Postfix konfiguration anpassen

In der Postfix Konfigurationsdatei main.cf muss unsere Datei jetzt noch der Option smtpd_sender_restrictions hinzugefügt werden.
Herzu prüfen ich mittels postconf welche Parameter aktuell für die Option „smtpd_sender_restrictions“ gesetzt sind.:

sudo postconf -p smtpd_sender_restrictions
smtpd_sender_restrictions =

Entsprechend der Ausgabe sind auf meinem Postfix-Server für die „smtpd_sender_restrictions“ keine Optionen gesetzt.

sudo postconf "smtpd_sender_restrictions = check_client_access hash:/etc/postfix/access_client"

Im Anschluss muss, zur Aktivierung der geänderten Konfiguration, der Postfix-Dienst neu geladen werden.:

service postfix reload

Anschließend werden Die Zustellversuche vom Postfix abgelehnt. In den Logiles wird dies entsprechend mit „Client host rejected: Access denied“ vermerkt

Jul 18 10:21:16 server postfix/smtpd[3304]: connect from mta5085.cadbdcedcbfabdadef.com[192.0.2.85]
Jul 18 10:21:16 server postfix/smtpd[3304]: NOQUEUE: reject: RCPT from mta5085.cadbdcedcbfabdadef.com[192.0.2.85]: 554 5.7.1 : Client host rejected: Access denied; from= to= proto=ESMTP helo=
Jul 18 10:21:16 server postfix/smtpd[3304]: disconnect from mta5085.cadbdcedcbfabdadef.com[192.0.2.85] ehlo=2 starttls=1 mail=1 rcpt=0/1 quit=1 commands=5/6
Jul 18 10:26:39 server postfix/anvil[3305]: statistics: max connection rate 1/60s for (smtpd:192.0.2.85) at Jul 18 10:21:16
Jul 18 10:26:39 server postfix/anvil[3305]: statistics: max connection count 1 for (smtpd:192.0.2.85) at Jul 18 10:21:16

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.

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, maximale größe der EMails festlegen

In Postfix kann die maximale Größe von zu verarbeitenden EMails übder die Konfigurationsvariable „message_size_limit“ festgelegt werden.

Postfix wird alle EMails ablehnen die größer als der festgelegte Wert von „message_size_limit“ ist. Der Vorgabewert von message_size_limit ist 10240000 (nahezu 10 Megabyte).

In der Postfix Konfigurationsdatei wird dieses Limit, zumindest unter debian nicht aufgeführt. Es kann direkt in der Datei /etc/postfix/main.cf, oder mit postconf hinzugefügt werden.

Die aktuelle Einstellung von Postfix kann mit dem folgenden Befehl angezeigt werden:

postconf message_size_limit

Mit der Eingabe von „postconf“, ohne zusätzliche Parameter, wird die gesammte Postfix konfiguration ausgegeben werden. Durch den Zusatz des „message_size_limit“ wird nur diese eine Option ausgegeben. Die ausgabe des obig angegebenen Befehl zeigt die folgende Zeile:

message_size_limit = 10240000

Um den zugewiesenen Wert zu Ändern kann mit der folgenden Eingabe ein abweichender Wert zugewiesen werden. Um herauszufinden kann mit dem folgenden Shellscript eine beliebige anzahl MB in Bytes, die Angabe in der Postconf erfolgt in Bytes, umgerechnet werden.

awk '{$1=$1*1024*1024;printf "%.0f\n",$1}'

Nach der Eingabe auf der Shell zum Beispiel 20 eingeben und Enter drücken, als Ausgabe erfolgt 20971520. (Das Script  im Anschluss mit Strg und C abbrechen) Diesen Wert weisen wir jetzt mit postconf dem message_size_limit zu:

postconf message_size_limit=20971520

Hiermit wird in die letzte Zeile der Datei /etc/postfix/main.cf die Zeichenfolge „message_size_limit=20971520“ angefügt und alle eventuell zuvor in der Dastei vorkommenden Zuweisungen „message_size_limit=“ entfernt.

Im Anschluss muss noch der Dienst Postfix die neue Konfiguration lesen. Dies erfolgt durch die eingabe von:

service postfix reload

Im Anschluss gilt die neue Option und entsprechend größere EMails können angenommen werden.

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 = "" } / [email protected]\.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