Spam Assassin ist ein sehr effektiver Spam Filter. Leider bietet Plesk keine Möglichkeit wichtige Kontakte automatisch auf die Whitelist von Spam Assassin zu setzen. So besteht die Gefahr, dass eingehende Mails im Spam-Filer landen oder bei entsprechender Einstellung sogar gelöscht werden. Das folgende Skript ergänzt Spam Assassin unter Plesk um genau eine Auto Whitelisting Funktion.
Cleveres Auto Whitelisting für Spam Assassin unter Plesk
Whitelisting sollte “smart” sein. Es sollte unterscheiden, ob die ausgehende Mail eine Nachricht an einen persönlichen Kontakt oder einfach nur eine Autoresponder-Mail ist. Der Autoresponder von Plesk unterscheidet nicht zwischen Kontakten und Spam Mails, die es durch den Spam-Filter geschafft haben. So würden bei aktivem Autoresponder auch Spam-Versender auf der Whitelist landen.
Da das Skript die Logdateien von Postfix verwendet, müssen hier einige Vorbereitungen getroffen werden, um normale Mails von Autoresponder Mails zu unterscheiden.
Dies geschieht anhand der Betreffs (Mail Subject) der ausgehenden Mails.
Hierzu wird in Plesk der Betreff des Autoresponders mit dem Zuatz “(Auto-Reply)” versehen:
Da Postfix normalerweise keine Mail Subject-Info in die Logdateien schreibt, muss die Konfiguration von Postfix wie folgt angepasst werden:
Unter /etc/postfix/main.cf wird folgende Zeile angehängt:
1 |
header_checks = regexp:/etc/postfix/header_checks |
Danach erstellen wird eine neue Datei namens /etc/postfix/header_checks mit folgendem Inhalt:
1 |
/^subject:/ INFO |
Nun starten wir Postfix über folgenden Befehl neu:
1 2 |
sudo /etc/init.d/postfix restart |
Das Auto-Whitelisting Skript für Spam Assassin
Das Auto Whitelsiting Skript filtert nun die Postfix Log-Dateien. Die Empfänger-Adressen ausgehender Mails werden in eine Textdatei geschrieben. Autoresponder Mails werden dabei aussen vor gelassen. Danach werden mehrfach vorkommende Einträge aus der Textdatei entfernt und die verbleibenden Einträge über den entsprechenden Befehl in die Whitelist Tabelle der Plesk Datenbank geschrieben.
Um zu vermeiden, dass die eigene Adressen auf die Whitelist von SpamAssassin gelangen, können diese über “EXCLUDE” gefiltert werden. Das ist wichtig um Spam-Versender, welche domain-eigene Adressen als Absender vortäuschen (Spoofing9 nicht per Whitelist an SpamAssassin vorbei kommen.
Das Skript sollte stündlich per Plesk Taskplaner aufgerufen werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/bin/bash # # build-sa-whitelist.sh 1.02 # # Implements Spam Assassin Auto Whitelisting by # collecting recipient addresses from the Postfix log. # # Ignoring AUTORESPONDER mails requires the following Postfix modifications: # # EDIT: /etc/main.cf: # ADD: header_checks = regexp:/etc/postfix/header_checks # # CREATE: /etc/postfix/header_checks # ADD: /^subject:/ INFO # # Restart Postfix to apply above mods. # # 1.02: # Added excludes to avoid spoofed whitelist senders # 1.01: # Fixed SA_WLIST_ADD. 'plesk' was not found when running under cron. # # (c)2016-2017 Harald Schneider # # Config.start # # These addresses won't be synced to Spamassassin EXCLUDE=(mail@domain mail2@domain.com) # Clear this, if you use a unmodified Postfix AUTORESPONDER="(Auto-Reply)" # Plesk command for adding addresses to the whitelist SA_WLIST_ADD="/usr/sbin/plesk bin spamassassin --update-server -whitelist add:" # # Config.end # Filter Postfix log # echo "Filtering Postfix log ..." if [ $AUTORESPONDER = "" ]; then cat /var/log/maillog |grep -v "relay=local" |grep "relay=" |grep "status=sent" |perl -ne 'print lc "$1\n" if /to=<(.*?)>/' >/var/log/maillog-sa-filtered.txt else cat /var/log/maillog |perl -MMIME::QuotedPrint=decode_qp -e 'print decode_qp join"",<>' |grep "info: header Subject:" |grep -v "Subject:.*$AUTORESPONDER" |perl -ne 'print lc "$1\n" if /to=<(.*?)>/' >/var/log/maillog-sa-filtered.txt fi # Filter duplicates # perl -ne 'print unless $seen{$_}++' /var/log/maillog-sa-filtered.txt > /var/log/maillog-sa-filtered-2.txt rm /var/log/maillog-sa-filtered.txt # Write to Spamassassin Whitelist. # echo "Syncing to SpamAssasin Whitelist ..." while read LINE do if ! [[ " ${EXCLUDE[*]} " == *"${LINE}"* ]]; then WLIST+=${LINE}"," fi done < <(cat /var/log/maillog-sa-filtered-2.txt) WLIST=${WLIST::-1} ${SA_WLIST_ADD}${WLIST} rm /var/log/maillog-sa-filtered-2.txt echo "DONE!" exit 0 |
Plesk: Limit für Spam Assassin’s Whitelists und Blacklists erhöhen
Im laufenden Betrieb kommt es hin und wieder vor, dass man über das PLESK Backend Mailadressen manuell auf die SpamAssassin Whitelist oder Blacklist setzen möchte. Hier stösst man jedoch schnell an die Grenzen von PLESK, denn die Anzahl der manuellen Einträge ist auf 100 bzw. 150 Adressen limitiert.
Mit den folgenden Befehlen lässt sich dieses Limit auf 10.000 Einträge erhöhen:
1 |
plesk db |
Danach erhält man ein mysql> Prompt und gibt folgendes ein:
1 2 |
replace into ServiceNodeConfiguration values (1, 'mailServer', 'spamfilter_max_addr_list_length', 10000); |
Nach Ausführung verlässt man MySQL mit
1 2 |
quit |