Rspamd Neu: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
Zeile 1: Zeile 1:
== Installation von Rspamd, Postfix und Dovecot ==
+
== Architektur und E-Mail-Datenfluss ==
 +
 
 +
Der E-Mail-Eingang folgt einer festen Kette technischer Instanzen:
 +
 
 +
* Postfix (MTA): Empfängt die Nachricht und reicht sie über die Milter-Schnittstelle an Rspamd weiter.
 +
* Rspamd (Filter): Bewertet die Nachricht anhand von Heuristiken und fragt den Virenscanner ab.
 +
* ClamAV (Scanner): Prüft Anhänge auf Schadcode und meldet das Ergebnis an Rspamd zurück.
 +
* Dovecot (LDA/LMTP): Übernimmt die Nachricht von Postfix. Das Sieve-Modul verschiebt Spam anhand der Rspamd-Header automatisch in den Junk-Ordner.
 +
 
 +
 
 +
 
 +
== Manuelle Paketeinrichtung und Grundkonfiguration ==
 +
 
 +
=== Systemweite Paketinstallation ===
 +
 
 +
Die Installation der benötigten Dienste erfolgt unter Debian oder Ubuntu:
  
=== Paketinstallation ===
 
Die Installation erfolgt unter Debian/Ubuntu:
 
 
* apt update
 
* apt update
 
* apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix
 
* apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix
  
=== Rspamd: Modul-Konfiguration ===
+
=== Vorbereitung des Rspamd Web-Interface ===
 +
 
 +
Da Rspamd Passwörter verschlüsselt speichert, muss vor der Konfiguration ein Hash erzeugt werden:
 +
 
 +
* rspamadm pw -p DEIN_WUNSCH_PASSWORT
 +
 
 +
Der resultierende Hash (beginnend mit $2$) wird in die Controller-Konfiguration übertragen:
 +
 
 +
Datei: /etc/rspamd/local.d/worker-controller.inc
 +
<pre>
 +
bind_socket = "0.0.0.0:11334"; # Zugriff aus dem Netzwerk erlauben
 +
password = "DEIN_ERZEUGTER_HASH";
 +
enable_password = "DEIN_ERZEUGTER_HASH";
 +
</pre>
 +
 
 +
=== Virenscanner-Anbindung ===
  
==== Virenscanner (ClamAV) ====
 
 
Datei: /etc/rspamd/local.d/antivirus.conf
 
Datei: /etc/rspamd/local.d/antivirus.conf
 
<pre>
 
<pre>
Zeile 19: Zeile 46:
 
</pre>
 
</pre>
  
==== Web-Interface (Netzwerkzugriff erzwungen) ====
+
== Systemübergreifende Integration ==
Datei: /etc/rspamd/local.d/worker-controller.inc
+
 
<pre>
+
=== Milter-Anbindung in Postfix ===
bind_socket = "0.0.0.0:11334";
 
password = "$2$abcdef...";
 
enable_password = "$2$abcdef...";
 
</pre>
 
  
=== Postfix & Dovecot Integration ===
+
Der Benutzer 'postfix' benötigt Zugriff auf die Rspamd-Schnittstelle:
  
==== Milter in Postfix ====
 
 
* usermod -aG rspamd postfix
 
* usermod -aG rspamd postfix
 +
 +
Die Integration erfolgt in der Hauptkonfiguration:
 +
 
Datei: /etc/postfix/main.cf
 
Datei: /etc/postfix/main.cf
 
<pre>
 
<pre>
Zeile 36: Zeile 61:
 
non_smtpd_milters = unix:/var/lib/rspamd/rspamd.sock
 
non_smtpd_milters = unix:/var/lib/rspamd/rspamd.sock
 
milter_protocol = 6
 
milter_protocol = 6
 +
milter_default_action = accept
 
</pre>
 
</pre>
  
==== Sieve in Dovecot ====
+
=== Automatische Postfach-Sortierung via Dovecot Sieve ===
 +
 
 +
Aktivierung des Sieve-Plugins für die Zustellung:
 +
 
 
Datei: /etc/dovecot/conf.d/20-lmtp.conf
 
Datei: /etc/dovecot/conf.d/20-lmtp.conf
 
<pre>
 
<pre>
Zeile 46: Zeile 75:
 
</pre>
 
</pre>
  
== Script (setup_mail.sh) ==
+
Erstellung der globalen Sortierregel:
 +
 
 +
Datei: /var/lib/dovecot/sieve/default.sieve
 
<pre>
 
<pre>
#!/bin/bash
+
require ["fileinto"];
while getopts "p:" opt; do
+
if header :contains "X-Spam" "Yes" {
  case $opt in
+
   fileinto "Junk";
    p) USER_PASS=$OPTARG ;;
+
   stop;
    *) echo "Nutzung: $0 -p <passwort>"; exit 1 ;;
 
  esac
 
done
 
 
 
if [ -z "$USER_PASS" ]; then
 
    echo "Fehler: Passwort mit -p angeben!"
 
    exit 1
 
fi
 
 
 
apt update && apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix
 
 
 
RSPAMD_HASH=$(rspamadm pw -p "$USER_PASS")
 
mkdir -p /etc/rspamd/local.d/
 
 
 
echo 'bind_socket = "0.0.0.0:11334";' > /etc/rspamd/local.d/options.inc
 
cat <<EOF > /etc/rspamd/local.d/worker-controller.inc
 
bind_socket = "0.0.0.0:11334";
 
password = "$RSPAMD_HASH";
 
enable_password = "$RSPAMD_HASH";
 
EOF
 
 
 
cat <<EOF > /etc/rspamd/local.d/antivirus.conf
 
clamav {
 
   scan_mime_parts = true;
 
  symbol = "CLAM_VIRUS";
 
   type = "clamav";
 
  servers = "/run/clamav/clamd.ctl";
 
 
}
 
}
EOF
 
 
usermod -aG rspamd postfix
 
postconf -e "smtpd_milters = unix:/var/lib/rspamd/rspamd.sock"
 
postconf -e "non_smtpd_milters = unix:/var/lib/rspamd/rspamd.sock"
 
 
sed -i 's/mail_plugins = \$mail_plugins/mail_plugins = \$mail_plugins sieve/g' /etc/dovecot/conf.d/20-lmtp.conf
 
mkdir -p /var/lib/dovecot/sieve/
 
echo 'require ["fileinto"]; if header :contains "X-Spam" "Yes" { fileinto "Junk"; stop; }' > /var/lib/dovecot/sieve/default.sieve
 
sievec /var/lib/dovecot/sieve/default.sieve
 
chown -R vmail:vmail /var/lib/dovecot/sieve/ 2>/dev/null || chown -R dovecot:dovecot /var/lib/dovecot/sieve/
 
 
systemctl restart clamav-daemon rspamd postfix dovecot
 
echo "URL: http://$(hostname -I | awk '{print $1}'):11334"
 
 
</pre>
 
</pre>
  
== Analyse der Filter-Logik ==
+
* sievec /var/lib/dovecot/sieve/default.sieve
  
=== Live-Analyse im Terminal ===
+
== Automatisierung mittels Setup-Skript ==
* journalctl -u rspamd -f | grep -E "symbol|action"
 
  
=== Beispiel einer Log-Zeile ===
+
Das folgende Skript (setup_mail.sh) führt die oben genannten Schritte konsistent aus. Es nutzt getopt für die Passwortübergabe.
<pre>
 
(default: F (reject): [15.50 / 15.00] [GTUBE(0.00), R_SPF_FAIL(1.00), BAYES_SPAM(5.10)])
 
</pre>
 
  
=== Übung: Die Detektiv-Arbeit ===
 
# Sende saubere Mail -> Score prüfen.
 
# Manipuliere Absender (SPF-Fail) -> Score-Anstieg beobachten.
 
# Spam-Begriffe einfügen -> Finalen Reject provozieren.
 
== Script ==
 
 
<pre>
 
<pre>
 
#!/bin/bash
 
#!/bin/bash
 +
# Aufruf: ./setup_mail.sh -p <Passwort>
  
# --- Parameter-Handling ---
 
 
while getopts "p:" opt; do
 
while getopts "p:" opt; do
 
   case $opt in
 
   case $opt in
Zeile 127: Zeile 108:
 
fi
 
fi
  
# --- 1. Installation ---
+
# Pakete installieren
apt update
+
apt update && apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix
apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix
 
  
# --- 2. Rspamd Konfiguration erzwingen ---
+
# Hash generieren
 
RSPAMD_HASH=$(rspamadm pw -p "$USER_PASS")
 
RSPAMD_HASH=$(rspamadm pw -p "$USER_PASS")
 +
mkdir -p /etc/rspamd/local.d/
  
# Alte Controller-Konfigurationen aufräumen, um Overrides zu verhindern
+
# Netzwerk-Bindung priorisieren (options.inc erzwingt 0.0.0.0)
rm -f /etc/rspamd/local.d/worker-controller.inc
+
echo 'bind_socket = "0.0.0.0:11334";' > /etc/rspamd/local.d/options.inc
  
# Web-Interface (Controller) global auf 0.0.0.0 setzen
 
 
cat <<EOF > /etc/rspamd/local.d/worker-controller.inc
 
cat <<EOF > /etc/rspamd/local.d/worker-controller.inc
 
bind_socket = "0.0.0.0:11334";
 
bind_socket = "0.0.0.0:11334";
Zeile 144: Zeile 124:
 
EOF
 
EOF
  
# Globaler Bind-Override in den Optionen (Zweite Absicherung)
 
echo 'bind_socket = "0.0.0.0";' > /etc/rspamd/local.d/options.inc
 
 
# Virenscanner (ClamAV)
 
 
cat <<EOF > /etc/rspamd/local.d/antivirus.conf
 
cat <<EOF > /etc/rspamd/local.d/antivirus.conf
 
clamav {
 
clamav {
Zeile 157: Zeile 133:
 
EOF
 
EOF
  
# --- 3. Postfix Integration ---
+
# Postfix Milter
 
usermod -aG rspamd postfix
 
usermod -aG rspamd postfix
 
postconf -e "smtpd_milters = unix:/var/lib/rspamd/rspamd.sock"
 
postconf -e "smtpd_milters = unix:/var/lib/rspamd/rspamd.sock"
Zeile 164: Zeile 140:
 
postconf -e "milter_protocol = 6"
 
postconf -e "milter_protocol = 6"
  
# --- 4. Dovecot Sieve ---
+
# Dovecot Sieve
# Sieve Plugin aktivieren
 
 
sed -i 's/mail_plugins = \$mail_plugins/mail_plugins = \$mail_plugins sieve/g' /etc/dovecot/conf.d/20-lmtp.conf
 
sed -i 's/mail_plugins = \$mail_plugins/mail_plugins = \$mail_plugins sieve/g' /etc/dovecot/conf.d/20-lmtp.conf
 
 
mkdir -p /var/lib/dovecot/sieve/
 
mkdir -p /var/lib/dovecot/sieve/
cat <<EOF > /var/lib/dovecot/sieve/default.sieve
+
echo 'require ["fileinto"]; if header :contains "X-Spam" "Yes" { fileinto "Junk"; stop; }' > /var/lib/dovecot/sieve/default.sieve
require ["fileinto"];
 
if header :contains "X-Spam" "Yes" {
 
  fileinto "Junk";
 
  stop;
 
}
 
EOF
 
 
 
 
sievec /var/lib/dovecot/sieve/default.sieve
 
sievec /var/lib/dovecot/sieve/default.sieve
# Rechte setzen (versuche vmail, sonst dovecot)
 
 
chown -R vmail:vmail /var/lib/dovecot/sieve/ 2>/dev/null || chown -R dovecot:dovecot /var/lib/dovecot/sieve/
 
chown -R vmail:vmail /var/lib/dovecot/sieve/ 2>/dev/null || chown -R dovecot:dovecot /var/lib/dovecot/sieve/
  
# --- 5. Neustart ---
+
# Dienste neu starten
systemctl restart clamav-daemon
+
systemctl restart clamav-daemon rspamd postfix dovecot
systemctl restart rspamd
 
systemctl restart postfix
 
systemctl restart dovecot
 
  
# --- 6. Finaler Check ---
+
echo "Setup abgeschlossen. Web-UI: http://$(hostname -I | awk '{print $1}'):11334"
echo "-------------------------------------------------------"
 
echo "Netzwerk-Check (Port 11334):"
 
ss -tulpn | grep 11334
 
echo "-------------------------------------------------------"
 
echo "Setup abgeschlossen."
 
echo "URL: http://$(hostname -I | awk '{print $1}'):11334"
 
 
</pre>
 
</pre>
  
== Analyse der Filter-Logik: Warum ist das Spam? ==
+
== Ergebnisanalyse und Funktionstest ==
 
 
Ein modernes Filtersystem wie Rspamd ist keine Blackbox. Der Lerneffekt tritt ein, wenn Schüler verstehen, wie sich ein Score aus vielen kleinen Indizien zusammensetzt.
 
 
 
=== Die Anatomie einer Ablehnung (Reject) ===
 
  
Wenn eine Mail abgelehnt wird, reicht es nicht zu wissen, DASS sie weg ist. Wir müssen wissen, WELCHE Regel den Ausschlag gab.
+
=== Überprüfung der Filterentscheidungen ===
  
==== Live-Analyse im Terminal ====
+
Die Analyse erfolgt live über das Systemd-Journal. Dies zeigt Scores und aktive Symbole:
 
 
Mit dem folgenden Befehl filtern wir nur die Zeile heraus, die das Urteil (Action) und die Gründe (Symbols) enthält:
 
  
 
* journalctl -u rspamd -f | grep -E "symbol|action"
 
* journalctl -u rspamd -f | grep -E "symbol|action"
  
==== Beispiel einer Log-Zeile ====
+
=== Validierung mittels GTUBE-Testmail ===
<pre>
 
(default: F (reject): [15.50 / 15.00] [GTUBE(0.00), R_SPF_FAIL(1.00), BAYES_SPAM(5.10), ...])
 
</pre>
 
 
 
=== Der Aha-Effekt: Das Punktesystem (Scoring) ===
 
 
 
In der Schulung muss vermittelt werden, dass Rspamd wie ein Punktrichter arbeitet.
 
  
;Threshold (Schwellenwert): In diesem Beispiel liegt er bei 15.00 Punkten.
+
Senden des standardisierten Spam-Test-Strings zur Prüfung der Sieve-Regel (Verschiebung nach Junk):
;Symbole: Jedes Kürzel in den Klammern ist ein Beweismittel.
 
;Gewichtung: Ein 'R_SPF_FAIL' gibt vielleicht nur 1 Punkt (Verdacht), aber 'BAYES_SPAM' gibt 5 Punkte (starkes Indiz).
 
  
==== Übung: Die Detektiv-Arbeit ====
+
* echo "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-SPAM-TEST-EMAIL*C.34X" | mail -s "Spam-Test" nutzer@beispiel.de
Lasse die Schüler eine Mail manipulieren, um zu sehen, wie sich der Score verändert:
 
# Sende eine saubere Mail -> Score 0.
 
# Sende die Mail von einer gefälschten Absender-Adresse -> Score steigt (SPF-Fail).
 
# Füge "Click here for free money" hinzu -> Score steigt weiter (Bayes/Heuristik).
 
# '''Ergebnis:''' Die Schüler sehen live, wie die Mail langsam über die 15-Punkte-Grenze "wandert".
 
  
=== Visualisierung im Web-Interface ===
+
=== Diagnose über das Web-Interface ===
  
Das Web-Interface ist das beste Werkzeug, um die Theorie der Symbole zu festigen.
+
# Aufruf von http://<Server-IP>:11334 im Browser.
 +
# Anmeldung mit dem vergebenen Passwort.
 +
# Einsicht in die Historie (History), um Scores und aktive Symbole (z.B. GTUBE, BAYES_SPAM) zu evaluieren.
  
# Reiter '''History''' aufrufen.
+
== Fazit ==
# Auf eine Zeile klicken.
 
# '''Aha-Moment:''' Jedes Symbol wird im Klartext erklärt (z.B. "SPF: domain has no SPF record").
 
  
== Fazit für die Schulungsunterlage ==
+
;Transparenz: Rspamd ermöglicht durch das Scoring-System eine präzise Nachvollziehbarkeit von Filterentscheidungen.
;Spam-Schutz ist Wahrscheinlichkeitsrechnung: Es gibt selten den einen Grund, sondern die Summe der Indizien entscheidet.
+
;Effizienz: Die Integration als Milter verhindert die Annahme unerwünschter Nachrichten bereits während des SMTP-Dialogs.
;Transparenz: Ein guter Administrator schaut nicht nur, ob die Mail ankam, sondern warum sie welchen Score erhalten hat.
+
;Benutzerkomfort: Durch die Kopplung mit Sieve wird die Postfachpflege für den Endanwender automatisiert.
;Anpassbarkeit: Über die Datei /etc/rspamd/local.d/scores.conf können wir Symbole, die in unserer Schule zu streng sind, abmildern.
 

Aktuelle Version vom 18. März 2026, 18:11 Uhr

Architektur und E-Mail-Datenfluss

Der E-Mail-Eingang folgt einer festen Kette technischer Instanzen:

  • Postfix (MTA): Empfängt die Nachricht und reicht sie über die Milter-Schnittstelle an Rspamd weiter.
  • Rspamd (Filter): Bewertet die Nachricht anhand von Heuristiken und fragt den Virenscanner ab.
  • ClamAV (Scanner): Prüft Anhänge auf Schadcode und meldet das Ergebnis an Rspamd zurück.
  • Dovecot (LDA/LMTP): Übernimmt die Nachricht von Postfix. Das Sieve-Modul verschiebt Spam anhand der Rspamd-Header automatisch in den Junk-Ordner.


Manuelle Paketeinrichtung und Grundkonfiguration

Systemweite Paketinstallation

Die Installation der benötigten Dienste erfolgt unter Debian oder Ubuntu:

  • apt update
  • apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix

Vorbereitung des Rspamd Web-Interface

Da Rspamd Passwörter verschlüsselt speichert, muss vor der Konfiguration ein Hash erzeugt werden:

  • rspamadm pw -p DEIN_WUNSCH_PASSWORT

Der resultierende Hash (beginnend mit $2$) wird in die Controller-Konfiguration übertragen:

Datei: /etc/rspamd/local.d/worker-controller.inc

bind_socket = "0.0.0.0:11334"; # Zugriff aus dem Netzwerk erlauben
password = "DEIN_ERZEUGTER_HASH";
enable_password = "DEIN_ERZEUGTER_HASH";

Virenscanner-Anbindung

Datei: /etc/rspamd/local.d/antivirus.conf

clamav {
  scan_mime_parts = true;
  symbol = "CLAM_VIRUS";
  type = "clamav";
  servers = "/run/clamav/clamd.ctl";
}

Systemübergreifende Integration

Milter-Anbindung in Postfix

Der Benutzer 'postfix' benötigt Zugriff auf die Rspamd-Schnittstelle:

  • usermod -aG rspamd postfix

Die Integration erfolgt in der Hauptkonfiguration:

Datei: /etc/postfix/main.cf

smtpd_milters = unix:/var/lib/rspamd/rspamd.sock
non_smtpd_milters = unix:/var/lib/rspamd/rspamd.sock
milter_protocol = 6
milter_default_action = accept

Automatische Postfach-Sortierung via Dovecot Sieve

Aktivierung des Sieve-Plugins für die Zustellung:

Datei: /etc/dovecot/conf.d/20-lmtp.conf

protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

Erstellung der globalen Sortierregel:

Datei: /var/lib/dovecot/sieve/default.sieve

require ["fileinto"];
if header :contains "X-Spam" "Yes" {
  fileinto "Junk";
  stop;
}
  • sievec /var/lib/dovecot/sieve/default.sieve

Automatisierung mittels Setup-Skript

Das folgende Skript (setup_mail.sh) führt die oben genannten Schritte konsistent aus. Es nutzt getopt für die Passwortübergabe.

#!/bin/bash
# Aufruf: ./setup_mail.sh -p <Passwort>

while getopts "p:" opt; do
  case $opt in
    p) USER_PASS=$OPTARG ;;
    *) echo "Nutzung: $0 -p <passwort>"; exit 1 ;;
  esac
done

if [ -z "$USER_PASS" ]; then
    echo "Fehler: Passwort mit -p angeben!"
    exit 1
fi

# Pakete installieren
apt update && apt install -y rspamd clamav-daemon dovecot-sieve dovecot-managesieved postfix

# Hash generieren
RSPAMD_HASH=$(rspamadm pw -p "$USER_PASS")
mkdir -p /etc/rspamd/local.d/

# Netzwerk-Bindung priorisieren (options.inc erzwingt 0.0.0.0)
echo 'bind_socket = "0.0.0.0:11334";' > /etc/rspamd/local.d/options.inc

cat <<EOF > /etc/rspamd/local.d/worker-controller.inc
bind_socket = "0.0.0.0:11334";
password = "$RSPAMD_HASH";
enable_password = "$RSPAMD_HASH";
EOF

cat <<EOF > /etc/rspamd/local.d/antivirus.conf
clamav {
  scan_mime_parts = true;
  symbol = "CLAM_VIRUS";
  type = "clamav";
  servers = "/run/clamav/clamd.ctl";
}
EOF

# Postfix Milter
usermod -aG rspamd postfix
postconf -e "smtpd_milters = unix:/var/lib/rspamd/rspamd.sock"
postconf -e "non_smtpd_milters = unix:/var/lib/rspamd/rspamd.sock"
postconf -e "milter_default_action = accept"
postconf -e "milter_protocol = 6"

# Dovecot Sieve
sed -i 's/mail_plugins = \$mail_plugins/mail_plugins = \$mail_plugins sieve/g' /etc/dovecot/conf.d/20-lmtp.conf
mkdir -p /var/lib/dovecot/sieve/
echo 'require ["fileinto"]; if header :contains "X-Spam" "Yes" { fileinto "Junk"; stop; }' > /var/lib/dovecot/sieve/default.sieve
sievec /var/lib/dovecot/sieve/default.sieve
chown -R vmail:vmail /var/lib/dovecot/sieve/ 2>/dev/null || chown -R dovecot:dovecot /var/lib/dovecot/sieve/

# Dienste neu starten
systemctl restart clamav-daemon rspamd postfix dovecot

echo "Setup abgeschlossen. Web-UI: http://$(hostname -I | awk '{print $1}'):11334"

Ergebnisanalyse und Funktionstest

Überprüfung der Filterentscheidungen

Die Analyse erfolgt live über das Systemd-Journal. Dies zeigt Scores und aktive Symbole:

  • journalctl -u rspamd -f | grep -E "symbol|action"

Validierung mittels GTUBE-Testmail

Senden des standardisierten Spam-Test-Strings zur Prüfung der Sieve-Regel (Verschiebung nach Junk):

  • echo "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-SPAM-TEST-EMAIL*C.34X" | mail -s "Spam-Test" nutzer@beispiel.de

Diagnose über das Web-Interface

  1. Aufruf von http://<Server-IP>:11334 im Browser.
  2. Anmeldung mit dem vergebenen Passwort.
  3. Einsicht in die Historie (History), um Scores und aktive Symbole (z.B. GTUBE, BAYES_SPAM) zu evaluieren.

Fazit

Transparenz
Rspamd ermöglicht durch das Scoring-System eine präzise Nachvollziehbarkeit von Filterentscheidungen.
Effizienz
Die Integration als Milter verhindert die Annahme unerwünschter Nachrichten bereits während des SMTP-Dialogs.
Benutzerkomfort
Durch die Kopplung mit Sieve wird die Postfachpflege für den Endanwender automatisiert.