Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
rspamd...aus der Perspektive einesHobbyadmins
Chemnitzer Linuxtage16. März 2019Pieter Hollants
2019
Edition
I. Einführung
Pieter wer?
Entwickler (vorallem Python) imRhein-Main-Gebiet, aber auch...
➔ 3J Support-Front (zu Netware/Win95-Zeiten)➔ 9J (Senior) Werkstudent im SUSE Consulting➔ 4J Linux Systems Engineer bei der Deutschen
Flugsicherung (u.a. Automatisierte Installationen hoch-verfügbarer Systeme, Hardware Standardisierung)
...und Freelancer seit über 16J (Dev & Admin)
“E-Mail? Nimmt man doch fertig von der Stange”
E-Mail = Gmail?
https://money.cnn.com/2014/04/01/technology/gmail/index.html
Eigener Server = doofe Idee?
https://www.geekwire.com/2015/why-you-shouldnt-try-to-host-your-own-email/
https://www.digitalocean.com/community/tutorials/why-you-may-not-want-to-run-your-own-mail-server
https://nilead.com/article/5-reasons-you-should-not-host-your-own-email
Gründe für eigenen Server
Private Daten bleiben privat➔ keine automatisierten Auswertungen (Werbung...)➔ aber: nutzt wenig, wenn andere Seite bei GMail & co.
Volle Kontrolle übers Mailsystem➔ unendlich Speicherplatz, E-Mail-Adressen, Aliase...➔ Spamfilterung, Virenscans, E-Mail-Sicherheit
Unabhängigkeit von anderen Anbietern➔ Tarifänderungen, komplette Diensteinstellung➔ Kostenfaktoren
nach https://thomas-leister.de/warum-eigener-mailserver/
Gründe gegen eigenen Server
Es ist Arbeit!➔ Komplexes System mit vielen Komponenten➔ Einmal manuell eingerichtet = in zwei Jahren vergessen➔ Laufender administrativer Aufwand (vermisste Mails, Konfigurationstuning, Zertifikate...)
Rechtlicher Rahmen➔ eigentlich nur für Soloselbständige empfehlenswert, maximal Familien➔ eigene kleine Firma besser bei unabhängigen Mailprovidern aufgehoben
Gründe gegen eigenen Server
Es ist Arbeit!➔ Komplexes System mit vielen Komponenten➔ Einmal manuell eingerichtet = in zwei Jahren vergessen➔ Laufender administrativer Aufwand (vermisste Mails, Konfigurationstuning, Zertifikate...)
Rechtlicher Rahmen➔ eigentlich nur für Soloselbständige empfehlenswert, maximal Familien➔ eigene kleine Firma besser bei unabhängigen Mailprovidern aufgehoben
WikiMedia Commons / Qwertyxp2000 / C
C-BY-SA
Mailserveranatomie (1/2)
Mailserveranatomie (2/2)
➔ Erhöhte Komplexität durch Spam, Viren & co., hier am Beispiel von Postfix➔ Traditionell amavisd-new als Interface zwischen MTA und Content scanner
➔ SpamAssassin: Mail filter, in Perl geschrieben, automatisiertes Update der Regeln per Cronjob
➔ Virenscanner wie clamav, kommerzielle Vertreter➔ Zwei smtpd-Instanzen benötigt: eine mit amavisd-new als Content Filter, eine ohne
II. Meet rspamd
9
Hintergrund
➔ Geschrieben durch Vsevolod Stakhov➔ Neuentwicklung aus Betroffenheit heraus:
➔ Administrierte E-Mail Systeme bei rambler.ru ➔ Vorhandene Lösungen erzeugten zuviel CPU-Last
➔ Releases: 0.2.7 (2009) → 1.0 (2015) → 1.9.0 (12.03.2019)➔ Ziel: Performance für “Mass mail processing”➔ Apache 2.0-Lizenz
https://de.slideshare.net/VsevolodStakhov/rspamdfosdem-57772063
Grundprinzip
➔ MTA reicht empfangene Mails an rspamd weiter➔ z.B. Milter-Schnittstelle
➔ Module werten Mails anhand von Regeln/Tests aus➔ Jeder Test wird durch Symbol (Name) identifiziert➔ Konfiguration weist Symbolen Scores zu➔ Gesamtscore = ∑ Scores zutreffender Tests➔ Abhängig von Gesamtscore Empfehlung an MTA
➔ Pass➔ Reject➔ Add header
Features
➔ Content scanning➔ Reguläre Ausdrücke➔ Fuzzy hashes
➔ Policy checks➔ SPF, DKIM, DMARC, ARC➔ Realtime blacklists (RBLs): DNS-based IP checks, URLs➔ Phishing checks➔ IP reputation, Rate limits
➔ Greylisting➔ Statistical tools
➔ Bayes classifier➔ Neural networks➔ Integriertes Webinterface inkl. Statistiken
Architektur
➔ Kern in C geschrieben, Erweiterungsmodule in C/Lua➔ Eventgetriebenes Prozessmodell
➔ Paralleles Abarbeiten von Regeln➔ Asynchrone Netzwerkrequests
➔ Unterschiedliche Typen von Regeln➔ Pre rules (z.B. Greylisting)➔ Normal rules (Scoring positiv/negativ)➔ Post rules (z.B. Composite rules)
➔ Verschiedene Prozesse➔ Hauptprozess (Config, Logs, Prozessmanagement)➔ Scannerprozesse (Scannen Mails)➔ Workerprozesse (Controller (API), Service (z.B. Lua host))
➔ Viele Module nutzen Redis als Cache
III. Konfigurationstheorie
18
Konfigurierbares
➔ Zu aktivierende Module➔ Eingebaute Module (C) vs. externe Lua-Module
➔ Modul-spezifische Konfigurationsoptionen➔ z.B. antivirus: welche Virenscanner sollen verwendet werden
➔ Scores (Kommazahlen)➔ z.B. Default config: FORGED_SENDER (Absender in Envelope und From: unterschiedlich) Gewicht 0,30
➔ Aktionen bei Gesamtscore X➔ z.B. Default config: Greylisting ab Gesamtscore 4,0
➔ Worker-Konfiguration➔ z.B. Listen-Sockets, Skalierung
➔ Allgemeine Optionen➔ z.B. Timeouts
Konfigurierbares
➔ Zu aktivierende Module➔ Eingebaute Module (C) vs. externe Lua-Module
➔ Modul-spezifische Konfigurationsoptionen➔ z.B. antivirus: welche Virenscanner sollen verwendet werden
➔ Scores (Kommazahlen)➔ z.B. Default config: FORGED_SENDER (Absender in Envelope und From: unterschiedlich) Gewicht 0,30
➔ Aktionen bei Gesamtscore X➔ z.B. Default config: Greylisting ab Gesamtscore 4,0
➔ Worker-Konfiguration➔ z.B. Listen-Sockets, Skalierung
➔ Allgemeine Optionen➔ z.B. Timeouts
Austarieren dieser Stellschraubenentscheidet über Erfolg oder Misserfolg
des gesamten Spamfilters!
https://rspamd.com/doc/modules/ (Aug 2018)
Modulkategorisierung
1. Module, die aufgrund Absender/Empfänger Domain/IP agieren2. Module, die Nachrichtensignaturen überprüfen (gegen DNS-Einträge) oder selbst hinzufügen3. Module, die Nachrichteninhalte gegen (DNS) Blacklisten prüfen4. Module, die Nachrichten ohne DNS-Interaktion analysieren5. Module, die Metadaten wie z.B. Absenderdomains an externe Datenbanken weiterleiten6. Module, die statt Tests Aktionen implementieren7. Sonstige Module
Im Folgenden: Unterstrichen = eingebaute C Module; Rest = Lua
Module (1/7)
Module, die aufgrund Absender/Empfänger Domain/IP agieren:➔ asn: Findet Autonomous System Number (ASN), Ländercode und Subnet von Absender IPs heraus
➔ ip_score: Trackt die Anzahl empfangener Nachrichten von einer IP, einem Subnet, einem ASN oder einem Land
➔ mx_check: Prüft, ob die Senderdomain im Envelope wenigstens einen erreichbaren MX hat (Standardconfig: aus)
➔ ratelimit: Begrenzt Mails von/für bestimmte Absender/Empfänger mittels Leaky Bucket-Methode
➔ rbl: Prüft Absender-IP gegen RBLs, Reverse DNS-Einträge, “Received:” Adressen und HELO/EHLO Parameter
➔ spf: Prüft die Sender Policy Framework (SPF) Policy der Absenderdomain
Module (1/7)
Module, die aufgrund Absender/Empfänger Domain/IP agieren:➔ asn: Findet Autonomous System Number (ASN), Ländercode und Subnet von Absender IPs heraus
➔ ip_score: Trackt die Anzahl empfangener Nachrichten von einer IP, einem Subnet, einem ASN oder einem Land
➔ mx_check: Prüft, ob die Senderdomain im Envelope wenigstens einen erreichbaren MX hat (Standardconfig: aus)
➔ ratelimit: Begrenzt Mails von/für bestimmte Absender/Empfänger mittels Leaky Bucket-Methode
➔ rbl: Prüft Absender-IP gegen RBLs, Reverse DNS-Einträge, “Received:” Adressen und HELO/EHLO Parameter
➔ spf: Prüft die Sender Policy Framework (SPF) Policy der Absenderdomain
.ru/.cn = Punktabzug?
Komplex
Einsatzszenario?
Aber Vorsicht...
https://digitalcourage.de/blog/2018/copyright-kampagnenseite-blocked
Module (2/7)
Module, die Nachrichtensignaturen überprüfen (gegen DNS-Einträge) oder selbst hinzufügen:➔ arc: Prüft Authenticated Received Chain (ARC) Signaturen, die durch Mailrelays hinzugefügt wurden (ergänzt DKIM)
➔ dkim: Prüft/Ergänzt Domain Keys Identified Mail (DKIM) Signaturen (= ob Mail wirklich von der behaupteten Domain kommt)
➔ dmarc: Konsultiert DMARC TXT DNS-Einträge zum Verhalten bei fehlgeschlagenen DKIM/SPF-Checks
➔ mid: Unterdrückt negative Folgen fehlender “Message-Id” header für DKIM-signierter Mails bestimmter Domains (als Workaround für falsch konfigurierte Domains)
➔ whitelist: Erhöht/Reduziert Scores für Mails vertrauenswürdiger Quellen
Module (2/7)
Module, die Nachrichtensignaturen überprüfen (gegen DNS-Einträge) oder selbst hinzufügen:➔ arc: Prüft Authenticated Received Chain (ARC) Signaturen, die durch Mailrelays hinzugefügt wurden (ergänzt DKIM)
➔ dkim: Prüft/Ergänzt Domain Keys Identified Mail (DKIM) Signaturen (= ob Mail wirklich von der behaupteten Domain kommt)
➔ dmarc: Konsultiert DMARC TXT DNS-Einträge zum Verhalten bei fehlgeschlagenen DKIM/SPF-Checks
➔ mid: Unterdrückt negative Folgen fehlender “Message-Id” header für DKIM-signierter Mails bestimmter Domains (als Workaround für falsch konfigurierte Domains)
➔ whitelist: Erhöht/Reduziert Scores für Mails vertrauenswürdiger Quellen
Kenn bislang keine...
Brauche ich bislang nicht...
Kontrolle abgeben?
Module (3/7)
Module, die Nachrichteninhalte gegen (DNS) Blacklisten prüfen:➔ dcc: Konsultiert Distributed Checksum Clearinghouses (DCC), um festzustellen, ob Mail Spam ist
➔ emails: Extrahiert E-Mail Adressen und vergleicht sie gegen konfigurierte Listen oder DNS Blacklists
➔ fuzzy_check: Versucht Fuzzy Matching von Zeichenketten, um verschiedene Schreibweisen von typischen Formulierungen zu erwischen
➔ phishing: Versucht mittels OpenPhish-Dienst Phishing URLs in HTML-Mails zu finden
➔ surbl: Extrahiert URLs und Domains dieser URLs und prüft diese gegen Blacklists wie surbl.org, uribl.com, Spamhaus etc. (teils kommerziell)
➔ url_reputation: Experimentelles Modul, um URLs zu extrahieren und ihren Domains Reputationen zuzuweisen
Module (3/7)
Module, die Nachrichteninhalte gegen (DNS) Blacklisten prüfen:➔ dcc: Konsultiert Distributed Checksum Clearinghouses (DCC), um festzustellen, ob Mail Spam ist
➔ emails: Extrahiert E-Mail Adressen und vergleicht sie gegen konfigurierte Listen oder DNS Blacklists
➔ fuzzy_check: Versucht Fuzzy Matching von Zeichenketten, um verschiedene Schreibweisen von typischen Formulierungen zu erwischen
➔ phishing: Versucht mittels OpenPhish-Dienst Phishing URLs in HTML-Mails zu finden
➔ surbl: Extrahiert URLs und Domains dieser URLs und prüft diese gegen Blacklists wie surbl.org, uribl.com, Spamhaus etc. (teils kommerziell)
➔ url_reputation: Experimentelles Modul, um URLs zu extrahieren und ihren Domains Reputationen zuzuweisen
Lizenzrestriktion & externer Daemon
Gibt nützlichere Attribute in Mails
Machtvoll, komplex, extra Worker, extra Learning,versuche es weiterhin ohne...
Aus gutem Grund experimentell?
Module (4/7)
Module, die Nachrichten ohne DNS-Interaktion analysieren:➔ antivirus: Prüft Mails mittels externer Virenscanner wie clamav➔ chartable: Bestraft auffällig viele Zeichencodierungswechsel (z.B. zwischen Latin und Chinese)
➔ maillist: Neutralisiert Regeln bei Nachrichten von Mailinglisten➔ mime_types: Prüft MIME types und Inhalte von Archiven➔ neural_networks: Experimentelles Modul, um neuronale Netze zur Mailklassifikation einzusetzen
➔ once_received: Tests für Mails mit nur einem Received Header➔ regexp: Tests mit regulären Ausdrücken➔ replies: Trackt Antworten auf eigenes Mails mittels Message-Id Header➔ reputation: Experimentell, bislang undokumentiert➔ trie: “Blitzschnelles” Durchsuchen nach Strings mit Aho-Corasick-Algorithmus
Module (4/7)
Module, die Nachrichten ohne DNS-Interaktion analysieren:➔ antivirus: Prüft Mails mittels externer Virenscanner wie clamav➔ chartable: Bestraft auffällig viele Zeichencodierungswechsel (z.B. zwischen Latin und Chinese)
➔ maillist: Neutralisiert Regeln bei Nachrichten von Mailinglisten➔ mime_types: Prüft MIME types und Inhalte von Archiven➔ neural_networks: Experimentelles Modul, um neuronale Netze zur Mailklassifikation einzusetzen
➔ once_received: Tests für Mails mit nur einem Received Header➔ regexp: Tests mit regulären Ausdrücken➔ replies: Trackt Antworten auf eigenes Mails mittels Message-Id Header➔ reputation: Experimentell, bislang undokumentiert➔ trie: “Blitzschnelles” Durchsuchen nach Strings mit Aho-Corasick-Algorithmus
Lange verwendet, Nutzen vs. Aufwand bei kleinem MX
“Heißer Scheiß” aber komplex
Default expiry 24 hours zu kurzExperimentell, undokumentiert
Was ist nicht versteh, brauch ich wohl nicht...
Module (5/7)
Module, die Metadaten wie z.B. Absenderdomains an externe Datenbanken weiterleiten:➔ clickhouse: Leitet Daten an eine clickhouse.yandex Instanz weiter
➔ elastic: Leitet Daten an eine Elasticsearch-Instanz weiter➔ external_services: z.B. ICAP (Internet Content Adaption Protocol) → ClamAV/Sophos/Kaspersky
➔ history_redis: Speichert Historie in einer Redis-Instanz➔ metadata_exporter: Exportiert Metadaten via Redis Publish/Subscribe-Channels, HTTP POST URLs und Mails
➔ metric_exporter: Exportiert Metriken an ein externes Monitoring-System (derzeit nur Graphite)
Module (5/7)
Module, die Metadaten wie z.B. Absenderdomains an externe Datenbanken weiterleiten:➔ clickhouse: Leitet Daten an eine clickhouse.yandex Instanz weiter
➔ elastic: Leitet Daten an eine Elasticsearch-Instanz weiter➔ external_services: z.B. ICAP (Internet Content Adaption Protocol) → ClamAV/Sophos/Kaspersky
➔ history_redis: Speichert Historie in einer Redis-Instanz➔ metadata_exporter: Exportiert Metadaten via Redis Publish/Subscribe-Channels, HTTP POST URLs und Mails
➔ metric_exporter: Exportiert Metriken an ein externes Monitoring-System (derzeit nur Graphite)
Brauche ich alle nicht :)
Module (6/7)
Module, die statt Tests Aktionen implementieren:➔ dkim_signing: Alternative zu dkims sign_condition (nicht wirklich eine Aktion da unabhängig von Score)
➔ force_actions: Erzwingt unabhängig von Message-Score eine Aktion, wenn bestimmte Symbole gefunden werden
➔ greylisting: Implementiert Greylisting (Temporäres Abweisen mit dem Ziel eines erneuten Zustellversuchs)
➔ milter_headers: Fügt Message Header wie x-spamd-bar und authentication-results hinzu
Module (6/7)
Module, die statt Tests Aktionen implementieren:➔ dkim_signing: Alternative zu dkims sign_condition (nicht wirklich eine Aktion da unabhängig von Score)
➔ force_actions: Erzwingt unabhängig von Message-Score eine Aktion, wenn bestimmte Symbole gefunden werden
➔ greylisting: Implementiert Greylisting (Temporäres Abweisen mit dem Ziel eines erneuten Zustellversuchs)
➔ milter_headers: Fügt Message Header wie x-spamd-bar und authentication-results hinzu
Einsatzszenario?
Module (7/7)
Sonstige Module:➔ bayes_expiry: Entfernt veraltete Bayes Token➔ multimap: Erlaubt es, Maps (z.B. Blacklists) dynamisch von URLs oder Dateien zu laden
➔ rspamd_update: Aktualisiert rspamd Regeln, Scores und Aktionen ohne rspamd-Neustart bzw. Upgrade
➔ spamassassin: Importiert SpamAssassin-Regeln➔ url_redirector: Hilfsmodul für surbl, um Redirects in URL zu verfolgen
➔ url_tags: Experimentes Modul, dass “URL tags” in Redis cachet
Module (7/7)
Sonstige Module:➔ bayes_expiry: Entfernt veraltete Bayes Token➔ multimap: Erlaubt es, Maps (z.B. Blacklists) dynamisch von URLs oder Dateien zu laden
➔ rspamd_update: Aktualisiert rspamd Regeln, Scores und Aktionen ohne rspamd-Neustart bzw. Upgrade
➔ spamassassin: Importiert SpamAssassin-Regeln➔ url_redirector: Hilfsmodul für surbl, um Redirects in URL zu verfolgen
➔ url_tags: Experimentelles Modul, dass “URL tags” in Redis cachet
Brauchen wir das?
Fange bei Null an…
Experimentell, kaum dokumentiert
Scores
Nur ein kleiner Ausschnitt… *=One-shot symbol
https://www.0xf8.org/2018/05/an-alternative-introduction-to-rspamd-configuration-scores/
IV. rspamd in der Praxis
39
Installation
➔ CentOS 6/7, Fedora 21-25:➔ yum Repos unter https://rspamd.com/rpm-stable/➔ CentOS-Pakete erfordern EPEL
➔ Debian/Ubuntu:➔ apt Repos unter http://rspamd.com/apt-stable➔ Debian-eigene Pakete “terribly outdated”
➔ openSUSE/SLES:➔ zypper Repo unter https://download.opensuse.org/repositories/server:mail/
➔ FreeBSD, OpenBSD:➔ Ports collection
➔ Redis gleich mitinstallieren!
Postfix/MTA-Integration
Self-scan mode (small setups) Proxy mode (large setups)
Postfix/MTA-Integration
Self-scan mode (small setups) Proxy mode (large setups)
“Zeig endlich Config!!?”
Christine Owens; CC0; https://www.publicdomainpictures.net/en/view-image.php?image=115842
“rspamadm configwizard”? Nee...
https://www.0xf8.org/2019/03/an-updated-configuration-file-structure-diagram-for-rspamd-1-9-0/ Toddler: Flickr Henry Borrows; CC-BY-SA 2.0; https://www.flickr.com/photos/foilman/5906443080
/etc/rspamd➔ common.conf, groups.conf und modules.conf: (fast) nur Includes
➔ actions.conf: welche Aktionen bei welchen Gesamtscores
➔ composites.conf: Kombinationen von Symbolen → neue Symbole
➔ statistic.conf: Derzeit nur Bayes classifier (eingebaut, kein Modul)
➔ settings.conf: Individualisierungen z.B. für Nachrichten bestimmter Absender
➔ options.inc: Verschiedenes wie z.B. DNS timeouts, aber auch eingebaute Module via filters= Direktive
➔ cgp.inc: CommuniGate Pro Groupware-Spezifika➔ logging.inc: Logging setup➔ worker-*.inc: Worker setup, z.B. IP-Adressen
/etc/rspamd/modules.d➔ Modul-spezifische Konfigurationsdateien➔ Inkludiert aus top-level modules.conf ➔ Leider nur für Lua-Module Ein- und Ausschalten jeweils via enabled = true Zeile
➔ Teilweise Einbindung weiterer *.inc Dateien, die leider wieder unter /etc/rspamd liegen...
➔ Die meisten Module sind defaultmäßig aktiv
➔ Änderungen hieran schreien nach einem sed -i Job oder besser: Config management
➔ redis.conf: Allgemeine Redis-Konfiguration
/etc/rspamd/scores.d
➔ Mehr oder weniger thematisch sortierte Gruppen von Scores➔ Inkludiert aus top-level groups.conf➔ Leider nicht direkt erkennbar, welches Modul welche Gruppe bzw. welche Symbole verwendet
➔ Recht kryptische Symbolnamen wie z.B. HFILTER_HELO_4➔ Description hilft nicht immer weiter: “Helo host checks (hard)”
https://www.0xf8.org/2019/03/an-updated-configuration-file-structure-diagram-for-rspamd-1-9-0/
Beispiel /etc/rspamd/local.d/worker-controller.inc:
password = $2$t4y…enable_password = $2$4y...
“Differentielle Anpassung” heißt: Ausgelieferte Konfigurationsdateien NICHT direkt ändern,
sonst werden Updates unheimlich kompliziert!
Stattdessen entweder rspamd.conf.local verwenden oder besser:gleichnamige Kopie der jeweiligen Konfigurationsdatei anlegen in
- /etc/rspamd/local.d (einzelne Direktiven; verschmolzen mit Original)- /etc/rspamd/overrides.d (ganze Blöcke; ersetzt Original).
Thunderbird-Addon
rspamd-spamness von Alexander Moisseev
https://rspamd.com/img/thunderbird_rspamd.png
Fazit
➔ Webinterface out-of-the-box, das nicht aussieht wie von 2000➔ Out-of-the-box Konfiguration braucht kaum Anpassungen➔ Zumindest für meine Minizwecke reduzierte Load nicht ausschlaggebend➔ Dokumentation schon relativ gut➔ Paar Merkwürdigkeiten bei Struktur der Konfigurationsdateien… geschenkt➔ Aktives Projekt (GitHub-Tickets öffnen macht Sinn)➔ rspamd ist schon toll!
Fragen?Feedback?
Pieter [email protected]@mstdn.io
Blog-Artikel-Serie:https://www.0xf8.org/2018/05/an-alternative-introduction-to-rspamd-configuration-introduction/
Nachtrag: Publikumsfeedback
➔ ip_score: Empfehlung einzuschalten, lernt von alleine ➔ mx_check: Default aus weil es ausgehende Verbindung aufbaut, was oft nicht gewollt ist➔ whitelist und ähnliche Module: by Default so konfiguriert, dass Maps von rspamd.com verwendet werden, manuelle Pflege also nicht zwingend nötig➔ fuzzy_check: Empfehlung, dies an zu lassen wegen Checks von rspamd.com, Worker kann aus bleiben➔ bayes_expiry: Funktioniert andersherum, erhält “gute” Tokens➔ Configdateien nicht kopieren nach local.d, sondern neu anlegen, nur Deltas zur Defaultconfig hinterlegen