Entäuschendes SpamAssassin bei Netcup
Bei meinem neuen Hoster Netcup ist der Spamfilter leider sehr enttäuschend. Ich habe mir mal genauer angeschaut, was dort läuft und wie trennscharf dessen Bewertung eigentlich ist.
Innerhalb des letzten Monats habe ich 360 Spam-Mails bekommen. Im gleichen Zeitraum habe ich ich 188 gewünschte E-Mails bekommen. Man sieht bei mir schon das Verhältnis, es ist 66 % Spam bei mir. Daher wäre es auch wirklich wünschenswert einen guten Spam-Filter zu haben.
Spam-Filter müssen serverseitig laufen, ansonsten macht das wenig Sinn. Ich habe in meinem E-Mail Programm Thunderbird auf dem Laptop zwar einen Spamfilter, der hilft mir aber nicht auf dem Handy. Der Server muss den Spam rausziehen, damit dieser überhaupt nicht erst eine Benachrichtigung auf Handy oder Laptop erzeugt.
SpamAssassin-Header
Schaue ich mir die Kopfzeilen der E-Mails an, so finde ich da einen Header von SpamAssassin:
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mx2f59.netcup.net
X-Spam-Level: ****
X-Spam-Status: No, score=4.5 required=15.0 tests=PDS_OTHER_BAD_TLD,
RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5,RCVD_IN_VALIDITY_RPBL_BLOCKED,
RCVD_IN_VALIDITY_SAFE_BLOCKED,RCVD_IN_ZEN_BLOCKED,RDNS_NONE,
SPF_HELO_PASS,SPF_PASS,URIBL_BLOCKED,URIBL_DBL_BLOCKED,
URIBL_ZEN_BLOCKED autolearn=no autolearn_force=no version=3.4.6
Die setzen da noch Version 3 ein, es gibt aber schon Version 4. Da könnte man eigentlich schon aktualisieren.
Schauen wir uns einmal diese ganzen kleinen Indikatoren an, was die bedeuten:
-
PDS_OTHER_BAD_TLD: Die E-Mail kommt von einer Top-Level-Domain (z. B. .top, .icu, .xyz), die statistisch gesehen sehr oft für Spam genutzt wird. -
RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5: "MailSpike" bewertet die Reputation des absendenden Mailservers. L5 steht für ein sehr niedriges Vertrauenslevel (Low), was den Score leicht anhebt. -
RDNS_NONE: Der absendende Server hat keinen "Reverse DNS"-Eintrag. Das ist ein technisches Warnsignal, da seriöse Mailserver fast immer identifizierbar sind. -
SPF_HELO_PASS,SPF_PASS: Das ist positiv! Es bedeutet, dass der Absender technisch autorisiert ist, E-Mails für diese Domain zu verschicken. Es beweist aber nicht, dass der Inhalt kein Spam ist.
Dann gäbe es noch weitere Möglichkeiten, die Domain zu prüfen. Da hat Netcup aber anscheinend schon sein Quota erreicht:
-
RCVD_IN_ZEN_BLOCKED,URIBL_ZEN_BLOCKED: Abfrage bei Spamhaus ZEN. Das ist eine riesige Datenbank für IP-Adressen, die als Spam-Quellen bekannt sind. -
URIBL_DBL_BLOCKED: Hier wird geprüft, ob die verlinkten Domains in der Mail auf einer verbotenen Liste stehen. RCVD_IN_VALIDITY_RPBL_BLOCKEDRCVD_IN_VALIDITY_SAFE_BLOCKEDURIBL_BLOCKED
Das bedeutet dann leider, dass diese Indikatoren nicht zur Verfügung stehen. Somit können wir leider nicht zu viel vom Score erwarten.
Statistische Analyse
Ich habe nun ein Python-Skript geschrieben, mit dem ich die E-Mails in meinem Postfach analysieren kann. Und dann kann ich mir die Scores von SpamAssassin anschauen. Einige E-Mails bekommen einen Score von +100 (definitiv Spam) und -100 (definitiv kein Spam). Interessant ist es dazwischen. Dies können wir uns als Histogram anschauen:
Wir sehen hier, wie Spam eher höhere Scores hat. Allerdings sind sie nicht klar separiert. Das ist schlecht, denn so man keinen Schwellenwert finden können, bei dem es klar getrennt wird.
Wir können uns die ROC-Kurve anschauen. Das zeigt die Falsch-Positiv-Rate (erwünschte E-Mail fälschlicherweise als Spam) gegen die Wahr-Positiv-Rate (Spam als Spam). Bei einer perfekten Klassifikation macht die Linie einen rechtwinkligen Knick. Bei guten Klassifikatoren ist es fast so, die Linie ist möglichst in der oberen linken Ecke. Sie ist jedenfalls weit von der diagonalen weg.
Bei SpamAssassin haben wir eine ziemlich gute Kurve:
Die »Area Under Curve« ist 0,96, was ein hoher Wert ist. Wenn wir uns aber einmal die Raten gegenseitig anschauen, sieht es schon trauriger aus.
Wir wollen einen Schwellenwert wählen, sodass die orange Wahr-Positiv Kurve möglichst bei 1,0 ist. Die blaue Falsch-Positiv Kurve soll möglichst bei 0,0 sein. Wahr-Positiv bedeutet, dass Spam aus meinem Posteingang entfernt wird. Falsch-Positiv bedeutet, dass ich gewünschte E-Mails aus dem Spam-Ordner fischen muss. Ersteres ist doof, letzteres ist schlimmer.
Wenn wir also schauen, dass die blaue Kurve möglichst unten ist, sollte der Schwellenwert minimal 4 sein. Aber dann zeigt die orange Kurve 0,55 an. Wir haben fast keine guten E-Mails im Spam-Ordner, dafür kommt noch 45 % des Spams durch. Das ist ja unbefriedigend.
Setzen wir den Schwellenwert auf 2, so zeigt die orange Kurve 0,72; es kommt nur noch 28 % des Spams in den Posteingang. Aber wir haben schon 0,04 bei der blauen Kurve; 4 % der guten E-Mails kommt in den Spam-Ordner.
Wählen wir 1 als Schwellenwert, so haben wir 14 % der guten E-Mails im Spam-Ordner, dafür aber über 90 % des Spams aussortiert. Klingt jetzt auch nicht so super.
Insgesamt bin ich da ziemlich ernüchtert, muss ich sagen.
Rspamd-Header
Auf dem Server läuft auch noch Rspamd. Das ist wohl eine neuere Entwicklung, testet besser und bietet bessere Rechenleistung an. Da finden wir diesen Header:
X-Rspamd-Server: rspamd-worker-8404
X-Spamd-Result: default: False [9.59 / 15.00];
ONCE_RECEIVED_STRICT(4.00)[];
HFILTER_HOSTNAME_UNKNOWN(2.50)[];
RBL_MAILSPIKE_WORST(2.00)[178.178.245.224:from];
RDNS_NONE(1.00)[];
MIME_BASE64_TEXT(0.10)[];
MIME_GOOD(-0.10)[text/plain];
ONCE_RECEIVED(0.10)[];
HAS_LIST_UNSUB(-0.01)[];
R_DKIM_NA(0.00)[];
REPLYTO_ADDR_EQ_FROM(0.00)[];
FROM_EQ_ENVFROM(0.00)[];
RCVD_COUNT_ZERO(0.00)[0];
MIME_TRACE(0.00)[0:+];
MID_RHS_MATCH_FROM(0.00)[];
ASN(0.00)[asn:31133, ipnet:178.178.244.0/22, country:RU];
TO_MATCH_ENVRCPT_ALL(0.00)[];
FUZZY_BLOCKED(0.00)[rspamd.com];
ARC_NA(0.00)[];
TO_DN_NONE(0.00)[];
DMARC_NA(0.00)[chinoh.fr: no valid DMARC record];
RCPT_COUNT_ONE(0.00)[1];
FROM_HAS_DN(0.00)[];
R_SPF_NEUTRAL(0.00)[?all];
HAS_REPLYTO(0.00)[charlotte@chinoh.fr]
X-Rspamd-Queue-Id: 875F2200F4
X-Spam: Yes
Das ganze können wir etwas hübscher als Tabelle aufbereiten und uns dann diese Dinge einmal anschauen.
| Test | Score | Textwert |
|---|---|---|
ARC_NA |
0.00 | |
ASN |
0.00 | asn:31133, ipnet:178.178.244.0/22, country:RU |
DMARC_NA |
0.00 | chinoh.fr: no valid DMARC record |
FROM_EQ_ENVFROM |
0.00 | |
FROM_HAS_DN |
0.00 | |
FUZZY_BLOCKED |
0.00 | rspamd.com |
HAS_LIST_UNSUB |
-0.01 | |
HAS_REPLYTO |
0.00 | charlotte@chinoh.f |
HFILTER_HOSTNAME_UNKNOWN |
2.50 | |
MID_RHS_MATCH_FROM |
0.00 | |
MIME_BASE64_TEXT |
0.10 | |
MIME_GOOD |
-0.10 | text/plain |
MIME_TRACE |
0.00 | 0:+ |
ONCE_RECEIVED |
0.10 | |
ONCE_RECEIVED_STRICT |
4.00 | |
RBL_MAILSPIKE_WORST |
2.00 | 178.178.245.224:from |
RCPT_COUNT_ONE |
0.00 | 1 |
RCVD_COUNT_ZERO |
0.00 | 0 |
RDNS_NONE |
1.00 | |
REPLYTO_ADDR_EQ_FROM |
0.00 | |
R_DKIM_NA |
0.00 | |
R_SPF_NEUTRAL |
0.00 | ?all |
TO_DN_NONE |
0.00 | |
TO_MATCH_ENVRCPT_ALL |
0.00 |
Ein paar Erklärungen (von Gemini):
-
ONCE_RECEIVED_STRICT(4.00): Das ist ein dicker Brocken. Die Mail wurde direkt von einem Server eingeliefert, ohne dass sie vorher durch andere Relay-Server ging. Das ist oft ein Zeichen für ein Spam-Skript. -
HFILTER_HOSTNAME_UNKNOWN(2.50): Der sendende Server hat keinen ordentlichen Namen (Hostname). Das wirkt unprofessionell und verdächtig. -
RBL_MAILSPIKE_WORST(2.00): Mailspike (die Denylist) stuft die IP als "sehr schlecht" ein. -
ASN(0.00): Hier siehst du ein spannendes Detail:country:RU. Die Mail kommt aus Russland. Das allein gibt zwar keine Punkte, fließt aber in die statistische Bewertung ein. -
DMARC_NA/R_SPF_NEUTRAL: Der Absender (chinoh.fr) hat seine Hausaufgaben nicht gemacht. Es gibt keinen DMARC-Eintrag und das SPF-Ergebnis ist "neutral" (also nichtssagend).
Das klingt ja erstmal vielversprechend. Der moderne Spamfilter!
Statistische Analyse von Rspamd
Schauen wir uns allerdings ganz analog erstmal die Verteilung der Scores an, ist das ernüchternd:
Also letztlich gibt es sowohl gute E-Mails als auch Spam mit allen Scores. Die ROC-Kurve bestätigt das. Die sieht eher aus wie eine Diagonale. Teilweise ist sie sogar schon unter der Diagonale, damit sind die Scores schlechter als Würfeln. Das muss man erstmal schaffen!
Der Plot mit den Raten zeigt auch, dass hier kein sinnvoller Abstand ist.
Also in dieser Form ist Rspamd komplett unbrauchbar konfiguriert. Das liegt wohl vor allem an den ganzen Denylists, auf die es nicht zugreifen kann.
Korrelation von SpamAssassin und Rspamd
Wir können uns auch noch die Korrelation der beiden Filter anschauen:
Man sieht, dass SpamAssassin besser trennt als Rspamd.
Man könnte eine etwas diagonale Linie finden, die die orangen Punkte (Spam) vom Rest so abtrennt, dass kein blauer Punkt dort landet. Wenn man beide Filter kombiniert, dann wäre das Ergebnis minimal besser.
Fazit
Netcup hat keinen wirklich guten Spamfilter, der mir helfen würde. Es fehlen wohl einfach die Abfragen bei den Blockierlisten. Und es könnte einfach sein, dass das im Budget nicht drin ist. Das Webhosting kostete 2,17 EUR/Monat, inzwischen 2,56 EUR/Monat (für Neukunden 2,69 EUR/Monat).
Die Spamhaus ZEN DNS-Blockliste ist für kleine Anwendungen kostenlos:
Use of the Spamhaus DNSBLs is free of charge for low-volume, non-commercial users.
Für kommerzielle Nutzer:innen allerdings kostenpflichtig:
Where data is being used for commercial purposes, an annual subscription-based service is required.
Ich kann mir vorstellen, dass Netcup vor allem mit dem Preis punktet und daher solche zusätzlichen Dinge einfach nicht gemacht werden. Das ist grundsätzlich auch in Ordnung, allerdings ist es natürlich schade so etwas erst nach dem Wechsel herauszufinden.
Ausblick
Den Kundendienst von Netcup habe ich schon mit der Bitte nach einem besseren Spamfilter angeschrieben. Ich fürchte allerdings, dass sie aufgrund der Kosten da nichts machen werden.
Somit bliebe nur einen anderen Dienst für E-Mail zu nutzen und bei Netcup den MX-Record meiner Domäne auf diesen anderen Dienst zu setzen. Damit kostet mich das dann mehr als vorher, aber vielleicht ist es das Spamproblem schon wert.