Reputationspflege 6: Rspamd

Mein Mailstack erzeugt und versendet mittlerweile zwar einwandfreie Nachrichten, aber auf Grund des lokalen DKIM-Skripts können signierte E-Mails ausschließlich von einem entsprechend konfigurierten Client verschickt werden (wobei die Verwendung unterschiedlicher SMTP-Server für unterschiedliche Accounts auf iOS-Geräten ohnehin unmöglich ist, so dass ich auch einen DKIM-signierenden Mailserver nicht ohne Weiteres auf einem iPhone nutzen könnte).

Die Installation von OpenDKIM als einem weiteren Postfix-Handlanger widerstrebt mir, und SpamAssassin ist – trotz seiner unbestreibaren Verdienste – schon recht alt und sehr langsam (Jan 29 21:24:11 eden spamd[574842]: spamd: identified spam (7.5/6.0) for xxxxx:111 in 4.2 seconds, 988 bytes).

Glücklicherweise gibt es mit Rspamd einen schnellen Spamfilter, der nicht nur DKIM-Signaturen erzeugt, sondern auch Monitoring per Weboberfläche bietet.

Rspamd nutzt einen Redis-Cache, dessen Installation (apt-get install redis-server; service redis-server start) nicht der Rede wert ist. Der Spamfilter selbst dagegen erfordert die Installation eines zusätzlichen apt-Behälters:

apt-get install -y lsb-release wget CODENAME=`lsb_release -c -s` mkdir -p /etc/apt/keyrings wget -O- https://rspamd.com/apt-stable/gpg.key | gpg --dearmor | tee /etc/apt/keyrings/rspamd.gpg > /dev/null echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rspamd.gpg] http://rspamd.com/apt-stable/ $CODENAME main" | tee /etc/apt/sources.list.d/rspamd.list echo "deb-src [arch=amd64 signed-by=/etc/apt/keyrings/rspamd.gpg] http://rspamd.com/apt-stable/ $CODENAME main" | tee -a /etc/apt/sources.list.d/rspamd.list apt-get update apt-get --no-install-recommends install rspamd

Leider liefert rspamadm configwizard nur eine Übersicht der aktiven/inaktiven Module und verabschiedet sich anschließend mit einem segmentation fault (obwohl die Generierung neuer DKIM-Schlüsselpaare mit rspamadm dkim_keygen -s 's43' -d eden.one einwandfrei funktioniert). Die manuelle Konfiguration ist etwas mühsam, weil für jedes Modul eine neue Datei in /etc/rspamd/local.d angelegt werden muss:

# /etc/rspamd/local.d/actions.conf reject = 12; rewrite_subject = 7; # /etc/rspamd/local.d/chartable.conf enabled = false; # /etc/rspamd/local.d/classifier-bayes.conf autolearn { spam_threshold = 6.0; junk_threshold = 4.0; ham_threshold = -0.5; check_balance = true; min_balance = 0.9; } # /etc/rspamd/local.d/dkim_signing.conf allow_envfrom_empty = true; allow_hdrfrom_mismatch = false; allow_hdrfrom_multiple = false; allow_username_mismatch = true; path = "/etc/rspamd/dkim_keys/$domain.$selector.key"; selector = "s42"; sign_authenticated = true; sign_local = true; symbol = "DKIM_SIGNED"; try_fallback = true; use_domain = "header"; use_esld = true; use_redis = false; key_prefix = "DKIM_KEYS"; check_pubkey = false; allow_pubkey_mismatch = true; # /etc/rspamd/local.d/groups.conf symbols = { "OWN_MAIL" { weight = -5.0; description = "Mail sent by authenticated user"; } } # /etc/rspamd/local.d/milter_headers.conf extended_spam_headers = true; local_headers = ["x-spamd-bar"]; use = ["x-spamd-bar", "authentication-results"]; routines { x-rspamd-server { header = 'X-Rspamd-Server'; hostname = 'mail.eden.one'; } } # /etc/rspamd/local.d/mx_check.conf enabled = true; # /etc/rspamd/local.d/redis.conf read_servers = "127.0.0.1"; write_servers = "127.0.0.1"; # etc/rspamd/local.d/settings.conf authenticated { priority = high; authenticated = yes; apply { OWN_MAIL = -5.0; } symbols [ "OWN_MAIL" ] } # /etc/rspamd/local.d/worker-controller.inc password = "password" # /etc/rspamd/local.d/worker-proxy.inc bind_socket = "/var/spool/postfix/rspamd/milter.sock mode=0666 owner=nobody"; timeout = 120s; upstream "local" { default = yes; self_scan = yes; }

Ohne redis.conf wird der laufende Redis-Server nicht gefunden, und ohne worker-proxy.inc steht Rspamd nicht als Mailfilter zur Verfügung. Durch die autolearn-Konfiguration in classifier-bayes.conf kann ich mit etwas Geduld von statistikbasierter Filterung profitieren. Die Anweisung in chartable.conf wiederum verhindert, dass deutsche (oder slawische) Nachrichten pauschal mit dem Symbol R_MIXED_CHARSET gekennzeichnet werden. Das in groups.conf definierte Symbol OWN_MAIL dient in Verbindung mit der Anweisung in settings.conf dazu, Nachrichten von authentifizierten Benutzerinnen (i.e. von mir) mit einem sehr niedrigen Spam-Score auszustatten. Wegen eines weiteren Bugs müssen Authentication Results für lokale/authentifizierte Nutzerinnen unsichtbar bleiben.

Der Wechsel zu Rspamd macht sich bezahlt:

2022-01-29 10:19:21 #602799(rspamd_proxy) <cac9c6>; proxy; rspamd_task_write_log: id: <ejn1enwppkp6jo1c-664rfoier1qdu3m6-1434@cryptostar.digital>, qid: <18ACA7F921>, ip: 194.99.45.158, from: <20576-27747-5172-4544-xxxx=xxxxxxx.xx@mail.cryptostar.digital>, (default: T (reject): [20.62/15.00] [ABUSE_SURBL(11.00){cryptostar.digital:url;cryptostar.digital:dkim;},HFILTER_HOSTNAME_UNKNOWN(2.50){},RBL_SPAMHAUS_CSS(2.00){194.99.45.158:from;},RBL_VIRUSFREE_BOTNET(2.00){194.99.45.158:from;},RBL_SEM(1.00){194.99.45.158:from;},R_PARTS_DIFFER(0.72){86.4%;},MV_CASE(0.50){},R_MISSING_CHARSET(0.50){},MANY_INVISIBLE_PARTS(0.30){4;},BAD_REP_POLICIES(0.10){},MIME_GOOD(-0.10){multipart/alternative;text/plain;},ONCE_RECEIVED(0.10){},ARC_NA(0.00){},ASN(0.00){asn:399471, ipnet:194.99.45.0/24, country:US;},DKIM_TRACE(0.00){cryptostar.digital:+;},DMARC_NA(0.00){cryptostar.digital;},DNSWL_BLOCKED(0.00){194.99.45.158:from;},DWL_DNSWL_BLOCKED(0.00){cryptostar.digital:dkim;},FORGED_SENDER_VERP_SRS(0.00){},FROM_HAS_DN(0.00){},FROM_NEQ_ENVFROM(0.00){acidreflux@cryptostar.digital;20576-27747-5172-4544-xxxx=xxxxxxx.xx@mail.cryptostar.digital;},HAS_REPLYTO(0.00){acidreflux@cryptostar.digital;},MID_RHS_MATCH_FROM(0.00){},MIME_TRACE(0.00){0:+;1:+;2:~;},RCPT_COUNT_ONE(0.00){1;},RCVD_COUNT_ZERO(0.00){0;},REPLYTO_ADDR_EQ_FROM(0.00){},R_DKIM_ALLOW(0.00){cryptostar.digital:s=k1;},R_SPF_ALLOW(0.00){+a;},TO_DN_NONE(0.00){},TO_MATCH_ENVRCPT_ALL(0.00){}]), len: 10662, time: 208.071ms, dns req: 31, digest: <f79d1b1822bf81e0d03b01f173c405a6>, rcpts: <xxxx@xxxxxxx.xx>, mime_rcpts: <xxxx@xxxxxxx.xx>

Mehr kann ich im Moment nicht tun. Meine Genugtuung über das gelungene Setup wird nur leicht getrübt, als ich eine Nachricht von Lidl Kundeservice ©™ <support@golfnewbie.com> mit einwandfreien SPF-, DKIM- und DMARC-Ergebnissen und einem Spamscore von 0.03 erhalte. Andererseits erkennt Rspamd 35% aller Nachrichten als Spam, und sorgfältig erstellter Spam hat ein Recht darauf, individuell gelöscht zu werden. Außerdem ist Posteo bei der Spambewertung noch laxer als ich (0.261/7 vs. 3.62/12 für den Rekord-Jackpot mit 156 Mio €).

Deutlich frustrierender ist die freundliche Mitteilung von Microsoft, meine erste E-Mail an eine M365-Nutzerin sei im Microsoft 365 Defender Portal aufgehalten worden, und ich müsse die IP-Adresse meines Mailservers im Office 365 Anti-Spam IP Delist Portal von der Liste der blockierten Absender entfernen. Statt meine einwandfreien Nachrichten zu blockieren, sollte Microsoft sich lieber um den Abschluss des Rebrandings von 2020 kümmern, dem Office 365 Anti-Spam IP Delist Portal einen gefälligeren Namen geben oder wenigstens eine ansprechende Oberfläche.

Update: Der vermeintliche Bug ist ein Schreibfehler meinerseits (authentication_results statt authentication-results), und zu meiner Verteidigung kann ich nur anführen, dass die korrekte Schreibweise der Rspamd-Konfiguration inkonsistent ist:

routines { authentication-results { add_smtp_user = false; } }