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:

magicspam-autoreponder

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:

header_checks = regexp:/etc/postfix/header_checks

Danach erstellen wird eine neue Datei namens /etc/postfix/header_checks mit folgendem Inhalt:
/^subject:/ INFO

Nun starten wir Postfix über folgenden Befehl neu:
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.

#!/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:

plesk db

Danach erhält man ein mysql> Prompt und gibt folgendes ein:
replace into ServiceNodeConfiguration values (1, 'mailServer', 'spamfilter_max_addr_list_length', 10000);

Nach Ausführung verlässt man MySQL mit
quit