This commit is contained in:
2026-08-14 23:07:21 +02:00
parent 1eb46d98ef
commit 9fdd3408a0
6 changed files with 195 additions and 57 deletions

View File

@@ -0,0 +1,80 @@
# DMS-CUSTOM-APPEND
# ===========================================================================
# WICHTIG: Diese Datei wird von user-patches.sh an /etc/rspamd/local.d/settings.conf
# ANGEHAENGT und nicht darueber kopiert. DMS legt in dieser Datei selbst eine
# Regel fuer authentifizierte User ab (DMS::SED_TAG::1), die erhalten bleiben muss.
# ===========================================================================
#
# Hintergrund
# -----------
# Externe Mail erreicht DMS nie direkt: SES -> S3/SQS -> email-worker -> SMTP.
# Rspamd sieht als Client-IP daher immer den Worker-Container (172.x) statt des
# echten Absender-Servers. Alle verbindungsbezogenen Pruefungen messen damit
# unsere eigene Infrastruktur und liefern systematisch Strafpunkte:
#
# HFILTER_HOSTNAME_UNKNOWN 6.0 (kein PTR fuer 172.x -> exakt die add_header-Schwelle)
# R_SPF_FAIL / R_SPF_SOFTFAIL 4.5 / 2.5
# R_DKIM_NA / R_DKIM_PERMFAIL 1.0 / 4.5
#
# Diese Gruppen werden fuer Einlieferungen aus dem Docker-Netz deaktiviert.
# Inhaltsbezogene Pruefungen (Bayes, Fuzzy, URL-/Surbl-Blocklisten, MIME,
# Attachment-Checks) bleiben vollstaendig aktiv - echter Spam wird also weiter
# erkannt, nur eben anhand des Inhalts statt anhand einer Transportstrecke,
# die rspamd hier gar nicht beurteilen kann.
#
# SPF/DKIM/DMARC gehen dadurch nicht verloren: SES prueft sie bereits mit der
# echten Absender-IP. Das Ergebnis liegt im SQS-Payload (receipt.spamVerdict,
# spfVerdict, dkimVerdict, dmarcVerdict). Sobald der Worker diese Verdicts als
# Header stempelt, koennen sie hier per multimap wieder bepunktet werden.
# ---------------------------------------------------------------------------
# 1) Einlieferungen des email-workers (externe Mail + dessen Forwards/OOO)
#
# Der Worker setzt X-SES-Worker-Processed auf JEDER Mail, die er einliefert:
# delivered = Originalmail an das lokale Postfach
# forwarded = neu komponierte Weiterleitung (rules-processor.ts)
# ooo-reply = Abwesenheitsantwort
#
# Die IP-Bedingung ist die Absicherung: ohne sie koennte ein externer Absender
# den Header selbst setzen und die Auth-Pruefungen abschalten. Beide
# Bedingungen werden von rspamd implizit mit UND verknuepft.
# ---------------------------------------------------------------------------
ses_worker_injected {
priority = 10;
ip = ["172.16.0.0/12", "127.0.0.0/8"];
header = {
"X-SES-Worker-Processed" = true;
}
apply {
groups_disabled = ["spf", "dkim", "dmarc", "hfilter"];
symbols_disabled = ["RDNS_NONE"];
}
}
# ---------------------------------------------------------------------------
# 2) Lokale Re-Injection ohne Worker-Header
#
# Betrifft:
# - Sieve-Redirects fuer INTERNE Mail (accounting@ -> support@ -> Forwards).
# Diese Mail laeuft nie ueber SES/Worker, hat also keinen Worker-Header.
# - Roundcube, das ohne SASL-Auth aus dem Docker-Netz einliefert
# (ROUNDCUBEMAIL_SMTP_USER ist bewusst leer).
#
# Beides wurde bisher von der DOCKER_WL-Whitelist (-50) aufgefangen. Diese
# Regel ersetzt sie - deutlich enger gefasst, weil sie an das Docker-Netz
# gebunden ist statt an eine faelschbare Absenderdomain.
#
# Niedrigere Prioritaet als Regel 1: rspamd wertet Regeln nach Prioritaet aus
# und nimmt den ersten Treffer, Worker-Mail landet also nie hier.
#
# ACHTUNG: Diese Regel setzt voraus, dass Port 25 NICHT oeffentlich erreichbar
# ist (docker-compose.yml bindet ihn auf 127.0.0.1). Wird das je geaendert,
# muss diese Regel weg - sonst umgeht jeder externe Absender die Pruefung.
# ---------------------------------------------------------------------------
local_reinjection {
priority = 5;
ip = ["172.16.0.0/12", "127.0.0.0/8"];
apply {
groups_enabled = ["dkim"];
}
}

View File

@@ -0,0 +1,19 @@
# documentation: https://rspamd.com/doc/configuration/logging.html
#
# Uebersteuert den DMS-Default (level = "silent"), bei dem rspamd ueberhaupt
# nichts protokolliert und Spam-Scores nicht nachvollziehbar sind.
#
# type = "console" bleibt bewusst stehen: Supervisor leitet stdout/stderr von
# rspamd bereits nach /var/log/mail/rspamd.log um (siehe dms-services.conf).
# Ein eigenes type = "file" mit demselben Pfad haette zwei Schreiber auf
# derselben Datei zur Folge.
#
# Mit level = "info" schreibt rspamd pro Mail eine Zeile mit Aktion, Score und
# allen ausgeloesten Symbolen samt Einzelgewicht:
#
# docker exec mailserver sh -c 'grep rspamd_task_write_log /var/log/mail/rspamd.log | tail -20'
type = "console";
level = "info";
color = false;
systemd = false;

View File

@@ -1,8 +1,18 @@
DOCKER_WL {
type = "from";
filter = "email:domain";
map = "/etc/rspamd/override.d/docker_whitelist.map";
symbol = "DOCKER_WHITELIST";
description = "Whitelist fuer eigene Domains";
score = -50.0;
}
# documentation: https://rspamd.com/doc/modules/multimap.html
#
# Die fruehere Regel DOCKER_WL (-50 Punkte fuer jede Mail, deren Envelope-From
# auf eine unserer eigenen Domains zeigt) ist bewusst entfernt worden:
#
# 1. Sie war ein Spoofing-Loch. Mit SPOOF_PROTECTION=0 genuegte einem
# beliebigen externen Absender ein "MAIL FROM: <x@bayarea-cc.com>", um
# -50 Punkte plus das erzwungene "no action" aus force_actions.conf zu
# bekommen - also garantierte Zustellung in die Inbox.
# 2. Sie hat echten Spam an weitergeleitete Adressen durchgereicht, weil der
# email-worker seine Weiterleitungen mit Envelope-From = Empfaengeradresse
# (also eigene Domain) einliefert.
# 3. Sie hat nur ein Symptom kompensiert: die falschen Auth-/Hostname-Scores,
# die entstehen, weil alle Mail aus dem Worker-Container kommt. Das wird
# jetzt an der Ursache geloest - siehe rspamd/append.d/settings.conf.
#
# Die Datei bleibt (leer) bestehen, damit user-patches.sh sie beim Start ueber
# eine evtl. noch im Container liegende alte Version kopiert.

View File

@@ -1,6 +1,10 @@
rules {
DOCKER_WHITELIST_FORCE {
action = "no action";
expression = "DOCKER_WHITELIST";
}
}
# documentation: https://rspamd.com/doc/modules/force_actions.html
#
# Die Regel DOCKER_WHITELIST_FORCE ("no action" sobald DOCKER_WHITELIST greift)
# ist entfernt. Sie hat die Spam-Entscheidung fuer jede Mail mit eigener
# Absenderdomain hart ueberschrieben - inklusive echtem Spam an weitergeleitete
# Adressen. Das dazugehoerige Symbol existiert nicht mehr, siehe
# rspamd/local.d/multimap.conf.
#
# Keine rules{}-Sektion = force_actions ist wirkungslos. Datei bleibt bestehen,
# damit DMS sie beim Start ueber eine alte Version im Container kopiert.