Rspamd : anti-spam moderne pour serveur mail

Rspamd : anti-spam moderne pour serveur mail

Rspamd est le successeur moderne de SpamAssassin : plus rapide, plus precis, base sur des regles + bayesien + reputation. Le filtre anti-spam de Mailcow, ProtonMail, et de nombreux gros providers.

Introduction

Rspamd :

  • Daemon C/Lua, 30x plus rapide que SpamAssassin
  • Filtres : SPF, DKIM, DMARC, ARC, DNSBL, regex, regles Lua
  • Apprentissage bayesien (per-user ou global)
  • Greylisting integre
  • Web UI pour debug et stats
  • API REST
  • Plug-and-play avec Postfix, Exim, Sendmail

Note : si vous utilisez Mailcow, Rspamd est deja installe et configure. Ce tuto est pour une installation standalone (Postfix + Dovecot + Rspamd manuel).

Prerequis

  • VPS Linux avec Postfix deja installe (voir tuto 38)
  • Acces root
  • Redis (pour stats et bayesien)

Etape 1 : Installation

# Repo officiel Rspamd
curl https://rspamd.com/apt-stable/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/rspamd.gpg
echo "deb [signed-by=/usr/share/keyrings/rspamd.gpg] https://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rspamd.list

sudo apt update
sudo apt install -y rspamd redis-server

rspamadm --version

Etape 2 : Premier demarrage

sudo systemctl enable --now rspamd redis-server
sudo systemctl status rspamd

Rspamd ecoute par defaut sur :

  • 11332 : milter (interface avec Postfix)
  • 11333 : worker normal
  • 11334 : web UI

Etape 3 : Mot de passe pour l'UI

Generez un hash :

rspamadm pw

Tapez un mdp, le hash apparait.

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

password = "$2$abc123hashdumdp...";
bind_socket = "0.0.0.0:11334";
sudo systemctl restart rspamd

Visitez http://IP:11334. Login : laisser vide, mdp = celui choisi.

Etape 4 : Integration Postfix

/etc/postfix/main.cf :

smtpd_milters = inet:localhost:11332
non_smtpd_milters = inet:localhost:11332
milter_default_action = accept
milter_protocol = 6
sudo systemctl restart postfix

Maintenant tous les mails entrants passent par Rspamd.

Etape 5 : Tester

Envoyez-vous un mail piege (GTUBE = pattern de test reconnu) :

echo "Subject: Test spam
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Test message body" | sendmail -t [email protected]

Le mail doit etre marque comme spam. Dans l'UI Rspamd > History, vous voyez le scoring.

Etape 6 : Bayesien (apprentissage)

Configurez les actions pour entrainer :

sudo nano /etc/rspamd/local.d/classifier-bayes.conf
servers = "127.0.0.1";
backend = "redis";
new_schema = true;
expire = 8640000;
autolearn = true;

users_enabled = false;    # global bayesien (true pour per-user)
sudo systemctl restart rspamd

Apprentissage manuel :

# Apprendre comme spam
rspamc learn_spam /path/to/spam.eml

# Apprendre comme ham (non-spam)
rspamc learn_ham /path/to/ham.eml

Apres ~200 spam + 200 ham, le bayesien commence a etre efficace.

Pour ré-apprendre depuis Dovecot quand l'utilisateur deplace un mail vers le dossier Junk (Sieve script) : voir step 11.

Etape 7 : Greylisting

Bloque temporairement les emails de senders inconnus, puis accepte au 2eme essai (les spammers re-essaient rarement).

/etc/rspamd/local.d/greylist.conf :

servers = "127.0.0.1:6379";
expire = 1d;
timeout = 5m;
ipv4_mask = 19;
ipv6_mask = 64;

Active par defaut. Pour desactiver :

enabled = false;

Etape 8 : Reglages des scores

/etc/rspamd/local.d/actions.conf :

reject = 15.0;       # rejette si score >= 15
add_header = 6.0;    # ajoute "X-Spam: Yes" si score >= 6
greylist = 4.0;      # greyliste si score >= 4

Pour adapter le scoring d'une regle specifique :

/etc/rspamd/local.d/metric.conf :

symbol "SPF_FAIL" {
    weight = 4.0;
}

symbol "DKIM_INVALID" {
    weight = 3.0;
}

symbol "MISSING_TO" {
    weight = 2.0;
}

Etape 9 : DNSBL personnalisees

/etc/rspamd/local.d/rbl.conf :

rbls {
    spamhaus {
        symbol = "RBL_SPAMHAUS";
        rbl = "zen.spamhaus.org";
        ipv6 = true;
    }
    
    barracuda {
        symbol = "RBL_BARRACUDA";
        rbl = "b.barracudacentral.org";
    }
}

Etape 10 : Whitelist / Blacklist

/etc/rspamd/local.d/maps.d/local_bl.map :

[email protected]
*@spammer-domain.com

/etc/rspamd/local.d/maps.d/local_wl.map :

[email protected]
@verycloud.fr        # tout mon domaine

/etc/rspamd/local.d/multimap.conf :

LOCAL_BL_FROM {
    type = "from";
    map = "/etc/rspamd/local.d/maps.d/local_bl.map";
    score = 15.0;
    symbol = "LOCAL_BL_FROM";
}

LOCAL_WL_FROM {
    type = "from";
    map = "/etc/rspamd/local.d/maps.d/local_wl.map";
    score = -10.0;
    symbol = "LOCAL_WL_FROM";
}

Etape 11 : Auto-learning via Sieve

Pour que l'utilisateur entraine Rspamd en deplacant des mails vers "Junk", configurez Dovecot Sieve :

sudo apt install -y dovecot-sieve dovecot-managesieved

Script /etc/dovecot/sieve/learn-spam.sieve :

require ["vnd.dovecot.pipe", "copy", "imapsieve"];

pipe :copy "learn-spam.sh" ["${mailbox}"];

Et le script /etc/dovecot/sieve/learn-spam.sh :

#!/bin/sh
exec /usr/bin/rspamc -h 127.0.0.1:11334 learn_spam

Configurez l'event Dovecot :

sudo nano /etc/dovecot/conf.d/90-sieve.conf
plugin {
  sieve_plugins = sieve_imapsieve

  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox1_causes = COPY APPEND
  imapsieve_mailbox1_before = file:/etc/dovecot/sieve/learn-spam.sieve
  
  imapsieve_mailbox2_name = *
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_before = file:/etc/dovecot/sieve/learn-ham.sieve
}

Quand un user deplace un mail vers Junk -> Rspamd l'apprend comme spam. Inversement, quand il le sort de Junk -> appris comme ham.

Etape 12 : Cluster Rspamd (HA)

Pour scaler ou faire de la HA :

# /etc/rspamd/local.d/redis.conf
servers = "10.0.0.1:6379,10.0.0.2:6379";

Stats et bayesien partages entre nodes. Multiple worker behind un load balancer.

Depannage

Aucun mail n'est filtre

Verifiez l'integration Postfix :

sudo postconf -n | grep milter

Doit pointer vers inet:localhost:11332. Verifiez les logs :

sudo tail -f /var/log/rspamd/rspamd.log
sudo tail -f /var/log/mail.log

"Cannot connect to Redis"

sudo systemctl status redis-server
redis-cli ping
# PONG attendu

Verifiez le port Redis dans worker-controller.inc.

Web UI inaccessible

Verifiez bind_socket et que le port 11334 est ouvert. Si vous voulez l'exposer publiquement, mettez-le derriere un reverse proxy Nginx avec auth basic en plus.

Trop de faux positifs

Reduisez les scores des regles qui se declenchent en regardant l'UI > Symbols > frequency :

rspamc stat

Whitelist les domains de confiance.

Bayesien ne se forme pas

Verifiez le nombre d'echantillons :

rspamc stat | grep learned

Il faut au moins 200 spam + 200 ham pour des resultats stables.

Commandes utiles

# Service
sudo systemctl status rspamd
sudo systemctl restart rspamd

# Logs
sudo tail -f /var/log/rspamd/rspamd.log

# Stats
rspamc stat
rspamc symbols
rspamc counters

# Apprendre
rspamc learn_spam /path/to/file.eml
rspamc learn_ham /path/to/file.eml
rspamc -h localhost:11334 learn_spam < message.eml

# Tester un mail
rspamc < message.eml

# Reload sans restart
sudo systemctl reload rspamd

# Config check
sudo rspamadm configtest

# Reset stats
rspamc statreset

Conclusion

Rspamd est le state-of-the-art anti-spam :

  • Performant (jusqu'a 30k msg/s)
  • Modulable (Lua scripting)
  • UI complete pour debug
  • Apprentissage bayesien efficace

Pour aller plus loin :

  • Combinez avec ClamAV pour le filtrage de virus
  • Integrez OpenDMARC pour la validation DMARC stricte
  • Pour Mailcow, Rspamd est deja la et accessible via /rspamd/ dans l'UI

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members