English version
Voir aussi mon cours d'administration réseaux au format pdf.

Filtrer le mail avec spamass-milter combiné à spamassassin et postfix

spamass-milter est un milter qui permet d'éliminer certains mails qui sont des spams.
spamassassin est un antispam qui attribue un score aux mails suivant leurs
chances d'être des spams. Plus le score est élevé, plus le mail a de chances
d'être un spam.
On peut mettre spamass-milter en sortie de spamassassin pour rejeter les
mails qui ont un score élevé dans spamassassin. Il vaut mieux mettre un
seuil élevé (>15 par exemple) pour éviter tout faux positifs
(il n'est pas trop grave d'accepter un faux négatif : l'utilisateur reçoit un
spam, mais c'est très génant de rejeter un faux positifs : un vrai mail
ne parvient pas au client)

Voici la recette pour faire marcher spamass-milter avec postfix.
Précisions que j'ai testé sous debian etch mais ça a l'air de marcher à peu près pareil sous d'autres distributions.

Je n'explique pas comment configurer postfix et spamassassin,
on peut trouver un bon nombre de tutorials sur le web.

J'explique comment configurer spamass-milter pour fonctionner come
milter smtpd (à priori plus puissant).
Voir le postfix milters README
pour la différence entre smtpd et non smtpd milters.

1) Configuration
2) Liste des erreurs et pistes de solutions

1) Configuration

a) main.cf

Dans le fichier de configuration de postfix  /etc/postfix/main.cf ,
ajoutez les lignes :
 
# spamass-milter configuration
# l'option accept est plus sûre pour ne pas perdre de mails
milter_default_action = accept
smtpd_milters = unix:/var/run/spamass.sock

# change to this for use as a non_smtpd_milter :
#non_smtpd_milters = unix:/var/run/spamass.sock


Les données sont transmises du démon de spamassassin (appelé spamd)
à spamass-milter via une socket. Cette socket est transmise suivant
le protocole unix (sur la machine locale) via un fichier physique de type socket
ici nommé spamass.sock
.

b) /etc/default/spamass-milter
Voici le fichier /etc/default/spamass-milter

# spamass-milt startup defaults

# OPTIONS are passed directly to spamass-milter.
# man spamass-milter for details

# Default, use the nobody user as the default user, ignore messages
# from localhost

# this one is the right one for use a smtpd_milters
# Reject emails with spamassassin scores > 15 : option -r 15
# Do not modify Subject:, Content-Type: or body option -m
OPTIONS="-u nobody -m -r 15 -i 127.0.0.1 -f -p /var/spool/postfix/var/run/spamass.sock"

SOCKET="/var/spool/postfix/var/run/spamass.sock"
SOCKETOWNER="postfix:postfix"
SOCKETMODE="0660"


c) Création de la socket
Il faut créer une première fois les sockets dans le système de fichiers (car la socket n'est pas créée
lors de l'appel automatique de spamas-milter par postfix).

mkdir /var/spool/postfix/var
mkdir /var/spool/postfix/var/run


puis créer les sockets :

# spamass-milter -m -u nobody -f -p /var/run/spamass.sock
# chown postfix.users /var/run/spamass.sock
# spamass-milter -m -u nobody -f -p /var/spool/postfix/var/run/spamass.sock
# chown postfix.users /var/spool/postfix/var/run/spamass.sock


(si j'ai bien compris, postfix tourne en chrooté et pas spamass-milter
et il faut créer les deux sockets à deux endroits différents pour qu'il
y ait communication entre les deux sockets. feedback wellcome)

Comme il faut faire ces quatres dernières commandes à chaque reboot,
on peut les mettre dans un script (par exemple) appelé /etc/init.d/initspamass
et faire lancer ce script au démarage

# chown +x /etc/init.d/initspamass
# update-rc.d initspamass defaults 99


Il faut mettre 99 pour être sûr que ce script est exécuté après le
démon /etc/init.d/spamass-milter au démarage.



d) Vérification dans les logs

# grep Milter /var/log/mail.log
# grep milter /var/log/mail.log
May 27 08:36:46 laic spamass-milter[29641]: spamass-milter 0.3.1 starting
#



Voici ci-dessous un résumé des erreurs que j'ai eues et qui  m'ont conduit à faire tout ça.

2) Liste des erreurs et pistes de solution

J'avais ce type d'erreur dans /var/log/mail.log :
(faire grep Milter ou grep milter sur ce fichier)

1) J'ai eu l'ereur suivante :  No such file or directory


May 25 10:52:24 laic postfix/smtpd[22561]: warning: connect to Milter
service unix:/var/run/spamass.sock: No such file or directory
May 25 10:52:24 laic postfix/smtpd[22561]: warning: connect to Milter
service unix:/var/run/spamass.sock: No such file or directory


Solution :
Mettre les sockets
/var/run/spamass.sock
/var/spool/postfix/var/run/spamass.sock


2) J'ai eu l'ereur suivante :
read error

May 25 10:43:11 laic spamass-milter[27170]: SpamAssassin:
st_optionneg[-1230103632]: 0x3d does not fulfill action requirements 0x13
May 25 10:43:11 laic postfix/smtpd[22145]: warning: milter
unix:/var/run/spamass.sock: can't read SMFIC_OPTNEG reply packet header:
Success
May 25 10:43:11 laic postfix/smtpd[22145]: warning: milter
unix:/var/run/spamass.sock: read error in initial handshake


Solution :
Utilisation de l'option -m lors de la première création  de la socket,
car postfix ne gère pas les milters  qui modifient les messages.

pour la socket smtpd (smtpd_milters)
spamass-milter -m -u nobody -f -p /var/run/spamass.sock

3) J'ai eu l'erreur suivante :
Permission denied

May 25 10:46:11 laic postfix/smtpd[22145]: warning: connect to Milter
service unix:/var/run/spamass.sock: Permission denied


Solution :
Mettre l'utilisateur postfix comme propriétaire le la socket
pour le smtpd
# chown postfix.users /var/run/spamass.sock
# chown postfix.users /var/spool/postfix/var/run/spamass.sock

Ne pas oublier l'option -u nobody lors de la création initiale de la socket
pour la socket
spamass-milter -m -u nobody -f -p /var/run/spamass.sock

4) J'ai eu l'erreur suivante : Connection refused

May 25 11:00:43 laic postfix/smtpd[22525]: warning: connect to Milter

service unix:/var/run/spamass.sock: Connection refused


Solution :
Rajouter ces lignes dans /etc/default/spamass-milter :

SOCKET="/var/spool/postfix/var/run/spamass.sock"
SOCKETOWNER="postfix:postfix"
SOCKETMODE="0660"