SPF, DKIM und DMARC sind wichtige Bestandteile einer sicheren E-Mail-Infrastruktur. Sie reichen jedoch nicht aus, um moderne Phishing-Mails zuverlässig zu erkennen. In der Praxis werden zunehmend echte oder kompromittierte Mailkonten, regulär registrierte Domains und korrekt konfigurierte Versandserver verwendet. Eine Phishing-Mail kann deshalb technisch sauber aussehen, über authentifiziertes SMTP verschickt werden und sogar SPF oder DKIM bestehen, obwohl sich der sichtbare Absender als ELSTER, Microsoft, DHL, PayPal oder eine Bank ausgibt.
Genau hier liegt die Schwäche einer rein auf Mailauthentifizierung ausgerichteten Prüfung. SPF bestätigt, ob ein Server für die tatsächlich verwendete Envelope-Domain senden darf. DKIM bestätigt eine kryptografische Signatur für eine Domain. DMARC prüft unter anderem die Ausrichtung dieser Identitäten zur sichtbaren From-Domain. Keine dieser Prüfungen beantwortet jedoch direkt die Frage, ob ein Anzeigename wie „ELSTER Bestätigung“ überhaupt zur tatsächlich verwendeten Domain gehört.
Bei meinem Rspamd-Setup habe ich deshalb die lokale Phishing-Erkennung schrittweise um eine eigenständige Brand-Impersonation-Logik erweitert. Ausgangspunkt waren zunächst Bank-Phishing-Mails. Inzwischen ist die Erkennung bewusst allgemeiner aufgebaut und trennt generischen Markenmissbrauch von bankenspezifischen Regeln.
Ein realer ELSTER-Phishing-Fall hat dabei noch einen Konfigurationsfehler offengelegt, der besonders interessant war: Die Brand-Map enthielt bereits reguläre Ausdrücke, die Multimap-Regel wertete diese aber zunächst nicht als Regex aus. Die Konfiguration war syntaktisch gültig, fachlich funktionierte die Schutzschicht jedoch nicht. Erst ein reproduzierbarer Test mit einer echten Nachricht machte das Problem sichtbar.

1. Warum SPF, DKIM und DMARC allein nicht genügen
Bei modernen Phishing-Kampagnen muss die Absenderdomain nicht einmal gefälscht sein. Ein Angreifer kann ein kompromittiertes Postfach verwenden oder einen legitimen Hostinganbieter missbrauchen und beispielsweise folgende Nachricht verschicken:
From: "ELSTER Bestätigung" <cesar@fremde-domain.example>
Subject: ELSTER: Wichtiger Hinweis zu Ihren Steuerdaten
Die technische Domain kann dabei tatsächlich autorisiert sein, über den verwendeten Mailserver zu senden. SPF kann deshalb völlig korrekt mit pass antworten. Auch eine gültige DKIM-Signatur würde zunächst nur beweisen, dass die Nachricht tatsächlich von einer Infrastruktur signiert wurde, die für diese fremde Domain einen passenden Schlüssel besitzt.
Das bedeutet aber nicht, dass ELSTER der Absender ist.
Das gleiche Prinzip gilt beispielsweise für:
From: "N26App" <support@fremde-domain.example>
From: "Consorsbank IT-Koordination" <user@fremde-domain.example>
oder:
From: "Volksbank SecureGO-Alarmdienst" <account@fremde-domain.example>
Die zentrale Frage lautet deshalb nicht nur:
Ist die verwendete Absenderdomain technisch authentifiziert?
sondern zusätzlich:
Passt die sichtbare Marke zur tatsächlichen Absenderidentität?
Die lokale Härtung kombiniert deshalb mehrere voneinander unabhängige Signale: Marken im sichtbaren Anzeigenamen, tatsächliche Absenderdomain, DMARC-Situation, typische Phishingformulierungen, verdächtige Funktionsbezeichnungen, IP- und URL-Reputation, Bayes sowie bereits bekannte schädliche Absender.
Rspamd eignet sich dafür gut, weil Multimap-Regeln einzelne Merkmale erkennen und Composite-Regeln daraus eine kontextabhängige Bewertung bilden können. Regexp-Maps müssen dabei ausdrücklich als solche konfiguriert werden.
Die ursprüngliche Konfiguration war stark auf Banken zugeschnitten. Das funktionierte zunächst, wurde aber spätestens dann unsauber, als auch PayPal, Amazon, DHL oder ELSTER in derselben Markenliste auftauchten.
2. Zielarchitektur
Ein Symbol wie:
FAKE_BANK_BRAND
ist für eine gefälschte ELSTER-Mail offensichtlich fachlich falsch.
Deshalb besteht die aktuelle Architektur aus zwei Ebenen.
Die erste Ebene erkennt allgemeinen Markenmissbrauch:
BRAND_SPOOF_DISPLAY
+
FROM_NEQ_ENVFROM / DMARC_NA
|
v
BRAND_IMPERSONATION
Die zweite Ebene behandelt bankspezifisches Phishing:
BANK_BRAND_DISPLAY
+
LEGIT_BANK_SENDER
+
BANK_PHISH_WORDS_*
|
v
FAKE_BANK_*
Damit können beispielsweise ELSTER, Microsoft, DHL oder Amazon als Markenimitation erkannt werden, ohne dass sie durch eine Bankregel laufen.
Für meine lokale Konfiguration sind insbesondere folgende Dateien relevant:
/etc/rspamd/local.d/multimap.conf
/etc/rspamd/local.d/composites.conf
/etc/rspamd/maps.d/brand_spoof.map
/etc/rspamd/maps.d/bank_brand.map
/etc/rspamd/maps.d/bank_phish_words.map
/etc/rspamd/maps.d/bank_it_display.map
/etc/rspamd/maps.d/legit_bank_domains.map
/etc/rspamd/maps.d/sender_domain_blacklist.map
Die Trennung ist bewusst gewählt. multimap.conf definiert, wie einzelne Merkmale erkannt werden. composites.conf legt fest, wie diese Merkmale miteinander kombiniert werden. Die Dateien unter maps.d enthalten dagegen die veränderlichen Daten wie Marken, Domains oder Textmuster.
Neue Marken können dadurch ergänzt werden, ohne die Entscheidungslogik jedes Mal neu schreiben zu müssen.
3. Generische Marken im From-Displaynamen erkennen
Die zentrale Multimap-Regel sieht inzwischen so aus:
BRAND_SPOOF_DISPLAY {
type = "header";
header = "From";
filter = "email:name";
map = "/etc/rspamd/maps.d/brand_spoof.map";
regexp = true;
score = 6.0;
}
Der wichtige Teil ist:
filter = "email:name";
Damit wird aus:
From: "ELSTER Bestätigung" <cesar@fremde-domain.example>
der sichtbare Name:
ELSTER Bestätigung
für die Map-Prüfung verwendet.
Ebenso entscheidend ist:
regexp = true;
Meine brand_spoof.map verwendet Muster in dieser Form:
/ELSTER/i
/PayPal/i
/Amazon/i
/DHL/i
Rspamd muss daher wissen, dass diese Map reguläre Ausdrücke enthält. Genau das wird durch regexp = true festgelegt.
Dieser kleine Parameter war in meinem Fall entscheidend.
4. Der Fehler: Regex-Map vorhanden, aber nicht aktiv
Der reale ELSTER-Fall wurde zunächst nur mit generischen technischen Merkmalen erkannt.
Der ursprüngliche Scan lag bei:
Score: 5.63 / 15.00
Action: greylist
Rspamd erkannte unter anderem:
DMARC_NA +2.50
HFILTER_HOSTNAME_UNKNOWN +2.50
RCPT_COUNT_ONE +0.50
MANY_INVISIBLE_PARTS +0.20
RCVD_NO_TLS_LAST +0.10
Obwohl der Absender sichtbar:
ELSTER Bestätigung
hieß, erschien kein:
BRAND_SPOOF_DISPLAY
Die Ursache lag nicht in der Bewertung und auch nicht in Bayes. Die Brand-Map enthielt bereits Einträge wie:
/paypal/i
/amazon/i
/dhl/i
/sparkasse/i
/N26/i
/ING/i
/DKB/i
Die zugehörige Multimap-Regel hatte aber ursprünglich keinen aktivierten Regex-Modus.
Nach dem Ergänzen von:
regexp = true;
funktionierte die gesamte bisherige Map erstmals wie vorgesehen.
Das war damit kein ELSTER-spezifischer Fehler. Potenziell waren auch die bereits vorhandenen Marken von dem Problem betroffen.
Besonders tückisch ist: Ein normaler
rspamadm configtest
kann trotzdem erfolgreich sein. Die Konfiguration ist syntaktisch korrekt. Sie tut lediglich fachlich nicht das, was man erwartet.
Deshalb gehört für mich inzwischen zu jeder relevanten Rspamd-Regeländerung auch ein echter Nachrichtentest.
5. Die generische Brand-Map
Die Datei:
/etc/rspamd/maps.d/brand_spoof.map
ist inzwischen nicht mehr als reine Bankenliste gedacht.
Sinnvolle Gruppen sind beispielsweise Behörden und öffentliche Dienste:
/\bELSTER\b/i
/\bMein ELSTER\b/i
/\bFinanzamt\b/i
/\bBundeszentralamt für Steuern\b/i
/\bBZSt\b/i
/\bBundID\b/i
Finanz- und Zahlungsdienste:
/\bPayPal\b/i
/\bKlarna\b/i
/\bTrade Republic\b/i
/\bRevolut\b/i
/\bWise\b/i
Banken:
/\bSparkasse\b/i
/\bN26\b/i
/\bING\b/i
/\bDKB\b/i
/\bCommerzbank\b/i
/\bDeutsche Bank\b/i
/\bPostbank\b/i
/\bConsorsbank\b/i
/\bConsorbank\b/i
/\bVolksbank\b/i
/\bVR[- ]?Bank\b/i
/\bVR Banking\b/i
/\bSecureGO\b/i
/\bSecureGO plus\b/i
/\bSantander\b/i
/\bTARGOBANK\b/i
/\bComdirect\b/i
Paketdienste und Logistik:
/\bDHL\b/i
/\bDeutsche Post\b/i
/\bHermes\b/i
/\bDPD\b/i
/\bGLS\b/i
/\bUPS\b/i
/\bFedEx\b/i
E-Commerce:
/\bAmazon\b/i
/\beBay\b/i
/\bOTTO\b/i
/\bZalando\b/i
/\bTemu\b/i
/\bAliExpress\b/i
Microsoft und Cloud:
/\bMicrosoft\b/i
/\bMicrosoft 365\b/i
/\bOffice 365\b/i
/\bOneDrive\b/i
/\bSharePoint\b/i
/\bMicrosoft Teams\b/i
/\bOutlook\b/i
/\bAzure\b/i
Apple und Google:
/\bApple\b/i
/\biCloud\b/i
/\bApple ID\b/i
/\bApp Store\b/i
/\bGoogle\b/i
/\bGmail\b/i
/\bGoogle Drive\b/i
/\bGoogle Workspace\b/i
Social Media und Messenger:
/\bFacebook\b/i
/\bInstagram\b/i
/\bWhatsApp\b/i
/\bMeta\b/i
/\bLinkedIn\b/i
/\bTikTok\b/i
/\bTelegram\b/i
Streaming:
/\bNetflix\b/i
/\bSpotify\b/i
/\bDisney\+?\b/i
/\bPrime Video\b/i
Telekommunikation:
/\bTelekom\b/i
/\bDeutsche Telekom\b/i
/\bVodafone\b/i
/\bO2\b/i
/\b1&1\b/i
Hosting und Internetdienste:
/\bIONOS\b/i
/\bStrato\b/i
/\bCloudflare\b/i
/\bGoDaddy\b/i
Die Map sollte trotzdem nicht zu einem allgemeinen Unternehmensverzeichnis werden. Jeder zusätzliche Begriff erhöht die Wahrscheinlichkeit, dass auch legitime Nachrichten einen Brand-Treffer erhalten.
Der Treffer selbst ist deshalb noch keine vollständige Phishingentscheidung. Die eigentliche Bewertung erfolgt erst im Kontext.
6. Warum Wortgrenzen sinnvoll sind
Ein einfaches Muster wie:
/Amazon/i
funktioniert, kann aber auch innerhalb größerer Zeichenketten matchen.
Sauberer ist für viele Marken:
/\bAmazon\b/i
oder:
/\bMicrosoft\b/i
Die Wortgrenzen reduzieren unbeabsichtigte Teiltreffer.
Sie sind allerdings ebenfalls kein universelles Mittel. Produktnamen, Bindestriche, Sonderzeichen oder unterschiedliche Schreibweisen müssen jeweils berücksichtigt werden.
Ein Beispiel ist:
/VR[- ]?Bank/i
Damit werden sowohl:
VR-Bank
als auch:
VR Bank
erfasst.
Auch absichtliche oder häufig beobachtete Schreibvarianten können sinnvoll sein:
/Consorsbank/i
/Consorbank/i
Solche Varianten sollten jedoch gezielt auf Basis realer Nachrichten ergänzt werden und nicht durch beliebige Tippfehlergeneratoren entstehen.
7. Bankmarken separat halten
Für bankenspezifische Regeln verwende ich zusätzlich:
/etc/rspamd/maps.d/bank_brand.map
Diese Map enthält bewusst nur Finanz- und Bankmarken.
Die zugehörige Multimap-Regel lautet:
BANK_BRAND_DISPLAY {
type = "header";
header = "From";
filter = "email:name";
map = "/etc/rspamd/maps.d/bank_brand.map";
regexp = true;
score = 0.0;
}
Der Score steht hier bewusst auf:
0.0
weil das Symbol primär als Eingangssignal für stärkere Composite-Regeln dient.
Beispielhafte Einträge:
/\bPayPal\b/i
/\bTrade Republic\b/i
/\bN26\b/i
/\bING\b/i
/\bDKB\b/i
/\bSparkasse\b/i
/\bVolksbank\b/i
/\bVR[- ]?Bank\b/i
/\bVR Banking\b/i
/\bSecureGO\b/i
/\bSecureGO plus\b/i
/\bCommerzbank\b/i
/\bDeutsche Bank\b/i
/\bPostbank\b/i
/\bConsorsbank\b/i
/\bConsorbank\b/i
Damit kann die generische Map breit bleiben, ohne dass jede erkannte Marke automatisch in die Bankenlogik gelangt.
8. Phishingtypische Formulierungen erkennen
Neben der Marke selbst prüfe ich bei Banken typische Formulierungen.
Datei:
/etc/rspamd/maps.d/bank_phish_words.map
Beispiele:
/Adresse.*aktualisieren/i
/persönliche Referenznummer/i
/Unzustellbarkeit/i
/Ihre letzte Adresse/i
/Konto.*gesperrt/i
/Zugang.*eingeschränkt/i
/SecureGO.*reaktivieren/i
/reaktivieren.*Deadline/i
/Deadline.*nicht.*verpassen/i
/Zugang.*reaktivieren/i
/Banking.*reaktivieren/i
/Sicherheitsverfahren.*reaktivieren/i
/Alarmdienst/i
Dazu gehören zwei Multimap-Regeln.
Für den Betreff:
BANK_PHISH_WORDS_SUBJECT {
type = "header";
header = "Subject";
map = "/etc/rspamd/maps.d/bank_phish_words.map";
regexp = true;
score = 3.0;
}
Für den Inhalt:
BANK_PHISH_WORDS_BODY {
type = "content";
map = "/etc/rspamd/maps.d/bank_phish_words.map";
regexp = true;
score = 1.5;
}
Wichtig ist, nicht zu allgemeine Wörter zu verwenden.
Problematisch wären beispielsweise:
Login
Portal
Bestätigung
TAN
verifizieren
Solche Begriffe kommen auch in völlig legitimer Kommunikation regelmäßig vor.
Besser sind Kombinationen wie:
/Konto.*gesperrt/i
oder:
/SecureGO.*reaktivieren/i
Die Regel lautet deshalb: Je allgemeiner das Wort, desto weniger eignet es sich als eigenständiger Phishingindikator.
9. Verdächtige IT- und Sicherheitsrollen
Ein weiteres Muster aus realen Phishing-Mails sind vermeintlich offizielle Funktionsbezeichnungen.
Beispielsweise:
Consorbank IT-Koordination
oder:
Volksbank SecureGO-Alarmdienst
Dafür dient:
/etc/rspamd/maps.d/bank_it_display.map
mit Einträgen wie:
/\bIT[- ]?(Koordination|Support|Service|Sicherheit)\b/i
/\bKundenservice\b/i
/\bSicherheitsabteilung\b/i
/\bTechnischer Support\b/i
/\bSystemwartung\b/i
/\bAlarmdienst\b/i
Die Multimap-Regel:
BANK_IT_DISPLAY {
type = "header";
header = "From";
map = "/etc/rspamd/maps.d/bank_it_display.map";
regexp = true;
score = 1.5;
}
Ein Begriff wie „IT-Support“ darf alleine natürlich keine Nachricht blockieren. Erst in Kombination mit einer bekannten Bankmarke und einer unpassenden Absenderidentität entsteht ein stärkeres Signal.
10. Legitime Bankdomains
Für die Banklogik existiert weiterhin:
/etc/rspamd/maps.d/legit_bank_domains.map
In meinem Setup enthält diese Map beispielsweise:
n26.com
n26.de
ing.de
dkb.de
paypal.com
paypal.de
sparkasse.de
commerzbank.de
deutsche-bank.de
postbank.de
consorsbank.de
consorsbanking.de
vr.de
volksbank.de
Die zugehörige Regel:
LEGIT_BANK_SENDER {
type = "from";
filter = "email:domain";
map = "/etc/rspamd/maps.d/legit_bank_domains.map";
score = -6.0;
}
Eine Domain sollte nur aufgenommen werden, wenn ihre Zugehörigkeit wirklich verifiziert wurde.
Nicht ausreichend ist:
SPF hat bestanden
oder:
DKIM hat bestanden
Das beweist lediglich, dass die Nachricht technisch zur verwendeten Domain passt.
Ebenso wenig sollte eine Domain allein deshalb aufgenommen werden, weil sie in einer scheinbar legitimen Mail auftaucht.
11. Die Einschränkung globaler Domain-Allowlisten
Auch die bestehende Bank-Allowlist besitzt eine konzeptionelle Schwäche.
Angenommen, sowohl PayPal als auch eine Volksbank befinden sich in den Brand-Maps und paypal.com ist eine legitime Domain. Dann wäre theoretisch folgende Nachricht denkbar:
From: "Volksbank Sicherheit" <service@paypal.com>
Eine globale Domainprüfung kann erkennen:
paypal.com ist grundsätzlich legitim
Sie beantwortet jedoch nicht:
Gehört paypal.com zur Marke Volksbank?
Für eine strengere Architektur wäre langfristig eine direkte Zuordnung sinnvoll:
PayPal
-> paypal.com
-> paypal.de
N26
-> n26.com
-> n26.de
Consorsbank
-> consorsbank.de
-> consorsbanking.de
Bei einer wachsenden Regelbasis wäre dafür eine Lua-Regel oder eine strukturierte Brand-Domain-Zuordnung sauberer als eine einzige globale Allowlist.
Für die generische BRAND_IMPERSONATION-Erkennung verwende ich deshalb bewusst nicht einfach eine pauschale Liste aller vermeintlich legitimen Amazon-, Microsoft-, DHL-, Apple- oder Google-Versanddomains. Gerade große Anbieter verwenden verschiedene Versandplattformen, Subdomains und Dienstleister. Eine unvollständige Allowlist kann sehr schnell neue False Positives oder blinde Flecken erzeugen.
12. Generische Brand-Impersonation
Der Kern der neuen Architektur steckt in:
/etc/rspamd/local.d/composites.conf
Die generische Regel lautet:
BRAND_IMPERSONATION {
expression = "(FROM_NEQ_ENVFROM | DMARC_NA) & BRAND_SPOOF_DISPLAY";
score = 8.0;
policy = "leave";
}
Damit sind zwei Ebenen erforderlich.
Erstens muss eine geschützte Marke im Anzeigenamen erkannt werden:
BRAND_SPOOF_DISPLAY
Zweitens muss zusätzlich eine Auffälligkeit in der Absenderstruktur bestehen:
FROM_NEQ_ENVFROM
oder:
DMARC_NA
Aus:
Marke
+
auffällige Absenderlage
wird:
BRAND_IMPERSONATION
Das ist wesentlich allgemeiner als die frühere FAKE_BANK_BRAND-Regel.
policy = "leave" ist hier ebenfalls bewusst gesetzt. Damit bleiben die beteiligten Einzelsymbole beziehungsweise ihre Scores erhalten, statt vollständig durch das Composite ersetzt zu werden. Rspamd bietet über Composite-Policies genau diese Steuerungsmöglichkeit.
13. PHISH_CORE von Brand-Impersonation trennen
Vor der Umstellung sah meine Logik sinngemäß so aus:
PHISH_CORE {
expression = "(FROM_NEQ_ENVFROM | DMARC_NA) &
(BRAND_SPOOF_DISPLAY | RECEIVED_SPAMHAUS_XBL)";
score = 8.0;
}
Damit waren zwei unterschiedliche Dinge in derselben Regel vermischt:
Markenmissbrauch
und:
IP-Reputation
Nach dem Refactoring ist PHISH_CORE enger:
PHISH_CORE {
expression = "(FROM_NEQ_ENVFROM | DMARC_NA) &
RECEIVED_SPAMHAUS_XBL";
score = 8.0;
}
Die Brand-Erkennung läuft separat über:
BRAND_IMPERSONATION
Das macht die Ergebnisse verständlicher und erleichtert spätere Analysen.
Eine ELSTER-Mail soll als:
BRAND_IMPERSONATION
erscheinen und nicht zufällig über eine Bank- oder IP-Regel erklärt werden.
14. Bankregeln bleiben separat
Für das eigentliche Bank-Phishing existieren weiterhin stärkere Regeln.
Eine verdächtige IT- oder Sicherheitsrolle:
FAKE_BANK_IT_SENDER {
expression = "BANK_BRAND_DISPLAY &
!LEGIT_BANK_SENDER &
BANK_IT_DISPLAY";
score = 8.0;
}
Phishingtypische Formulierungen:
FAKE_BANK_PHISHING {
expression = "BANK_BRAND_DISPLAY &
!LEGIT_BANK_SENDER &
(BANK_PHISH_WORDS_SUBJECT |
BANK_PHISH_WORDS_BODY)";
score = 12.0;
}
Eine bereits bekannte schädliche Absenderdomain in Verbindung mit Phishingtext:
KNOWN_BAD_SENDER_WITH_PHISH_WORDS {
expression = "SENDER_DOMAIN_LOCAL_BLACKLIST &
(BANK_PHISH_WORDS_SUBJECT |
BANK_PHISH_WORDS_BODY)";
score = 15.0;
}
Der wichtige Unterschied zum alten Aufbau ist:
BANK_BRAND_DISPLAY
statt:
BRAND_SPOOF_DISPLAY
Dadurch kann eine ELSTER-, Amazon- oder DHL-Mail diese Bankregeln nicht mehr allein deshalb auslösen, weil die Marke in der allgemeinen Brand-Map steht.
15. Bekannte schädliche Absenderdomains
Zusätzlich pflege ich:
/etc/rspamd/maps.d/sender_domain_blacklist.map
Dort gehören nur tatsächlich untersuchte beziehungsweise ausreichend eindeutig schädliche Domains hinein.
Eine ganze Domain sollte nicht vorschnell gesperrt werden. Gerade bei kompromittierten Benutzerkonten ist durchaus möglich, dass nur ein einzelnes Postfach missbraucht wurde, während die übrige Domain legitime Kommunikation versendet.
Vor einer dauerhaften Sperre prüfe ich deshalb insbesondere:
- Wurde bereits mehrfach Spam oder Phishing von der Domain beobachtet?
- Ist legitime Kommunikation mit dieser Organisation zu erwarten?
- Handelt es sich nur um ein kompromittiertes Benutzerkonto?
- Reicht eine Absenderadresse statt einer vollständigen Domain?
- Gibt es weitere unabhängige Reputationsergebnisse?
Eine Domain-Blacklist ist ein nützlicher zusätzlicher Layer. Sie ersetzt jedoch keine generische Brand-Erkennung, weil Angreifer Domains jederzeit wechseln können.
16. Ein realer ELSTER-Fall
Der konkrete Anlass für die Erweiterung war folgende Nachricht:
From: "ELSTER Bestätigung"
<cesar@multiverseaerospacepartners.com>
Subject:
ELSTER: Wichtiger Hinweis zu Ihren Steuerdaten
Die Nachricht wurde über ein authentifiziertes SMTP-Konto verschickt.
Im Header tauchte unter anderem auf:
X-Authenticated-UID:
cesar@multiverseaerospacepartners.com
sowie:
RCVD_VIA_SMTP_AUTH
Der Absender verwendete also nicht einfach nur einen gefälschten MIME-From-Header. Die Nachricht lief über eine tatsächlich authentifizierte Mailinfrastruktur.
Beim ersten Scan ergab sich:
Action: greylist
Spam: false
Score: 5.63 / 15.00
mit:
DMARC_NA 2.50
HFILTER_HOSTNAME_UNKNOWN 2.50
RCPT_COUNT_ONE 0.50
MANY_INVISIBLE_PARTS 0.20
RCVD_NO_TLS_LAST 0.10
Es fehlte:
BRAND_SPOOF_DISPLAY
Nach Aktivierung von:
regexp = true;
funktionierte die bestehende Brand-Map.
Zunächst löste die Nachricht dadurch allerdings noch die alte:
FAKE_BANK_BRAND
aus.
Das war zwar technisch effektiv, aber fachlich offensichtlich falsch. Daraufhin wurde die Brand-Logik von der Bankenlogik getrennt.
17. Ergebnis nach dem Refactoring
Der gleiche gespeicherte ELSTER-Fall ergab nach der Umstellung:
Action: reject
Spam: true
Score: 29.18 / 15.00
Entscheidend waren nun:
BRAND_SPOOF_DISPLAY (6.00)[ELSTER Bestätigung]
BRAND_IMPERSONATION (8.00)
DMARC_NA (2.50)
Zusätzlich hatte sich inzwischen auch der statistische Klassifikator eindeutig positioniert:
BAYES_SPAM (7.98)[99.97%]
Die Regressionstests bestätigten:
[OK] Action = reject
[OK] BRAND_IMPERSONATION feuert
[OK] FAKE_BANK_BRAND entfernt
[OK] ELSTER läuft nicht mehr über PHISH_CORE
Damit entspricht auch die Symbolik wieder der tatsächlichen Ursache.
Die Mail wird nicht abgelehnt, weil sie angeblich eine gefälschte Bank wäre. Sie wird abgelehnt, weil eine bekannte Marke im sichtbaren Absender mit einer auffälligen technischen Absenderlage kombiniert wird.
18. Die vorhandenen Action-Schwellen berücksichtigen
Rspamd berechnet zunächst einen Score und leitet daraus anhand der konfigurierten Actions die gewünschte Behandlung ab.
In meinem hier getesteten Setup liegt die Reject-Grenze bei:
15.00
Der ursprüngliche ELSTER-Scan:
5.63 / 15.00
reichte deshalb nicht aus.
Nach der Brand-Erkennung:
29.18 / 15.00
war der Fall eindeutig.
Die konkreten Schwellenwerte sollte man allerdings niemals aus einem Blogbeitrag blind übernehmen. Entscheidend ist die eigene:
/etc/rspamd/local.d/actions.conf
beziehungsweise die tatsächlich aktive Konfiguration.
Die richtige Höhe hängt stark von den übrigen Symbolgewichten, der Art des Mailverkehrs und der gewünschten Behandlung zwischen Greylisting, Header-Markierung, Spamordner und Reject ab.
19. Bayes ist ein zusätzliches Signal, kein Ersatz für Regeln
Beim ursprünglichen ELSTER-Test erkannte Bayes die Nachricht zunächst sogar leicht als Ham:
BAYES_HAM (-0.07)[60.65%]
Später lag der gleiche Fall bei:
BAYES_SPAM (7.98)[99.97%]
Das zeigt gut, warum statistische Verfahren nicht die einzige Schutzschicht sein sollten.
Ein Klassifikator kann durch Trainingsdaten, neue Kampagnen oder bisher unbekannte Nachrichtentypen falsch liegen. Die Brand-Regel funktioniert dagegen deterministisch:
ELSTER im Displaynamen
+
auffällige Absenderlage
=
BRAND_IMPERSONATION
Eine eindeutig als Spam identifizierte Nachricht kann mit Rspamd nachtrainiert werden:
rspamc learn_spam < phishing.eml
Eine legitime Nachricht, die fälschlicherweise gelernt wurde:
rspamc learn_ham < legitime-mail.eml
Bei einer Dovecot-Integration kann dieses Feedback auch automatisiert an Benutzeraktionen wie das Verschieben in oder aus dem Spamordner gekoppelt werden. Rspamd unterstützt entsprechende Lernoperationen über rspamc.
20. RBL-, URL- und Reputationsergebnisse
Brand-Impersonation darf nicht bedeuten, dass andere Rspamd-Mechanismen unwichtig werden.
Bei verdächtigen Nachrichten sind weiterhin interessant:
- Absender-IP-Reputation
- Spamhaus und andere DNSBLs
- URL-Reputation
- Phishingfeeds
- Redirector-Erkennung
- Fuzzy-Hashes
- Pyzor
- MIME-Anomalien
- versteckte HTML-Elemente
- ungewöhnliche Header
- SMTP-AUTH-Herkunft
- Bayes
- Neural-Ergebnisse
Beim untersuchten ELSTER-Fall enthielt die Nachricht beispielsweise URLs wie:
fonts.googleapis.com
und:
narrows-tuck-doric-glossy-vb-673adb8d.s3.us-east-2.amazonaws.com
Ein Amazon-S3-Host ist alleine natürlich kein Phishingbeweis. Cloudspeicher und CDN-Infrastrukturen werden sowohl legitim als auch missbräuchlich verwendet.
Gerade deshalb ist die Kombination mehrerer unabhängiger Merkmale so wichtig.
21. Greylisting ist kein ausreichender Phishing-Schutz
Der ursprüngliche ELSTER-Scan endete bei:
Action: greylist
Greylisting kann gegen einfache Bots und schlecht konfigurierte Spaminfrastruktur hilfreich sein. Gegen kompromittierte beziehungsweise reguläre Mailkonten ist seine Wirkung jedoch begrenzt.
Ein echter Hostinganbieter oder normaler MTA versucht eine Nachricht nach einem temporären SMTP-Fehler erneut zuzustellen.
Damit erfüllt der Angreifer genau das Verhalten, das Greylisting von einem legitimen Sender erwartet.
Greylisting bleibt deshalb eine zusätzliche Schicht. Es ersetzt weder Brand-Impersonation noch URL-, Reputation- oder Inhaltsanalyse.
22. Konfiguration immer testen
Nach Änderungen an strukturellen Rspamd-Dateien führe ich grundsätzlich zunächst aus:
rspamadm configtest
Nur wenn:
syntax OK
zurückkommt, wird die aktive Konfiguration geladen:
systemctl reload rspamd
Das reicht alleine jedoch nicht.
Der heutige Regex-Fehler hat gerade gezeigt, dass:
syntax OK
nicht automatisch bedeutet:
Regel funktioniert fachlich wie erwartet
Deshalb folgt anschließend ein echter Rescan.
23. Nachrichten direkt aus Dovecot testen
Auf meinem System liegt der relevante Maildir unter:
/var/vmail/mailboxes/okami.de/okami/mail
Eine Nachricht kann beispielsweise über ihre Message-ID gesucht werden:
grep -RIl \
'a5992d8672a4919abd87ce6590e4cfd69601ff@multiverseaerospacepartners.com' \
/var/vmail/mailboxes/okami.de/okami/mail
Der konkrete ELSTER-Testfall lag unter:
/var/vmail/mailboxes/okami.de/okami/mail/cur/
Eine gefundene Datei kann dann direkt gegen den normalen Rspamd-Worker getestet werden:
FILE='/var/vmail/mailboxes/okami.de/okami/mail/cur/<maildatei>'
rspamc -h 127.0.0.1:11333 symbols < "$FILE"
Das ist besonders hilfreich, weil exakt dieselbe reale Nachricht nach jeder Änderung erneut ausgewertet werden kann.
Damit entsteht aus einem einmaligen Phishingvorfall ein dauerhafter Regressionstest.
24. Sinnvolle Regressionstests
Nach Änderungen an Brand-Maps oder Composites sollten nicht nur bekannte Phishing-Mails getestet werden.
Mindestens folgende Fälle sind sinnvoll.
Legitime normale Mail
Erwartung:
kein BRAND_SPOOF_DISPLAY
kein BRAND_IMPERSONATION
keine FAKE_BANK-Regel
Generische bekannte Marke von auffälligem Absender
Beispiel:
From: "ELSTER Bestätigung" <test@fremde-domain.example>
bei entsprechender technischer Auffälligkeit.
Erwartung:
BRAND_SPOOF_DISPLAY
BRAND_IMPERSONATION
Bankmarke mit Phishingtext
Beispiel:
From: "Volksbank Sicherheit" <test@fremde-domain.example>
Subject: SecureGO reaktivieren – Deadline nicht verpassen
Erwartete Signale können sein:
BRAND_SPOOF_DISPLAY
BANK_BRAND_DISPLAY
BANK_PHISH_WORDS_SUBJECT
FAKE_BANK_PHISHING
Supportbegriff ohne Bankmarke
Beispiel:
From: "IT-Support" <support@firma.example>
Hier darf ein möglicherweise vorhandenes:
BANK_IT_DISPLAY
nicht automatisch zu:
FAKE_BANK_IT_SENDER
führen.
Bekannte Marke in legitimer Kommunikation
Gerade nach einer deutlichen Erweiterung von brand_spoof.map müssen echte Microsoft-, Amazon-, DHL-, PayPal-, Apple- oder Google-Mails beobachtet werden.
Ein:
BRAND_SPOOF_DISPLAY
ist bei einer solchen Mail nicht automatisch ein Fehler. Entscheidend ist, ob das nachfolgende Composite ebenfalls auslöst und ob die Gesamtbewertung plausibel bleibt.
25. Dateirechte
Für lokale Map-Dateien reichen üblicherweise Leserechte für Rspamd und Schreibrechte nur für den Administrator.
Beispielsweise:
chmod 644 /etc/rspamd/maps.d/brand_spoof.map
chmod 644 /etc/rspamd/maps.d/bank_brand.map
chmod 644 /etc/rspamd/maps.d/bank_phish_words.map
chmod 644 /etc/rspamd/maps.d/bank_it_display.map
chmod 644 /etc/rspamd/maps.d/legit_bank_domains.map
chmod 644 /etc/rspamd/maps.d/sender_domain_blacklist.map
Der Besitzer kann beispielsweise:
chown root:root /etc/rspamd/maps.d/*.map
sein.
Entscheidend ist, dass der Rspamd-Prozess die Dateien lesen kann und unprivilegierte Benutzer sie nicht verändern dürfen.
26. Änderungen automatisieren und Backups erzeugen
Bei größeren Umbauten ändere ich die Dateien inzwischen nicht mehr manuell ohne Sicherung.
Vor strukturellen Änderungen werden die betroffenen Konfigurationen in ein zeitgestempeltes Verzeichnis kopiert, beispielsweise:
/root/rspamd-brand-architecture-20260920-093433
Erst danach werden Maps und Composites verändert.
Der Ablauf ist grundsätzlich:
Backup
↓
Änderung
↓
rspamadm configtest
↓
Reload
↓
configdump prüfen
↓
echte Mail erneut scannen
↓
Regressionsergebnis kontrollieren
Bei einem fehlgeschlagenen configtest kann automatisiert auf die vorher gesicherten Dateien zurückgerollt werden.
Gerade bei einem Mailserver ist das wesentlich sinnvoller als mehrere Änderungen gleichzeitig manuell vorzunehmen und anschließend nicht mehr eindeutig nachvollziehen zu können, welcher Schritt einen Fehler verursacht hat.
27. Aktive Konfiguration kontrollieren
Nach dem Reload sollte nicht nur die Datei auf der Festplatte betrachtet werden.
Mit:
rspamadm configdump multimap
kann geprüft werden, ob Rspamd beispielsweise tatsächlich Folgendes geladen hat:
BRAND_SPOOF_DISPLAY {
type = "header";
header = "From";
filter = "email:name";
map = "/etc/rspamd/maps.d/brand_spoof.map";
regexp = true;
score = 6.0;
}
und:
BANK_BRAND_DISPLAY {
type = "header";
header = "From";
filter = "email:name";
map = "/etc/rspamd/maps.d/bank_brand.map";
regexp = true;
score = 0.0;
}
Entsprechend lassen sich die aktiven Composites prüfen:
rspamadm configdump composites
Dort sollten unter anderem die gewünschte:
BRAND_IMPERSONATION
und die getrennten Bankregeln erscheinen.
Damit lässt sich unterscheiden zwischen:
Datei wurde geändert
und:
Rspamd verwendet die Änderung tatsächlich
28. Typische Fehler
Regex-Muster ohne Regex-Modus
Das war der wichtigste Fund aus dem realen Betrieb.
Eine Map enthält:
/ELSTER/i
/Amazon/i
/DHL/i
aber die Multimap besitzt kein:
regexp = true;
Die Konfiguration kann trotzdem syntaktisch gültig sein.
Deshalb immer einen echten Match testen.
Zu allgemeine Begriffe
Schlecht:
/Login/i
/Portal/i
/Bestätigung/i
/TAN/i
Besser:
/Konto.*gesperrt/i
/SecureGO.*reaktivieren/i
/Adresse.*aktualisieren/i
Einzelne Merkmale überbewerten
Ein Supportbegriff oder eine Marke alleine sollte nicht ohne Kontext sofort einen extremen Score erzeugen.
Hohe Bewertungen gehören auf Kombinationen.
SPF als Vertrauenssignal für die sichtbare Marke interpretieren
Ein:
R_SPF_ALLOW
bedeutet nicht:
ELSTER ist der Absender
Es bedeutet nur, dass der sendende Server zur tatsächlich geprüften SPF-Domain passt.
DKIM überbewerten
Das gleiche gilt für DKIM.
Ein gültiges DKIM-Signaturergebnis bestätigt die signierende Domain, nicht automatisch den sichtbaren Markennamen.
Eine globale Domain-Allowlist als Markenbeziehung interpretieren
paypal.com
kann eine legitime PayPal-Domain sein.
Das bedeutet nicht, dass:
"Volksbank Sicherheit" <service@paypal.com>
plötzlich plausibel ist.
Bayes blind vertrauen
Auch ein eindeutiger Phishing-Fall kann zunächst:
BAYES_HAM
bekommen.
Statistische Modelle sind ein zusätzlicher Layer, keine Wahrheit.
Ganze Domains sofort blockieren
Ein kompromittiertes Konto macht nicht zwangsläufig jede Mail derselben Domain bösartig.
29. Pflegeprozess
Eine lokale Phishing-Regelbasis muss gepflegt werden, sollte aber nicht für jede einzelne Spam-Mail um eine neue Spezialregel wachsen.
Bei neuen Fällen prüfe ich zunächst:
- Welcher sichtbare Anzeigename wurde verwendet?
- Welche Marke wird imitiert?
- Welche tatsächliche From-Domain wurde verwendet?
- Wie lautet der Envelope-From?
- Welche SPF-, DKIM- und DMARC-Ergebnisse liegen vor?
- Wurde SMTP AUTH verwendet?
- Welche Systeme stehen in der Received-Kette?
- Welche URLs enthält die Nachricht?
- Welche Rspamd-Symbole wurden ausgelöst?
- Wie bewertet Bayes die Nachricht?
- Existiert die Marke bereits in der Brand-Map?
- Fehlt tatsächlich eine generische Regel oder nur ein einzelnes Sample?
Danach kann entschieden werden, ob:
eine Marke ergänzt
ein spezifisches Textmuster ergänzt
eine schädliche Domain aufgenommen
Bayes nachtrainiert
oder:
überhaupt nichts geändert
werden sollte.
Nicht jeder Spam braucht eine eigene Regel. Ziel ist eine kleine Zahl sinnvoll generalisierender Mechanismen.
30. Was die erweiterte Brand-Liste verändert
Mit der Ausweitung auf ELSTER, Microsoft, DHL, Amazon, Apple, Google, Paketdienste, Telekommunikationsanbieter und weitere häufig imitierte Marken steigt zwangsläufig auch die Bedeutung von False-Positive-Tests.
Eine große Marke kann legitimerweise im Anzeigenamen auftauchen.
Das ist sogar der Normalfall.
Deshalb lautet die Regel eben nicht:
Microsoft im From
=
Spam
sondern:
Microsoft im From
+
auffällige Absenderkonstellation
=
verdächtig
Die Trennung zwischen:
BRAND_SPOOF_DISPLAY
und:
BRAND_IMPERSONATION
ist daher besonders wichtig.
Das erste Symbol beschreibt eine Beobachtung.
Das zweite beschreibt eine Kombination, die als Sicherheitsindikator verwendet wird.
31. Nächste sinnvolle Ausbaustufe: Brand-Domain-Zuordnung
Die aktuelle Architektur verbessert die Erkennung deutlich, ist aber noch nicht das theoretisch präziseste Modell.
Der nächste Schritt wäre eine direkte Zuordnung:
ELSTER
-> elster.de
PayPal
-> paypal.com
-> paypal.de
N26
-> n26.com
-> n26.de
und entsprechend für weitere Marken.
Dann könnte die Logik tatsächlich sagen:
Brand = ELSTER
From-Domain = elster.de
=> plausibel
beziehungsweise:
Brand = ELSTER
From-Domain = multiverseaerospacepartners.com
=> nicht passend
Das wäre präziser als eine globale Legit-Domain-Liste.
Bei wenigen Marken ließe sich dies über separate Multimaps lösen. Bei einer größeren Sammlung wäre eine Lua-basierte Lookup-Struktur vermutlich besser wartbar.
Wichtig ist dabei weiterhin: Nur verifizierte Domainbeziehungen eintragen. Keine Vermutungen, keine aus einzelnen Mails abgeleiteten Versanddomains und keine automatisch aus SPF erzeugten Allowlists.
32. Weitere sinnvolle Härtung
Nach der Brand-Architektur bieten sich weitere Ausbaustufen an.
Interessant sind insbesondere eine kontrollierte Brand-Domain-Zuordnung, automatisierte Regressionstests, Dovecot-/IMAPSieve-Feedback für Bayes, systematische URL- und Redirect-Auswertung sowie die Beobachtung realer False Positives.
Auch Neural- und andere statistische Klassifikatoren sollten nicht isoliert betrachtet werden. Entscheidend bleibt der Vergleich mit realen Nachrichten.
Für besonders präzise Kombinationen können später auch erzwungene Actions interessant sein. Solche Regeln sollten aber nur dann eingesetzt werden, wenn die False-Positive-Wahrscheinlichkeit durch ausreichend viele Tests praktisch ausgeschlossen wurde.
Fazit
Moderne Phishing-Mails sind häufig technisch wesentlich sauberer als klassische Spam-Nachrichten. Ein Angreifer muss SPF nicht umgehen, wenn er ein echtes Konto oder einen regulären Mailserver verwenden kann. Er muss DKIM nicht brechen, wenn seine eigene oder eine kompromittierte Domain korrekt signieren kann. Und auch eine technisch unauffällige Mail kann trotzdem versuchen, sich im sichtbaren Anzeigenamen als ELSTER, Microsoft, DHL, PayPal oder eine Bank auszugeben.
Deshalb reicht es nicht, ausschließlich zu fragen, ob die technische Absenderdomain authentifiziert wurde. Zusätzlich muss geprüft werden, welche Identität der Benutzer tatsächlich angezeigt bekommt.
Die generische Erkennung folgt inzwischen diesem Prinzip:
bekannte Marke im sichtbaren Anzeigenamen
+
auffällige technische Absenderkonstellation
=
BRAND_IMPERSONATION
Banken erhalten darüber hinaus eigene Prüfungen für bekannte Bankmarken, legitime Domains, verdächtige Funktionsbezeichnungen und phishingtypische Texte.
Der wichtigste praktische Fund bei der Umsetzung war dabei kein spektakulärer Angriff, sondern ein unscheinbarer Konfigurationsparameter. Die Brand-Map enthielt bereits reguläre Ausdrücke, regexp = true fehlte jedoch in der Multimap-Regel. Die Konfiguration war syntaktisch gültig und die vermeintliche Schutzschicht vorhanden – sie matchte nur nicht.
Der reale ELSTER-Test machte diesen Fehler sichtbar. Nach der Korrektur und der anschließenden Trennung von generischer Brand-Impersonation und Bank-Phishing stieg derselbe Testfall von:
5.63 / 15.00
Action: greylist
auf:
29.18 / 15.00
Action: reject
mit:
BRAND_SPOOF_DISPLAY (6.00)[ELSTER Bestätigung]
BRAND_IMPERSONATION (8.00)
Genau deshalb besteht Mailserver-Härtung für mich nicht nur aus dem Schreiben von Regeln. Sie besteht aus Regeln, nachvollziehbaren Maps, Backups, configtest, Kontrolle der tatsächlich geladenen Konfiguration und reproduzierbaren Tests mit echten Nachrichten.
Eine Regel, die auf dem Papier richtig aussieht, ist erst dann eine funktionierende Schutzmaßnahme, wenn ein realer Test nachweist, dass sie tatsächlich auslöst.
