Überarbeitung der Mail-Konfiguration für Ubuntu 20.04
Meine bisherige Konfiguration für den Mail-Service stammt noch ursprünglich aus dem Jahr 2006. Ich habe sie dann mit jedem neuen Server immer nur auf die dann aktuellere Linux-Version angepasst. Dabei entstand zwar immer ein funktionsfähiges System, aber viele Dinge sind nicht mehr einfach nachvollziehbar. Im Jahr 2006 war die Nutzung von virtuellen Mailboxen noch ungewöhnlich, inzwischen ist das nahezu Standard.
Vorbermerkung
Momentan habe ich meinen alten Hetzner-Server nicht im produktiven Einsatz, habe ihn auf Ubuntu 20.04 aktualisiert und bin dabei die einzelnen Komponenten systematisch zu konfigurieren. Ich werde dabei aber nicht alle Altlasten wirklich los werden, immerhin müssen die vorhandenen Mailsysteme aktualisierbar bleiben ohne große Verschiebe-Prozesse.
Für die Aktualisierung des Webservers habe ich einen eigenen Text erstellt, hier gehe ich von einem funktionsfähigen Apache mit virtuellen Servern und einer MySQL-Datenbank aus.
Das Mail-System besitzt folgende Komponenten bzw. Funktionen:
- Postfixadmin zur Verwaltung der virtuellen Benutzer
- Dovecot als POP und IMAP-Server
- Postfix als Mailserver
- rspamd über die Milter-Schnittstelle und
- redis als leichte Datenbank für rspamd
- spf und dkim sollen auch aktiviert sein
- Roundcube als Mailclient
SPF, DKIM und DMARC gegen Spam
Mailserver sind von Natur aus vertrauensselig, was von Spammern ausgenutzt wird. Ich denke, dass mehr als 90% aller versendeten Nachrichten in die Kategorie Spam gehören. Der Mailserver Postfix beherrscht ein von Haus aus ein paar Möglichkeiten den Spam zu verringern:
- Nutzung von RBL Listen in den smtpd_client_restrictions. Für jede eingehende Mail werden dann externe Server wie cbl.abuseat.org befragt, ob sie den sendenden Server kennen. Wenn ja, dann wird die Mail rejected. Damit dieses System effektiv wird, muss man aber mehrere derartige Server parallel nutzen.
- Regeln über den formalen Aufbau einer Mail z.B. in den smtpd_helo_restrictions. Hier kann man mit reject_invalid_helo_hostname erreichen, dass nur Mails von Servern angenommen werden, bei denen der Name nicht korrekt ist.
Für weitergehende Untersuchungen, z.B. auf Viren oder Spam bindet man in der Regel zusätzliche Hilf-Programme ein, in der Regel SpamAssassin oder neuerdings auch rspamd. Diese Programme teilen dem Mailserver mit, wie mit der Mail weiter zu verfahren ist. Dabei taucht das Problem auf, dass eine Mail die der Mailserver angenommen hat auch zugestellt werden muss, sofern sich keinen direkten Schadcode beinhaltet. Normaler Spam muss also zugestellt werden, wenn die Mail nicht frühzeitig als Spam erkannt und daher nicht angenommen wird.
Die Spamfilter klassifizieren jede Mail anhand unterschiedlicher Regeln bzw. Kriterien und vergeben dabei einen Score. Je höher der Score, desto wahrscheinlicher handelt es sich um Spam.
Mit der Nutzung von SPF, DKIM und DMARC möchte ich erreichen, dass der Score meiner Mails auf anderen Servern gesenkt wird und sollte jemand mit einer meiner Domains illegal Mails verschicken, so soll sich deren Score erhöhen. Das ist die Idee hinter diesen Konzepten.
SPF
Das Policy Framework (SPF) dient dazu, die Mail anhand der IP Adresse des sendenden Mailservers zu überprüfen. Dazu wird in einem speziellen Namesereintrag vom Typ TXT festgelegt, welche Server berechtigt sind Mails mit dieser Domain zu verschicken.
Im einfachsten Fall sieht der TXT Eintrag folgendermaßen aus:
v=spf1 a mx -all
Ein
dig -t txt meine-maildomain.de
liefert dann
meine-maildomain.de. 3600 IN TXT "v=spf1 a mx -all"
Damit wird ausgesagt, dass nur Server, die einen A- oder einen MX-Eintrag in dieser Domain besitzen berechtigt sind Mails abzuliefern. Über das -all wird festgelegt, wie zu verfahren ist, wenn sich ein Server meldet, der der Regel nicht entspricht.
- -all : Fail der Server darf nicht senden
- ~all : SoftFail der Server darf eigentlich nicht senden, sei aber großzügig
- ?all : Neutral jeder Sender wird akzeptiert.
Ausführlichere Beschreibung der Syntax unter https://www.spf-record.de/syntax
Ein Vorteil von SPF ist, dass am sendenden Server keinerlei Konfiguration notwendig ist. Der größte Nachteil besteht darin, dass es bei Weiterleitungen Probleme gibt, da dann der sendende Server nicht mehr zum Absender passt.
Domainfactory generiert übrigens automatisch auch einen Catchall Eintrag für SPF.
DKIM
Auch das System Keys Identified Mail (DKIM) dient auch dazu nur bestimmte Server zum Senden zu authentifizieren. Das geschieht, indem jede ausgehende Mail im Header digital signiert wird. Der öffentlichen Schlüssel hierzu ist im Nameserver hinterlegt. Der private Schlüssel muss natürlich geschützt auf dem sendenden Server liegen. Da mehrere Server sendeberechtigt sein können, kann es auch mehrere derartige Schlüssel geben. Deshalb wird zusätzlich ein sog. Selektor mit im Mail-Header hinterlegt, damit der Empfänger den richtigen Schlüssel wählen kann.
dig -t txt 2020._domainkey.meine-maildomain.de
liefert dann
2020._domainkey.meine-maildomain.de. 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClkpAaTMA5GcACTbSfJ1vSGwJyHnv1IVzR4GEu3PMAAIvuYCWPONypEAErZJciY8gK+z3FoPaMdsB+eii4rozlN6Jtfx+Fi/SM0FWV1PvPVI0tkoIXa82lKfJi4hqbWDHXxQYfROEKNFWZtoG/C951MwNOiq34Vk3X0nNoBWfyHwIDAQAB"
In diesem Beispiel ist 2020 der Selector. Damit der Mailclient den richtigen Schlüssel abfragen kann, findet sich in DKIM-Header ein Bereich s=2020.
Weitere Informationen unter https://de.wikipedia.org/wiki/DomainKeys
Ein großer Vorteil von DKIM gegenüber SPF ist, dass Weiterleitungen kein Problem sind. Der versendende Server spielt ja keine Rolle. Ein großer Nachteil ist, dass der Server entsprechend konfiguriert werden muss, damit er die richtigen Header-Zeilen erzeugen kann.
DMARC
Das Konzept Message Authentication, Reporting and Conformance (DMARC) baut auf SPF und DKIM auf. Mit DMARC kann der Absender zusätzlich Empfehlungen geben, auf welche Art der Empfänger mit einer Mail umgeht, die in einem oder beiden Fällen nicht den Anforderungen entspricht.
Es gibt die folgenden Regeln
- p=reject lehnt Mail ab, bei denen die Prüfung fehlgeschlagen ist
- p=quarantine lässt Mail in den Spam-Ordner verschieben, bei denen die Überprüfung fehlgeschlagen ist
- p=none weist den empfangenden Server an Berichte an die Mailadresse zu schicken, die per rua bzw. ruf hinterlegt wurde. Dazu ein Beispiel aus Wikipedia
v=DMARC1;p=quarantine;pct=100;rua=mailto:postmaster@example.org;ruf=mailto:forensik@example.org;adkim=s;aspf=r
Dann ein paar zusätzliche Parameter:
- pct: gibt an, auf wieviel Prozent der Nachrichten die Regel angewandt wird (Standard: 100)
- rua: Mail-Adresse, an die der aggregierte Bericht gesendet werden soll
- ruf: Mail-Adresse, an die der forensische Bericht gesendet werden soll
- fo: Festlegung, in welcher Situation Daten für einen Bericht gesammelt werden sollen:
- 0 (Bericht, wenn SPF+DKIM fehlschlagen)
- 1 (Bericht, wenn SPF oder DKIM fehlschlagen)
- s (Bericht, wenn SPF fehlschlägt)
- d (Bericht, wenn DKIM fehlschlägt)
- adkim: müssen bei DKIM Domain und Subdomain übereinstimmen?
- r (relaxed) ist Standard
- s (strict)
- aspf: müssen bei SPF Domain und Subdomain übereinstimmen?
- r (relaxed) ist Standard
- s (strict)
- ri: Häufigkeit in Sekunden, mit der die Berichte gesendet werden. Standard: 86400 (ein Tag)
Weitere Informationen unter: https://de.wikipedia.org/wiki/DMARC
dig -t txt _dmarc.meine-maildomain.de
liefert hier
_dmarc.meine-maildomain.de. 3599 IN TXT "v=DMARC1; p=reject;"
Hinweis zu dig
Wer auf seinem Rechner nicht über das Programm dig verfügt, der kann die entsprechenden Anfragen über die folgenden Webseiten aufrufen:
Vorbereitungen
Für die folgende Beschreibung wird ein Benutzer vmail (uid 303) und eine Gruppe vmail (gid 303) benutzt. Der Benutzer hat als Homeverzeichnis /var/vmail, wo dann auch die eingehenden Mails liegen.
Da Gruppe und Benutzer nicht vorhanden sind, legt man sie neu an:
groupadd -g 303 vmail
mkdir /var/vmail
chmod a+rxw /var/vmail
useradd -d /var/vmail/ -s /bin/false -u 303 -g 303 vmail
postfixadmin
Mit dem Mail-Verwaltungstool geht es los. Das Tool selber interagiert in keinster Weise mit dem Mailsystem. Alle Änderungen erfolgen nur an und in der Datenbank. Von daher ist es sinnvoll dies als erste Komponente zu installieren.
apt install postfixadmin
Bei der Installation kann man gleich die notwendigen Datenbank-Einstellungen mit anlegen lassen. Bei einem ganz neuen System bietet sich das an. Seit einiger Zeit meckert das Programm beim Starten immer über ein fehlendes Verzeichnis, das können wir gleich korrigieren:
mkdir /usr/share/postfixadmin/templates_c chown www-data.www-data /usr/share/postfixadmin/templates_c
Danach dann
DEBUG INFORMATION: MySQL 3.x / 4.0 functions not available! (php5-mysql installed?) database_type = 'mysql' in config.inc.php, are you using a different database? Please check the documentation and website for more information.
Dazu muss man dann in der Datei /etc/postfixadmin/dbconfig.inc.php die Zeile
$dbtype='mysql';
ändern in
$dbtype='mysqli';
Die gleichen Einstellungen finden sich auch noch einmal in der Datei /etc/dbconfig-common/postfixadmin.conf Aktuell ist bei der Version 3.2 eine kleine Änderung zu beachten, der Alias-Eintrag in der VServer-Konfiguration muss jetzt auf das Unterverzeichnis public zeigen:
Alias /postfixadmin /usr/share/postfixadmin/public
Die entsprechende Einstellung ist zwar in der Datei /etc/apache2/conf-available/postfixadmin.conf schon vorhanden, dann ist PostfixAdmin aber in allen virtuellen Domains vorhanden. Ich habe diese Zeile also dort auskommentiert und füge die Zeile in den virtuellen Server ein in dem ich sie haben möchte.
Beim Aufruf der setup.php gab es immer den Hinweis, dass die Datei config.local.php nicht gefunden werden könnte. Das scheint mir eine Falschinformation zu sein, was man schnell damit überprüfen kann, dass man in dieser Datei in der ersten Zeile
$CONF['configured'] = false;
setzt. Die Einstellung wird dann im setup.php kritisiert. Setzt man das wieder auf true, dann kann es weitergehen. Man muss im Webinterface zuerst ein Setup-Passwort erstellen und in die Konfigurationsdatei eintragen, danach muss man dann noch den Superadmin erstellen.
An der Datei /etc/postfixadmin/config.local.php habe ich nur wenig verändert und das auch hauptsächlich Kosmetik
1 <?php
2 $CONF['configured'] = true;
3
4 // on submission it will be echoed out to you as a hashed value.
5 $CONF['setup_password'] = '7caf48fdc954f6037dcc0a6438358db0:9fdf45d7c3dd759258e8af37d09b361218428af5';
6 $CONF['default_language'] = 'de';
7
8 $CONF['admin_email'] = 'postmaster@meine-maildomain.de';
9 $CONF['page_size'] = '20';
10
11 $CONF['default_aliases'] = array (
12 'abuse' => 'abuse@meine-maildomain.de',
13 'hostmaster' => 'hostmaster@meine-maildomain.de',
14 'postmaster' => 'postmaster@meine-maildomain.de',
15 'webmaster' => 'webmaster@meine-maildomain.de'
16 );
17
18 $CONF['quota'] = 'YES';
19 $CONF['footer_text'] = 'Zurück zu Debacher.de';
20 $CONF['footer_link'] = 'http://debacher.de';
21
22 // Welcome Message
23 // This message is send to every newly created mailbox.
24 // Change the text between EOM.
25 $CONF['welcome_text'] = <<<EOM
26 Herzlich Willkommen,
27
28 zum Debacher E-Mail Postfach.
29
30 Bei Fragen oder Problemen bitte
31 Uwe Debacher ansprechen
32 EOM;
33
34 $CONF['show_undeliverable_exceptions']=array("meine-maildomain.de");
35 $CONF['used_quotas'] = 'YES';
36 $CONF['maxquota'] = '2048';
37 $CONF['domain_quota_default'] = '0';
Dovecot
Eigentlich ist Dovecot nur ein Server für POP3 und Imap. Inzwischen kann dieses Programm deutlich mehr. Die Zugriffe auf die Datenbank mit den virtuellen Usern erfolgt in der Regel über Dovecot. Das geht bis zur Nachrichten-Zustellung in die Postfächer.
apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved dovecot-pop3d dovecot-antispam service dovecot stop
Die Versionsnummer von dovecot kann man abfragen mittels
dovecot --version
/etc/dovecot/local.conf
Ich habe die Konfiguration in einer eigenen Datei /etc/dovecot/local.conf gesammelt: (hervorgehoben die Zeilen mit individueller Konfiguration)
1 ##
2 ## Protokollierung
3 ##
4
5 #mail_debug = yes
6 #auth_debug = yes
7 auth_debug_passwords = yes
8 #auth_verbose = yes
9 auth_verbose_passwords = sha1
10 #verbose_proctitle = yes
11
12 ##
13 ## Grundeinstellungen
14 ##
15
16 first_valid_uid = 303
17 mail_access_groups = postfix
18 mail_privileged_group = vmail
19 mail_uid = vmail
20 mail_gid = vmail
21
22 protocols = imap pop3 lmtp sieve
23
24 # die folgenden Einstellungen sind nicht optimal, da die home-Verzeichnisse so nicht automatisch angelegt werden
25 # geschickter wäre (dann auch dovecot-mysql.conf anpassen):
26 #mail_home = /var/vmail/%d/%n
27 #mail_location = maildir:/var/vmail/%d/%n/mail oder mail_location = maildir:~/Maildir
28
29 mail_location = maildir:/var/vmail/%d/%n
30 mail_home = /var/vmail/%d/%n/home
31
32 mail_plugins = $mail_plugins quota
33
34 disable_plaintext_auth = no
35 auth_mechanisms = plain login
36
37 ##
38 ##TLS Konfiguration
39 ##
40
41 ssl = yes
42 ssl_cert = </etc/letsencrypt/live/meine-maildomain.de/fullchain.pem
43 ssl_key = </etc/letsencrypt/live/meine-maildomain.de/privkey.pem
44 #ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
45 #ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
46
47 # die beiden folgenden Parameter gibt es erst ab dc 2.3 (Ubuntu 20.04)
48 ssl_dh = </etc/dovecot/dh4096.pem
49 ssl_min_protocol = TLSv1.2
50 #ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
51 #ssl_prefer_server_ciphers = no
52
53 ##
54 ##Services
55 ##
56
57 service auth {
58 unix_listener /var/spool/postfix/private/auth {
59 group = postfix
60 mode = 0660
61 user = postfix
62 }
63 }
64
65 service lmtp {
66 unix_listener lmtp {
67 #mode = 0666
68 }
69 unix_listener /var/spool/postfix/private/dovecot-lmtp {
70 #mode = 0666
71 user = postfix
72 group = postfix
73 }
74 }
75
76 service managesieve-login {
77 inet_listener sieve {
78 port = 4190
79 }
80 }
81
82 service quota-warning {
83 executable = script /usr/local/bin/quota-warning.sh
84 user = vmail
85 unix_listener quota-warning {
86 group = vmail
87 mode = 0660
88 user = vmail
89 }
90 }
91
92 service quota-status {
93 executable = quota-status -p postfix
94 inet_listener {
95 # address = 127.0.0.1
96 port = 12340
97 }
98 client_limit = 1
99 }
100 # Hinweis in main.cf: smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:12340, ..
101
102 service dict {
103 unix_listener dict {
104 mode = 0600
105 user = vmail
106 }
107 }
108
109 dict {
110 sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf
111 }
112
113 service imap {
114 executable = imap imap-postlogin
115 }
116
117 service imap-postlogin {
118 executable = script-login /usr/local/bin/postlogin.sh
119 user = vmail
120 unix_listener imap-postlogin {
121 }
122 }
123
124
125 ##
126 ## Protokolle
127 ##
128
129 protocol pop3 {
130 pop3_uidl_format = %08Xu%08Xv
131 mail_max_userip_connections = 5
132 }
133
134 protocol imap {
135 mail_max_userip_connections = 8
136 mail_plugins = $mail_plugins imap_quota imap_sieve
137 }
138
139 protocol lmtp {
140 mail_plugins = $mail_plugins sieve
141 }
142
143 ##
144 ## Client Authentifizierung
145 ##
146
147 passdb {
148 args = /etc/dovecot/dovecot-mysql.conf
149 driver = sql
150 }
151
152 userdb {
153 args = /etc/dovecot/dovecot-mysql.conf
154 driver = sql
155 }
156 ## Hinweis: Datei 10-auth.conf editieren und !include auth-system.conf.ext deaktivieren
157
158 ##
159 ## Postfächer
160 ##
161
162 namespace inbox {
163 inbox = yes
164 mailbox Drafts {
165 auto = subscribe
166 special_use = \Drafts
167 }
168 mailbox Junk {
169 auto = subscribe
170 autoexpunge = 26w
171 special_use = \Junk
172 }
173 mailbox "Junk-E-Mail" {
174 special_use = \Junk
175 autoexpunge = 26w
176 }
177 mailbox "Spam" {
178 special_use = \Junk
179 autoexpunge = 26w
180 }
181 mailbox Sent {
182 auto = subscribe
183 special_use = \Sent
184 }
185 mailbox "Sent Messages" {
186 special_use = \Sent
187 }
188 mailbox Trash {
189 auto = subscribe
190 autoexpunge = 26w
191 special_use = \Trash
192 }
193 mailbox "Gelöschte Elemente" {
194 autoexpunge = 26w
195 special_use = \Trash
196 }
197 mailbox "Papierkorb" {
198 autoexpunge = 26w
199 special_use = \Trash
200 }
201 }
202
203 ##
204 ##Plugins
205 ##
206
207 plugin {
208 sieve = ~/.dovecot.sieve
209 sieve_dir = ~/sieve
210
211 sieve_plugins = sieve_imapsieve sieve_extprograms
212 sieve_before = /var/vmail/sieve/global/spam-global.sieve
213
214 #quota_rule = *:storage=1G
215 #quota_rule2 = Trash:storage=+100M
216
217 quota_grace = 10%%
218
219 quota_warning = storage=66%% quota-warning 66 %u
220 quota_warning2 = storage=80%% quota-warning 80 %u
221 quota_warning3 = storage=95%% quota-warning 95 %u
222 # quota = dict:User Quota::noenforcing:proxy::sqluserquota
223 quota = dict:User Quota::proxy::sqluserquota
224
225 quota_status_success = DUNNO
226 quota_status_nouser = DUNNO
227 quota_status_overquota = "552 5.2.2 Mailbox is over quota / Mailbox ist voll"
228
229 ##Spam lernen
230
231 # From elsewhere to Junk folder
232 imapsieve_mailbox1_name = Junk
233 imapsieve_mailbox1_causes = COPY
234 imapsieve_mailbox1_before = file:/var/vmail/sieve/global/learn-spam.sieve
235
236 # From Junk folder to elsewhere
237 imapsieve_mailbox2_name = *
238 imapsieve_mailbox2_from = Junk
239 imapsieve_mailbox2_causes = COPY
240 imapsieve_mailbox2_before = file:/var/vmail/sieve/global/learn-ham.sieve
241
242 sieve_pipe_bin_dir = /usr/bin
243
244 sieve_global_extensions = +vnd.dovecot.pipe
245 }
Mit der auskommentierten Zeile
# quota = dict:User Quota::noenforcing:proxy::sqluserquota
würde bei einem Postfach, das die Quotas überschritten hat, noch Mail angenommen werden (nonenforcing). Die aktive Zeile bewirkt, dass die Mail dann abgelehnt wird. Dann sollte man aber auch, wie angegeben, die main.cf von Postfix so erweitern, dass er von Dovecot über die Überfüllung des Postfaches informiert werden kann und dann die Annahme weiter Mails selber ablehnt.
Der Teil mit dem Lernen von SPAM und HAM hat mir etwas Probleme bereitet, mit fehlte anfangs das imap_sieve mail_plungin. Leider gibt es keine Fehlermeldungen in den Logdateien. Hilfreich war für mich https://doc.dovecot.org/configuration_manual/howto/antispam_with_sieve/. Wenn es funktioniert kann man das an einem erfolgreichen Aufruf von rspamc mittels
grep "pipe action" /var/log/mail.log
erkennen.
Zusätzlich habe ich die Authentisierung per pam deaktiviert, indem ich im Unterordner conf.d die Datei 10-auth.conf editiert und dort am Ende der Datei die einzig aktive Include-Zeile
!include auth-system.conf.ext
/etc/dovecot/dovecot-mysql.conf
Die in der Konfiguration erwähnte /etc/dovecot/dovecot-mysql.conf
1 # Database driver: mysql, pgsql
2 driver = mysql
3
4 # Currently supported schemes include PLAIN, PLAIN-MD5, DIGEST-MD5, and CRYPT.
5 default_pass_scheme = CRYPT
6
7 # Database options
8 #db_unix_socket = /var/lib/mysql/mysql.sock
9
10 connect = host=/var/run/mysqld/mysqld.sock dbname=postfix user=postfix password=assword
11
12 password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
13 user_query = SELECT \
14 concat('/var/vmail/',maildir,'home/') as home, \
15 concat('maildir:/var/vmail/',maildir) as mail, \
16 303 AS uid, \
17 303 AS gid, \
18 CONCAT('*:bytes=', IF(mailbox.quota = 0, domain.maxquota*1024000, mailbox.quota)) as quota_rule \
19 FROM mailbox, domain WHERE username = '%u' AND mailbox.active = '1' AND domain.domain = '%d' AND domain.active = '1'
20
21 iterate_query = SELECT username as user FROM mailbox WHERE active ='1' ORDER BY domain, username
/usr/local/bin/quota-warning.sh
In der Konfiguration taucht das Plugins quota_warning auf. Dazu gehört das folgende Script:
1 #!/bin/sh
2 PERCENT=$1
3 USER=$2
4 ADMIN="uwe@maine-maildomain.de"
5 FROM="postmaster@maine-maildomain.de"
6
7 msg="From: $FROM
8 To: $USER
9 Bcc: $ADMIN
10 Subject: Quota-Warnung $PERCENT%
11
12 Lieber Nutzer,
13
14 das Postfach $USER ist derzeit zu
15
16 $PERCENT% gefuellt.
17
18 Bitte einige Mails loeschen und dann
19 den Papierkorb leeren!
20
21 Herzlichen Dank
22 Das Mail-System."
23
24 echo "$msg" | /usr/sbin/sendmail -f $FROM "$USER $ADMIN"
25
26 exit 0
Die Auslastung der Quotas kann man sich im PostfixAdmin anschauen oder an der Konsole mittels
doveadm quota get -A
oder statt für alle auch für einen einzelnen Nutzer
doveadm quota get -u user@meine-maildomain.de
Man kann auch die Belegung neu berechnen lassen mittels
doveadm quota recalc -A
oder statt für alle auch für einen einzelnen Nutzer
doveadm quota recalc -u user@meine-maildomain.de
/usr/local/bin/postlogin.sh
Das folgende Script dient dazu, die Verzeichnisse home der einzelnen Mailbenutzer anzulegen. Da das mit dem welcome Plugin nicht funktioniert hat, bin ich auf das Postlogin von Dovecot ausgewichen. Dazu gehört dieses Script:
1 #!/bin/sh
2 local=${USER%%@*}
3 domain=${USER##*@}
4
5 if [ ! -d "/var/vmail/$domain/$local/home" ]; then
6 mkdir /var/vmail/$domain/$local/home
7 fi
8 exec "$@"
Vor dem Dovecot-Neustart dann noch die Diffie-Hellman Parameter für Dovecot generieren
openssl dhparam -out /etc/dovecot/dh4096.pem 4096
das dauert leider etwas.
/etc/dovecot/dovecot-dict-sql-user.conf
Diese Datei dient Dovecot dazu die jeweils aktuellen Quota-Werte an der richtigen Stelle in der MySQL-Datenbank zu speichern. Die erste Map für die Anzahl der Bytes, die zweite Map für die Anzahl der Nachrichten siehe https://wiki.dovecot.org/Quota/Dict .
1 connect = host=/var/run/mysqld/mysqld.sock dbname=postfix user=postfix password=assword
2
3 map {
4 pattern = priv/quota/storage
5 table = quota2
6 username_field = username
7 value_field = bytes
8 }
9
10 map {
11 pattern = priv/quota/messages
12 table = quota2
13 username_field = username
14 value_field = messages
15}
var/vmail/sieve/global/spam-global.sieve
1 require "fileinto";
2
3 if header :contains "X-Spam-Flag" "YES" {
4 fileinto "Junk";
5 }
6
7 if header :is "X-Spam" "Yes" {
8 fileinto "Junk";
9 }
/var/vmail/sieve/global/learn-ham.sieve
1 require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
2
3 if environment :matches "imap.mailbox" "*" {
4 set "mailbox" "${1}";
5 }
6
7 if string "${mailbox}" "Trash" {
8 stop;
9 }
10
11 pipe :copy "rspamc" ["learn_ham"];
/var/vmail/sieve/global/learn-spam.sieve
1 require ["vnd.dovecot.pipe", "copy", "imapsieve"];
2 pipe :copy "rspamc" ["learn_spam"];
Postfix
apt install postfix postfix-mysql postfix-policyd-spf-python alpine service postfix stop
Für die Konfiguration ist es manchmal wichtig zu wissen, welche Versionsnummer das eigene Postfix-Programm hat. Diese Information liefert:
postconf -d mail_version
Die zentrale Konfigurationsdatei ist die master.cf. Hier werden die benötigten Dienste (z.B. smtp, uucp, ...) gestartet und zum Teil auch konfiguriert. Die eigentliche Konfiguration für den smtp Dienst befindet sich dann in der Datei main.cf. Weitere Dienste mit dem gleichen Programm, wie z.B. smtps oder submission übernehmen die dort gemachten Einstellungen, es sei den die Einstellung wird in einer Zeile, die mit " -o" beginnt überschrieben. Etwas ungewöhnlich ist eine Zeile wie -o smtpd_client_restrictions=$mua_client_restrictions, die so nicht fehlerfrei aktivierbar ist. Der rechte Teil ist nämlich quasi eine Variable, die in der main.cf mit Inhalt gefüllt werden muss.
/etc/postfix/master.cf
1 #
2 # Postfix master process configuration file. For details on the format
3 # of the file, see the master(5) manual page (command: "man 5 master" or
4 # on-line: http://www.postfix.org/master.5.html).
5 #
6 # Do not forget to execute "postfix reload" after editing this file.
7 #
8 # ==========================================================================
9 # service type private unpriv chroot wakeup maxproc command + args
10 # (yes) (yes) (no) (never) (100)
11 # ==========================================================================
12 smtp inet n - y - - smtpd
13 #smtp inet n - y - 1 postscreen
14 #smtpd pass - - y - - smtpd
15 #dnsblog unix - - y - 0 dnsblog
16 #tlsproxy unix - - y - 0 tlsproxy
17 submission inet n - y - - smtpd
18 -o syslog_name=postfix/submission
19 -o smtpd_tls_security_level=encrypt
20 -o smtpd_sasl_auth_enable=yes
21 # -o smtpd_tls_auth_only=yes
22 # -o smtpd_reject_unlisted_recipient=no
23 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
24 # -o smtpd_helo_restrictions=$mua_helo_restrictions
25 -o smtpd_sender_restrictions=reject_non_fqdn_sender,permit_sasl_authenticated,reject
26 # -o smtpd_recipient_restrictions=
27 -o smtpd_relay_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
28 # -o milter_macro_daemon_name=ORIGINATING
29 smtps inet n - y - - smtpd
30 -o syslog_name=postfix/smtps
31 -o smtpd_tls_wrappermode=yes
32 -o smtpd_sasl_auth_enable=yes
33 # -o smtpd_reject_unlisted_recipient=no
34 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
35 # -o smtpd_helo_restrictions=$mua_helo_restrictions
36 -o smtpd_sender_restrictions=reject_non_fqdn_sender,permit_sasl_authenticated,reject
37 # -o smtpd_recipient_restrictions=
38 -o smtpd_relay_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
39 # -o milter_macro_daemon_name=ORIGINATING
40 #628 inet n - y - - qmqpd
41 pickup unix n - y 60 1 pickup
42 cleanup unix n - y - 0 cleanup
43 qmgr unix n - n 300 1 qmgr
44 #qmgr unix n - n 300 1 oqmgr
45 tlsmgr unix - - y 1000? 1 tlsmgr
46 rewrite unix - - y - - trivial-rewrite
47 bounce unix - - y - 0 bounce
48 defer unix - - y - 0 bounce
49 trace unix - - y - 0 bounce
50 verify unix - - y - 1 verify
51 flush unix n - y 1000? 0 flush
52 proxymap unix - - n - - proxymap
53 proxywrite unix - - n - 1 proxymap
54 smtp unix - - y - - smtp
55 relay unix - - y - - smtp
56 -o syslog_name=postfix/$service_name
57 # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
58 showq unix n - y - - showq
59 error unix - - y - - error
60 retry unix - - y - - error
61 discard unix - - y - - discard
62 local unix - n n - - local
63 virtual unix - n n - - virtual
64 lmtp unix - - y - - lmtp
65 anvil unix - - y - 1 anvil
66 scache unix - - y - 1 scache
67 postlog unix-dgram n - n - 1 postlogd
68 #
69 # ====================================================================
70 # Interfaces to non-Postfix software. Be sure to examine the manual
71 # pages of the non-Postfix software to find out what options it wants.
72 #
73 # Many of the following services use the Postfix pipe(8) delivery
74 # agent. See the pipe(8) man page for information about ${recipient}
75 # and other message envelope options.
76 # ====================================================================
77 #
78 # maildrop. See the Postfix MAILDROP_README file for details.
79 # Also specify in main.cf: maildrop_destination_recipient_limit=1
80 #
81 maildrop unix - n n - - pipe
82 flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
83 #
84 # ====================================================================
85 #
86 # Recent Cyrus versions can use the existing "lmtp" master.cf entry.
87 #
88 # Specify in cyrus.conf:
89 # lmtp cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
90 #
91 # Specify in main.cf one or more of the following:
92 # mailbox_transport = lmtp:inet:localhost
93 # virtual_transport = lmtp:inet:localhost
94 #
95 # ====================================================================
96 #
97 # Cyrus 2.1.5 (Amos Gouaux)
98 # Also specify in main.cf: cyrus_destination_recipient_limit=1
99 #
100 #cyrus unix - n n - - pipe
101 # user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
102 #
103 # ====================================================================
104 # Old example of delivery via Cyrus.
105 #
106 #old-cyrus unix - n n - - pipe
107 # flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
108 #
109 # ====================================================================
110 #
111 # See the Postfix UUCP_README file for configuration details.
112 #
113 #uucp unix - n n - - pipe
114 # flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
115 #
116 # Other external delivery methods.
117 #
118 ifmail unix - n n - - pipe
119 flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
120 bsmtp unix - n n - - pipe
121 flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
122 scalemail-backend unix - n n - 2 pipe
123 flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
124 #mailman unix - n n - - pipe
125 # flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
126 # ${nexthop} ${user}
127
128 # ==========================================================================
129 # service type private unpriv chroot wakeup maxproc command + args
130 # (yes) (yes) (yes) (never) (100)
131 # ==========================================================================
132 # Added using postfix-add-policy script:
133 policy-spf unix - n n - 0 spawn
134 user=nobody argv=/usr/bin/policyd-spf
/etc/postfix/main.cf
(die einzelnen Parameter sind in http://www.postfix.org/postconf.5.html dokumentiert)
1 # See /usr/share/postfix/main.cf.dist for a commented, more complete version
2
3 ##
4 ##Netzwerk und Namen
5 ##
6 myorigin = /etc/mailname
7 append_dot_mydomain = no
8 masquerade_domains = meine-maildomain.de
9 myhostname = mail.meine-maildomain.de
10 mydestination = $myhostname, meine-maildomain.de, localhost, hetzner.meine-maildomain.de
11 #mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
12
13 smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
14 inet_interfaces = all
15 inet_protocols = ipv4
16
17
18 ##
19 # Einstellungen
20 ##
21 compatibility_level = 2
22 smtputf8_enable = no
23 biff = no
24 delay_warning_time = 4h
25 readme_directory = no
26 unknown_address_reject_code = 552
27 unknown_client_reject_code = 551
28 unknown_hostname_reject_code = 550
29 #maps_rbl_reject_code = 451
30 message_strip_characters = \0
31 defer_transports =
32 mailbox_command =
33 mailbox_transport =
34 relayhost =
35 mailbox_size_limit = 0
36 recipient_delimiter = +
37
38
39 ##
40 # TLS parameters
41 ##
42
43 ## ausgehende Verbindungen
44 smtp_tls_security_level=may
45 smtp_tls_mandatory_protocols=!SSLv2, !SSLv3
46 #smtp_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
47 #smtp_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
48 smtp_tls_key_file = /etc/letsencrypt/live/meine-maildomain.de/privkey.pem
49 smtp_tls_cert_file = /etc/letsencrypt/live/meine-maildomain.de/fullchain.pem
50 smtp_tls_loglevel = 1
51 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
52
53 smtp_tls_note_starttls_offer = yes
54
55 ## eingehende Verbindungen
56 smtpd_tls_security_level=may
57 smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3
58 #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
59 #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
60 smtpd_tls_key_file=/etc/letsencrypt/live/meine-maildomain.de/privkey.pem
61 smtpd_tls_cert_file=/etc/letsencrypt/live/meine-maildomain.de/fullchain.pem
62 smtpd_tls_loglevel = 1
63 smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
64
65 smtpd_tls_received_header = yes
66 smtpd_tls_session_cache_timeout = 3600s
67 smtpd_tls_dh1024_param_file = /etc/postfix/dh2048.pem
68 smtpd_delay_reject = yes
69 smtpd_helo_required = yes
70
71 ## SASL für eingehende Verbindungen
72 broken_sasl_auth_clients = yes
73 smtpd_sasl_local_domain =
74 smtpd_sasl_path = private/auth
75 smtpd_sasl_security_options = noanonymous
76 smtpd_sasl_type = dovecot
77 # das kann/sollte hier auf no gesetzt werden, wenn smtps/submission aktiviert sind
78 smtpd_sasl_auth_enable = yes
79 smtp_sasl_auth_enable = no
80 smtp_sasl_security_options =
81 smtp_sasl_password_maps =
82
83
84 ##
85 # Maps und Tabellen
86 ##
87 alias_maps = hash:/etc/aliases
88 alias_database = hash:/etc/aliases
89
90 relay_domains = $mydestination, hash:/etc/postfix/relay
91 #virtual_alias_domains = hash:/etc/postfix/virtual
92 virtual_mailbox_base = /var/vmail/
93
94 virtual_alias_maps =
95 proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
96 proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf
97 proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
98
99 virtual_mailbox_domains =
100 proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
101
102 virtual_mailbox_maps =
103 proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
104 proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
105
106 virtual_transport = lmtp:unix:private/dovecot-lmtp
107 virtual_mailbox_limit = 0
108 virtual_minimum_uid = 303
109 virtual_uid_maps = static:303
110 virtual_gid_maps = static:303
111
112
113 ##
114 # Restrictions
115 ##
116 smtpd_client_restrictions =
117 permit_sasl_authenticated
118 permit_mynetworks
119 reject_rbl_client cbl.abuseat.org
120 reject_rbl_client ix.dnsbl.manitu.net
121 reject_rbl_client bl.spamcop.net
122 reject_rbl_client dul.dnsbl.sorbs.net
123 reject_unknown_client
124
125 smtpd_helo_restrictions =
126 permit_mynetworks
127 reject_invalid_helo_hostname
128
129 smtpd_sender_restrictions =
130 hash:/etc/postfix/access
131 reject_unknown_sender_domain
132
133 smtpd_recipient_restrictions =
134 check_policy_service inet:127.0.0.1:12340
135 permit_sasl_authenticated
136 permit_mynetworks
137 reject_unauth_destination
138
139 smtpd_relay_restrictions =
140 permit_mynetworks
141 permit_sasl_authenticated
142 reject_unauth_destination
143
144 # Block clients that speak too early.
145 smtpd_data_restrictions = reject_unauth_pipelining
146
147 ##
148 # Spamfilter und DKIM-Signaturen via Rspamd
149 ##
150
151 #content_filter = smtp-amavis:[localhost]:10024
152
153 smtpd_milters = inet:localhost:11332
154 non_smtpd_milters = inet:localhost:11332
155 milter_protocol = 6
156 milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
157 milter_default_action = accept
158
159
160 ##
161 # Limits
162 ##
163 mailbox_size_limit = 0
164 message_size_limit = 0
165 strict_8bitmime = no
166 strict_rfc821_envelopes = yes
167
168 smtpd_client_message_rate_limit = 50
169 smtpd_client_connection_rate_limit = 10
170 smtpd_client_recipient_rate_limit = 50
171 smtpd_client_connection_count_limit = 25
172 bounce_queue_lifetime = 3d
173 maximal_queue_lifetime = 3d
174
175 smtpd_recipient_limit = 50
Auch für Postfix Diffie-Hellman-Parameter generieren
Die DH-Parameter für Postfix sind hier nur 2048 Bit stark, um zu älteren Mailservern kompatibel zu bleiben.
openssl dhparam -out /etc/postfix/dh2048.pem 2048
Postfix und MySQL
Damit Postfix MySQL-Tabellen nutzen kann muss man folgende Dateien einrichten:
/etc/postfix/mysql_virtual_alias_maps.cf /etc/postfix/mysql_virtual_domains_maps.cf/etc/postfix/mysql_virtual_mailbox_limit_maps.cfdarum kümmert sich Dovecot /etc/postfix/mysql_virtual_mailbox_maps.cf /etc/postfix/mysql_virtual_alias_domain_maps.cf /etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf /etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
Diese mysql-Dateien im Verzeichnis /etc/postfix muss man anpassen an die eigenen Datenbankeinstellungen. Muster dazu finden sich in der Datei /usr/share/doc/postfixadmin/DOCUMENTS/POSTFIX_CONF.txt.gz. Im Prinzip wird Postfix hier mitgeteilt, wie die Datenbanktabellen abgefragt werden. Benutzername und Passwort müssen hier an die eigenen Einstellungen angepasst werden.
mysql_virtual_alias_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
mysql_virtual_domains_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
mysql_virtual_mailbox_limit_maps.cf
user = postfix password = password hosts = localhost dbname = postfix query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
mysql_virtual_mailbox_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
mysql_virtual_alias_domain_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
mysql_virtual_alias_domain_catchall_maps.cf
# handles catch-all settings of target-domain
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
mysql_virtual_alias_domain_mailbox_maps.cf
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
Firewall anpassen
ufw allow Postfix
ufw allow "Postfix SMTPS"
ufw allow "Postfix Submission"
ufw allow "Dovecot IMAP"
ufw allow "Dovecot Secure IMAP"
ufw allow "Dovecot POP3"
ufw allow "Dovecot Secure POP3"
Vor dem Neustart der Dienste müssen die Datenbanken erzeugt werden:
postmap /etc/postfix/access newaliases
Konfiguration der Clients
Thunderbird als Client-Programm lässt sich problemlos so konfigurieren, dass er mit den beiden verschlüsselten Protokollen arbeiten kann. Beispieleinstellungen ergeben sich aus dem folgenden Bildern.
Zum Einrichten es neuen Postfaches muss man im Idealfall nur die Mailadresse und das Passwort angeben
Thunderbird versucht dann sich vom Mailserver die passenden Einstellungen zu holen:
Voreingestellt ist hier ein Postausgang über Port 25.
Port 25 ist eigentlich für unverschlüsselte Verbindungen zuständig, über STARTTLS handeln die beteiligten Systeme aber eine Verschlüsselung aus, so dass auch hier verschlüsselt übertragen wird. Es gibt aber auch zwei weitere Ports, über die in der Regel nur verschlüsselte Verbindungen angenommen werden.
Wen man die freie Wahl hat, dann sollte man hier SMTPS über Port 465 auswählen.
Postfix und der Kampf gegen Spam
Heutzutage ist deutlich mehr als 90% aller verschickten Mails unerwünschter Spam. Die zentrale Stelle im Kampf gegen den Spam ist natürlich der Mailserver. Postfix hat eine Reihe von Mechanismen eingebaut, die versuchen Spam zu vermeiden:
- RBL, ein System bei dem bestimmte Server gefragt werden, ob ihnen der abliefernde Server als Spamlieferant bekannt ist
- Regeln wie invalid_hostname, hier überprüft Postfix, ob sich der Name, der zu der abliefernden IP-Adresse gehört zur gleichen IP wieder auflösen lässt
- Access-Listen über die z.B. Mailadressen oder ganze Domains blockiert werden können
Wirklich Viren und Spam erkennen kann Postfix aber nicht. Dazu bedarf es eines externen Hilfsprogrammes, wie AmaVis oder rspamd. Diese Programme können allgemein nach zwei unterschiedlichen Konzepten eingebunden werden.
- als Mail-Proxy
- Über die Milter-Schnittstelle
AmaVis wird in der Regel als Proxy eingebunden. Dabei nimmt Postfix auf dem normalen Port z.B. 25 eine Mail an und gibt sie zur Untersuchung an AmaVis weiter. Wenn AmaVis mit der Mail fertig ist, dann gibt er die an einen zweiten Postfix-Prozess weiter, der z.B. auf Port 10025 lauscht. Dieses Verfahren kann man gut in den Header-Zeilen der Mail nachvollziehen, hier taucht der eigene Server nämlich doppelt auf. Nachteil bei dem Proxy-System ist, dass AmaVis die Mail erst sehen kann, wenn sie angenommen wurde. Auch, wenn sie als Spam klassifiziert wurde muss sie zugestellt werden. Konfiguriert wird der zweite Postfix-Daemon über die letzten Zeilen in der /etc/postfix/master.cf
127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o smtpd_delay_reject=no ...
und der Zugriff auf AmaVis erolgt über eine Zeile in der main.cf
content_filter = smtp-amavis:[localhost]:10024
Über die Milter-Schnittstelle kann sich ein externes Programm wir rspamd in den Postfix-Prozess einklinken. Es wird also kein zweiter Postfix-Prozess benötigt. Außerdem ist das externe Programm so in der Lage eine Mail als Spam zu klassifizieren, ohne das sie letztendlich angenommen wurde. Postfix kann dann den Prozess abbrechen und dem sendenden Mailserver dabei eine entsprechende Fehlermeldung zukommen lassen. Damit sollten als Spam gekennzeichnete Mail überhaupt nicht mehr beim Empfänger auftauchen.
Für Amavis gibt es auch ein Milter-Programm, das ist aber schon einige Zeit nicht mehr aktualisiert worden, vor allem in den Ubuntu-Versionen nicht.
rspamd
Die Entwickler des rspamd möchten nicht, dass man die Pakete aus den jeweiligen Distributionen benutzt. Damit wollen sie einerseits erreichen, dass immer die aktuellste Version installiert ist und die Ubuntu-Paketentwickler nicht an der Konfiguration gedreht haben. Daher soll man das Programm immer von der Entwickler-Seite laden, dafür gibt es auch für Ubuntu die passenden Pakete.
apt install wget wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add - echo "deb [arch=amd64] http://rspamd.com/apt-stable/ $(lsb_release -c -s) main" > /etc/apt/sources.list.d/rspamd.list echo "deb-src [arch=amd64] http://rspamd.com/apt-stable/ $(lsb_release -c -s) main" >> /etc/apt/sources.list.d/rspamd.list apt update apt install rspamd clamav clamav-daemon redis-server service rspamd stop
Bei anderen Prozessor-Architekturen als amd64 muss man den Ausdruck [arch=amd64] weglassen oder passend ersetzen.
Für die Anpassung der Konfiguration haben die Entwickler sich ein interessantes System ausgedacht, wie man am Inhalt der Datei /etc/rspamd/rspamd.conf erkennen kann
# For specific modules or configuration you can also modify # '$LOCAL_CONFDIR/local.d/file.conf' - to add your options or rewrite defaults # '$LOCAL_CONFDIR/override.d/file.conf' - to override the defaults
Für jeden der vorhandenen Konfigurationsbereiche gibt es jeweils eine vorbereitete Konfigurationsdatei im Hauptverzeichnis der Konfiguration. Änderungsdateien legt man unter dem gleichen Namen entweder ins Unterverzeichnis:
- local.d oder
- override.d
Einstellungen die im Unterverzeichnis local.d gemacht werden ergänzen die vorhandenen Einstellungen, bei gleichem Bezeichner überschreiben sie auch. Einstellungen im Verzeichnis override.d löschen erst einmal alle Voreinstellungen, nur die neu gemachte Einstellung bleibt gültig.
Die Konfiguration des rspamd erfolgt erst einmal in relativ wenigen Schritten:
cd /etc/rspamd/
dann lässt man sich einen Passwort-Hash erzeugen
rspamadm pw
das Passwort wird im Dialog abgefragt, der Hash, z.B. $2$piqhd3fcs6ncafzfw7qhjehjjwdmaoeo$nkdo6u8ot7ydibt6eipn7m97opzhcb3mcqpq9n64un7bec3mzhzy erscheint dann auf dem Bildschirm und muss in die Datei /etc/rspamd/local.d/worker-controller.inc übertragen werden.
/etc/rspamd/local.d/worker-controller.inc
password = "$2$piqhd3fcs6ncafzfw7qhjehjjwdmaoeo$nkdo6u8ot7ydibt6eipn7m97opzhcb3mcqpq9n64un7bec3mzhzy"; enable_password = "$2$piqhd3fcs6ncafzfw7qhjehjjwdmaoeo$nkdo6u8ot7ydibt6eipn7m97opzhcb3mcqpq9n64un7bec3mzhzy";
Im Proxy-Modus scannt rspamd_proxy die Nachrichten selbst und spricht direkt mit dem MTA unter Verwendung des Milter-Protokolls. Der Vorteil dieses Ansatzes ist seine Einfachheit.
/etc/rspamd/local.d/worker-proxy.inc
bind_socket = "localhost:11332"; milter = yes; timeout = 120s; upstream "local" { default = yes; self_scan = yes; }
In der Regel wird man die Logmeldungen nicht in einer extra-Datei haben wollen, sondern im Syslog, dazu wieder eine kleine Erweiterung:
/etc/rspamd/local.d/local.d/logging.inc
type = "syslog"; level = "warning";
Die Header-Zeilen konfiguriert man
/etc/rspamd/local.d/milter_headers.conf
use = ["x-spamd-bar", "x-spam-level", "authentication-results"]; authenticated_headers = ["authentication-results"];
Das kleine Datenbank-Tool redis soll für Bayes-Filter genutzt werden und Auto-Learning soll aktiv sein:
/etc/rspamd/local.d/classifier-bayes.conf
backend = "redis"; autolearn = true;
Wo findet redis seine Partner
/etc/rspamd/local.d/redis.conf
servers = "127.0.0.1";
Clamav aktivieren, er muss natürlich installiert sein und auf der angegebenen Socket /var/run/clamav/clamd.ctl lauschen
/etc/rspamd/local.d/antivirus.conf
clamav { action = "reject"; scan_mime_parts = true; log_clean = true; symbol = "CLAM_VIRUS"; type = "clamav"; servers = "/var/run/clamav/clamd.ctl"; }
Mail-Subject ändern (Vorsicht, das hat Seiteneffekte und erfordert eine längere Beschreibung).
/etc/rspamd/local.d/actions.conf
subject = "***SPAM*** %s"; rewrite_subject = 6;
Individuelle Black- und White-Listen
/etc/rspamd/local.d/multimap.conf
WHITELIST_IP { type = "ip"; map = "/var/lib/rspamd/whitelist_ip.map"; description = "Lokale ip whitelist -> accept"; action = "accept"; } WHITELIST_FROM { type = "from"; map = "/var/lib/rspamd/whitelist_from.map"; description = "Lokale from Whitelist -> accept"; action = "accept"; } WHITELIST_FROM_DOMAIN { type = "from"; filter = "email:domain"; map = "/var/lib/rspamd/whitelist_from_domain.map"; description = "Lokale from Domain Whitelist -> -6.0"; score = -6.0 } BLACKLIST_IP { type = "ip"; map = "/var/lib/rspamd/blacklist_ip.map"; description = "Lokale ip Blacklist -> reject"; action = "reject"; } BLACKLIST_FROM { type = "from"; map = "/var/lib/rspamd/blacklist_from.map"; description = "Lokale from Blacklist -> reject"; action = "reject"; } BLACKLIST_IP_SCORE { type = "ip"; map = "/var/lib/rspamd/blacklist_ip_score.map"; description = "Lokale Blacklist ip -> +6.0"; score = 6.0; } BLACKLIST_FROM_DOMAIN { type = "from"; filter = "email:domain"; map = "/var/lib/rspamd/blacklist_from_domain.map"; description = "Lokale Blacklist from Domain -> +6.1"; score = 6.1; } BLACKLIST_FROM_DOMAIN_REG { type = "from"; filter = "email:domain"; map = "/var/lib/rspamd/blacklist_from_domain_reg.map"; description = "Lokale Blacklist from Domain Regexp -> +6.2"; score = 6.2; regexp = true; } BLACKLIST_DOMAIN_REJECT_REG { type = "from"; filter = "email:domain"; map = "/var/lib/rspamd/blacklist_domain_reject_reg.map"; description = "Lokale Blacklist Domain Regexp -> reject"; action = "reject"; regexp = true; } BLACKLIST_HOSTNAMES_REG { type = "hostname"; map = "/var/lib/rspamd/blacklist_hostname_reg.map"; regexp = true; description = "Lokale Blacklist hostname Regexp -> +6.3"; score = 6.3; } BLACKLIST_HEADER_FROM { type = "header"; header = "from"; map = "/var/lib/rspamd/blacklist_header_from.map"; filter = "email:addr"; description = "Lokale Blacklist nach FROM header -> reject"; action = "reject"; }
Diese Listen muss man nicht anlegen, das passiert automatisch, wenn man z.B. in der GUI einen Eintrag vornimmt. Statt der action-Zeilen kann man auch score-Zeilen nutzen, um die Entscheidung abzuschwächen:
score=-6 (für die Whitelisten score=6 (für die Blacklisten)
Hinweis: Man darf auf keinen Fall +6 schreiben, dann wird dies vom rspamd als String interpretiert und nicht als Zahl. Hat man eine Liste mit regexp=true, so muss die Map mit einem Zeilenumbruch enden, sonst wird die letzte Zeile nicht berücksichtigt.
Weitere Möglichkeiten und Beispiele finden sich unter https://rspamd.com/doc/modules/multimap.html
HAM/Spam lernen
Der rspamd lernt aus den eingehenden Mail. Man kann ihn aber auch vorab mit den vorhandenen Mails trainieren. Dazu bin ich in mein Postfachverzeichnis /var/vmail/<domain>/<user> gegangen und habe folgendes Kommandos abgesetzt:
find cur/* -type f -exec /usr/bin/rspamc learn_ham {} \; find .Junk/cur/* -type f -exec /usr/bin/rspamc learn_spam {} \;
Falls sehr viele Mails vorhanden sind kann man die Suche einschränken, indem man vor dem Stern noch passende Ziffern anhand der Liste mit angibt. Also z.B.
find cur/16* -type f
DKIM-Signierung
Rspamd kann das Signieren der ausgehenden Mail übernehmen. Dazu muss zunächst ein entsprechender Schlüssel erzeugt und hinterlegt werden.
Hinweis: Meist wird empfohlen eine Schlüssellänge 2048 zu nutzen (-b 2048), der dann aber längere Schlüssel lässt sich bei manchen Nameservern aber nicht speichern.
mkdir /var/lib/rspamd/dkim/ rspamadm dkim_keygen -b 1024 -s 2020 -k /var/lib/rspamd/dkim/2020.key > /var/lib/rspamd/dkim/2020.txt chown -R _rspamd:_rspamd /var/lib/rspamd/dkim chmod 440 /var/lib/rspamd/dkim/*
Den erzeugten Key kann man sich ansehen mittels:
cat /var/lib/rspamd/dkim/2020.txt
Die Zeichenkette 2020 ist der sogenannte Selektor. Damit lässt sich der passende Schlüssel im Zonenfile des Nameservers wiederfinden.
Mich hat ursprünglich irritiert, dass sich die erzeugten Schlüssel an Anfang und Ende kaum unterschieden, ich hatte befürchtet, dass immer der gleiche Schlüssel erzeugt wird. Dazwischen unterscheiden sich die Schlüssel aber auf alle Fälle, so ist der Vergleich bzw. die Zuordnung aber schwierig.
/etc/rspamd/local.d/dkim_signing.conf
path = "/var/lib/rspamd/dkim/$selector.key"; selector = "2020"; ### Erlaube DKIM signing auch für alias sender Adressen allow_username_mismatch = true;
Die gleiche Information wird auch vom ARC-Modul benötigt.
ln -s /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
Das Webinterface von rspamd
Der rspamd stellt ein Webinterface zur Verfügung, welches auf dem Port 11334 des Servers auf Verbindungen wartet. Man hat jetzt drei Möglichkeiten auf dieses Interface zuzugreifen:
- Man gibt Port 11334 in der Firewall frei und benötigt dann das Passwort, welches man bei der Konfiguration des rspamd gesetzt hat, zusätzlich muss man erreichen, dass der Worker auch auf der normalen IP-Adresse lauscht, dazu ergänzt man in der worker-controller.inc nach den Passwörtern noch
bind_socket = "*:11334";
- Ein ssh-Tunnel zum Server ssh -L 8080:localhost:11334 root@meine-maildomain.de -N macht das Webinterface unter Port 8080 des lokalen Rechners verfügbar
- Web-Proxy für den Apache, in einem virtuellen Server ergänzt man:
RewriteEngine On
ProxyRequests Off
<Location /rspamd>
Order allow,deny
Allow from all
</Location>
RewriteRule ^/rspamd$ /rspamd/ [R,L]
RewriteRule ^/rspamd/(.*) http://localhost:11334/$1 [P,L]
Das Proxy-Modul muss dazu installiert sein:
a2enmod proxy a2enmod proxy_http
Damit ist dann nach einem Neustart des Webservers der rspamd über das Verzeichnis /rspamd/ erreichbar.
Warnung: Mit dem Proxy-Modul sollte man sehr vorsichtig sein. Es gibt immer wieder Leute, die versuchen den Server als Forward-Proxy zu nutzen, um verschleiert auf andere Server zugreifen zu können.
Das kann man mit der Einstellung ProxyRequests Off verhindern. Wir brauchen hier einen Reverse-Proxy, der einen internen Dienst (rspamd) über das Webinterface zur Verfügung stellt. Das ist weniger problematisch.
Eine ausführliche Beschreibung habe ich gefunden unter: https://www.netnea.com/cms/apache-tutorial-9-reverse-proxy-einrichten/
Roundcube
Roundcube ist ein sehr beliebter und mächtiger Webmail-Client. Er lässt sich über eine Reihe von Plugins erweitern. Ich nutze gern die Plugins
- sieve, zu Pflegen der entsprechenden Regeln
- Password, zum Ändern des eigenen Passwortes in der Postfix-Datenbank.
Zuerst die Installation:
apt install roundcube roundcube-plugins roundcube-plugins-extra
Das Programm wird standardmäßig im Verzeichnis /var/lib/roundcube/ abgelegt (in Version 1.4.3). Hierbei werden einige Unterverzeichnisse und Dateien an andere Stellen verlinkt
- config -> /etc/roundcube
- program -> /usr/share/roundcube/program
- .htaccess -> /etc/roundcube/htaccess
- logs -> /var/log/roundcube
- robots.txt -> /usr/share/roundcube/robots.txt
Die Plugins finden sich im Verzeichnis /usr/share/roundcube/plugins/, wobei die Konfigurationsdateien, die auf /etc/roundcube/plugins/ verlinkt wurden, jeweils nahezu leer sind. Ein Muster findet sich dann jeweils unter /usr/share/roundcube/plugins/ in der Datei config.inc.php.dist
Also
cp /usr/share/roundcube/plugins/password/config.inc.php.dist /etc/roundcube/plugins/password/config.inc.php cp /usr/share/roundcube/plugins/managesieve/config.inc.php.dist /etc/roundcube/plugins/managesieve/config.inc.php
cp /usr/share/roundcube/plugins/zipdownload/config.inc.php.dist /etc/roundcube/plugins/zipdownload/config.inc.php cp /usr/share/roundcube/plugins/jqueryui/config.inc.php.dist /etc/roundcube/plugins/jqueryui/config.inc.php
Danach sind dann ein paar Dateien zu editieren.
/etc/roundcube/debian-db.php
<?php
##
## database access settings in php format
## automatically generated from /etc/dbconfig-common/roundcube.conf
## by /usr/sbin/dbconfig-generate-include
##
## by default this file is managed via ucf, so you shouldn't have to
## worry about manual changes being silently discarded. *however*,
## you'll probably also want to edit the configuration file mentioned
## above too.
##
$dbuser='roundcube';
$dbpass='assword';
$basepath='';
$dbname='roundcube';
$dbserver='localhost';
$dbport='';
$dbtype='mysql';
/etc/roundcube/plugins/password/config.inc.php ab Zeile 95
95 // SQL Driver options
96 // ------------------
97 // PEAR database DSN for performing the query. By default
98 // Roundcube DB settings are used.
99 $config['password_db_dsn'] = 'mysql://postfix:assword@localhost/postfix';
100
101 // The SQL query used to change the password.
102 // The query can contain the following macros that will be expanded as follows:
103 // %p is replaced with the plaintext new password
104 // %P is replaced with the crypted/hashed new password
105 // according to configured password_method
106 // %o is replaced with the old (current) password
107 // %O is replaced with the crypted/hashed old (current) password
108 // according to configured password_method
109 // %h is replaced with the imap host (from the session info)
110 // %u is replaced with the username (from the session info)
111 // %l is replaced with the local part of the username
112 // (in case the username is an email address)
113 // %d is replaced with the domain part of the username
114 // (in case the username is an email address)
115 // Deprecated macros:
116 // %c is replaced with the crypt version of the new password, MD5 if available
117 // otherwise DES. More hash function can be enabled using the password_crypt_hash
118 // configuration parameter.
119 // %D is replaced with the dovecotpw-crypted version of the new password
120 // %n is replaced with the hashed version of the new password
121 // %q is replaced with the hashed password before the change
122 // Escaping of macros is handled by this module.
123 // Default: "SELECT update_passwd(%c, %u)"
124 $config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';
125
126 // By default the crypt() function which is used to create the %c
127 // parameter uses the md5 algorithm (deprecated, use %P).
128 // You can choose between: des, md5, blowfish, sha256, sha512.
129 $config['password_crypt_hash'] = 'md5';
130 ...
/etc/roundcube/plugins/managesieve/config.inc.php
<?php
// managesieve server port. When empty the port will be determined automatically
// using getservbyname() function, with 4190 as a fallback.
$config['managesieve_port'] = 4190;
/etc/roundcube/config.inc.php In der Hauptkonfigurationsdatei von Roundcube sind zwei Änderungen notwendig.
Ab Zeile 25
25// The IMAP host chosen to perform the log-in.
26// Leave blank to show a textbox at login, give a list of hosts
27// to display a pulldown menu or set one host as string.
28// Enter hostname with prefix ssl:// to use Implicit TLS, or use
29// prefix tls:// to use STARTTLS.
30// Supported replacement variables:
31// %n - hostname ($_SERVER['SERVER_NAME'])
32// %t - hostname without the first part
33// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
34// %s - domain name after the '@' from e-mail address provided at login screen
35// For example %n = mail.domain.tld, %t = domain.tld
36$config['default_host'] = 'localhost';
Ab Zeile 74
74// List of active plugins (in plugins/ directory)
75// Debian: install roundcube-plugins first to have any
76$config['plugins'] = array(
77 'archive',
78 'zipdownload',
79 'managesieve',
80 'password',
81);
Die Datenbankkonfiguration findet sich dann in der Datei /usr/share/roundcube/SQL/mysql.initial.sql
Testen
Nach Konfigurationsänderungen ist das Testen des Ergebnisses immer wichtig. Das betrifft einerseits die Viren und Spam Erkennung aber auch die ganzen Nameservereinträge.
Spam und Viren Testen kann man den Spamfilter mit GTUBE von Apache. Generic Test for Unsolicited Bulk Email (GTUBE) ist ein kurzer Mail-Text, der als Spam erkannt werden muss:
Herunterladen der Test-Datei:
wget http://spamassassin.apache.org/gtube/gtube.txt -P /tmp
und dann verschicken an einen User
sendmail uwe@meine-maildomain.de < /tmp/gtube.txt
Oder
https://www.heise.de/security/dienste/Emailcheck-2109.html
Die SSL-Parameter
openssl s_client -connect meine-maildomain.de:25 -starttls smtp openssl s_client -connect meine-maildomain.de:993
Nameserver-Einträge
SPF
dig -t txt meine-maildomain.de
bzw. mit übersichtlicherme Ergebnis
dig +short -t txt meine-maildomain.de
DKIM
dig -t txt 2020._domainkey.meine-maildomain.de
DMARC
dig -t txt _dmarc.meine-maildomain.de
Quotas
Das Testen der Quota-Einstellungen ist etwas mühsam. Die Warnungen werden z.B. immer dann erzeugt, wenn der Speicherplatz die angegebene Grenze übersteigt. Danach dann aber bis zur nächsten Grenze nicht mehr. Man muss also Mails löschen, um eine Grenze erneut auszutesten.
Bei Problemen kann man darauf achten, ob überhaupt Dovecot für die Mailzustellung genutzt wird:
Oct 18 11:21:19 mail dovecot: lmtp(name@meine-maildomain.de): msgid=<95fd0a2b46d4969a5ff2e514b.98ea0f958f.20201018090500.574acd086e.19474f00@mail111.beispiel.de>: saved mail to INBOX Oct 18 11:21:19 mail postfix/lmtp[13873]: 7EBFD24006C: to=<name@meine-maildomain.de>, relay=meine-maildomain.de[private/dovecot-lmtp], delay=1.3, delays=1.1/0/0.01/0.12, dsn=2.0.0, status=sent (250 2.0.0 <name@meine-maildomain.de> UBNYEg8JjF8yNgAA37fa2w Saved)
Falls Postfix selber zustellt, wie bei der Mail an root
Oct 18 10:30:03 mail postfix/local[13154]: 61D1B240091: to=<root@meine-maildomain.de>, orig_to=<root>, relay=local, delay=0.28, delays=0.2/0/0/0.08, dsn=2.0.0, status=sent (delivered to mailbox)
greifen die Dovecot Einstellungen natürlich nicht.
Falls es probleme gibt kann man auch gut in der local.conf von Dovecot
mail_debug = yes
setzen. Beim Überschreiten einer Grenze sollte sich dann in der Mail.log ein Eintrag finden wie
Oct 18 10:31:22 mail dovecot: lmtp(name@meine-maildomain.de)<587134><ZL7WNlj9i19+9QgAjuSTOg>: Debug: quota: Executing warning: quota-warning 66 name@meine-maildomain.de (because bytes=235928217 -> 314565267 over limit 270336000)
Was mir so auffiel
Was mich etwas überrascht hat, ist dass
tcpdump localhost
keine Dienste anzeigt, die an localhost bzw. 127.0.0.1 gebunden sind. Das betrifft in der Standardkonfiguration die Dienste auf den Ports 11222, 11333 und 11334 des rspamd. Dienste auf diesen Ports kann man aber mit
lsof -i TCP -n -P
ausgeben lassen.
Weiterleitungen mit Sieve anpassen
Bei Weiterleitungen und Mailinglisten gibt es manchmal das Problem, dass einige Empfangs-Server die weitergeleiteten Mails ablehnen, wenn der Absender ebenfalls aus ihrem Bereich kommt.
Nehmen wir einmal als Beispiel eine Schule, deren Lehrer Accounts auf dem System des Behörden-Dienstleisters haben, also z.B. klaus.test@schule-bundesland.de. Die Schule selber hat nun einen eigenen Account auf der Homepage, z.B. info@beispiel-schule.de. Dieser Account wird nun generell weitergeleitet auf beispiel-schule@schule-bundesland.de. Wenn nun jemad an info@beispiel-schule.de schreibt, dann geht die Mail problemlos an beispiel-schule@schule-bundesland.de und wird dort zugestellt. Aber leider nicht, wenn der Absender ein Behördenaccount ist, wie z.B. klaus.test@schule-bundesland.de, dann wird die Mail mit einer Fehlermeldung des Behördenservers abgelehnt, vor allem wenn SPF aktiviert ist.
Ein Versuch dieses Problem zu umgehen lässt sich mit sieve realisieren.
Dazu muss aber in der local.conf von Dovecot innerhalb von plugin eine Zeile ergänzt werden:
plugin { ... sieve_extensions = +editheader
Damit steht dann auch editheader zur Verfügung.
# rule:[Info]
require ["fileinto", "editheader", "envelope", "regex", "variables"];
if true
{
if envelope :matches "From" "*@schule-bundesland.de" {
deleteheader "Reply-To";
addheader "Reply-To" "${1}@schule-bundesland.de";
deleteheader "DKIM-Signature";
deleteheader "DomainKey-Signature";
deleteheader "X-DKIM";
deleteheader "X-DomainKeys";
deleteheader "From";
deleteheader "To";
deleteheader "ARC-Seal";
deleteheader "ARC-Message-Signature";
deleteheader "ARC-Authentication-Results";
deleteheader "Authentication-Results";
addheader "From" "info@beispiel-schule.de";
addheader "To" "beispiel-schule@schule-bundesland.de";
}
redirect "beispiel-schule@schule-bundesland.de";
}
Der Mailserver von beispiel-bundesland.de sieht nun sich nicht mehr selber als Absender der Mail, sondern die (inoffizielle) Adresse der Schule.
Links zu Anleitungen
Dies ist eine Sammlung von Adressen zum Nachlesen und Vergleichen:
rspamd
- https://rspamd.com/ die Homepage des rspamd
- https://roll.urown.net/server/mail/rspamd.html
- https://wiki.rockstable.it/rspamd
- https://arnowelzel.de/spamfilter-und-dkim-mit-rspamd
Gesamtsystem mit rspamd
- https://123qwe.com/tutorial-debian-10/ sehr schöne Beschreibung
- https://www.scaleway.com/en/docs/setup-a-mailserver-on-ubuntu-bionic-beaver-with-dovecot-postfix-rspamd/ sehr schöne Anleitung für das, was ich auch machen möchte
- https://thomas-leister.de/mailserver-debian-buster/ seine Seiten sind immer lesenswert
- https://linuxize.com/post/install-and-integrate-rspamd/
Gesamtsystem ohne rspamd
- https://www.linuxbabe.com/mail-server/host-multiple-mail-domains-in-postfixadmin Hier gibt es mehrere Teile
- https://thomas-leister.de/mailserver-unter-ubuntu-16.04/ Schon etwas älter
SPF, DKIM und DMARC
- https://www.digicomp.ch/blog/2019/02/18/spf-dkim-und-dmarc-verstaendlich-erklaert SPF, DKIM und DMARC verständlich erklärt
- https://www.excontinuum.de/de/2016/06/23/dkim-und-spf-fuer-dovecot-mit-spamassassin/ DKIM, DMARC und SPF für Dovecot und Postfix mit SpamAssassin
- https://scaron.info/blog/debian-mail-spf-dkim.html Für Systeme mit Spamassassin
- https://dmarcian.com/spf-syntax-table/ ausführliche Anleitungen, zu spf, DKIM und DMARC
- https://www.zytrax.com/books/dns/ch9/dmarc.html ausfühliche Auflistung der DMARC Bestandteile
- https://www.df.eu/de/support/df-faq/e-mail/spf-sender-policy-framework/spf-eintraege/ DF bietet eine Anleitung zu spf
- https://support.google.com/a/answer/2466563 DMARC
Links zu Werkzeugen
- check-auth@verifier.port25.com schickt man eine Mail an diese Adresse, so bekommt man per Mail einen Authentication Report
- https://www.mail-tester.com/ auch hier kann man einen Report bekommen, dazu muss man an die auf der Startseite generierte Adresse eine Mail schicken und bekommt dann das Ergebnis im Browser angezeigt
- https://dkimvalidator.com/ auch hier per Mail
- https://www.appmaildev.com/de/dkim
- https://www.spf-record.de/ hier kann man SPF-Records erzeugen und überprüfen
- https://www.kitterman.com/spf/validate.html ein Tool zum Testen
- https://de.ssl-tools.net/mailservers SSL-Test
- https://mxtoolbox.com/dkim.aspx
- https://toolbox.googleapps.com/apps/main/
Zum Thema Mail-Server-Konfiguration
- https://mxtoolbox.com/diagnostic.aspx
- https://tools.dnsstuff.com/mstc
- https://network-tools.webwiz.net/email-test.htm
Mediawiki