[Admin-ml] Spam

Proniewski Patrick patrick.proniewski at univ-lyon2.fr
Mer 5 Mar 15:04:30 CET 2008


On 5 mars 08, at 14:29, Jean-Luc Bailloeul wrote:

>> Il n'y a pas grand chose à en dire. Que cherches tu comme info ?

> Un bon How to, éventuellement. J'ai celui là :
> http://www.afp548.com/article.php?story=20051127235810230.
> Mais qui me semble un peu fouillé.

ha ok, un guide d'installation alors. Bon, celui là il dit d'utiliser  
launchd juste pour lancer le process au boot. Pourquoi pas. Il faut  
juste savoir que launchd est incapable de bien suivre postgrey, c'est  
un véritable carnage. Il ne faut surtout pas utiliser launchd pour  
autre chose que le simple lancement type startup script, ça pose plein  
de problèmes. À tel point que j'ai préféré faire carrément un vrai  
startup script à l'ancienne.

Voilà un copier-collé de mes notes de travail prises pendant l'install  
de postgrey chez nous :

--------------------------------------------------------------------------------
** GREYLIST **

* INSTALL *

mkdir /usr/local/src/
cd /usr/local/src/
curl -O http://postgrey.schweikert.ch/pub/postgrey-1.30.tar.gz
tar -xzvf postgrey-1.30.tar.gz
cp postgrey-1.30/postgrey /usr/bin  (si on cp dans /usr/local/bin PERL  
râle à
propos du PATH qui n'est pas sûr)

ajout du user:group qui va bien :

dscl localhost -create /NetInfo/users/postgrey
dscl localhost -create /NetInfo/users/postgrey uid 100
dscl localhost -create /NetInfo/users/postgrey gid 100
dscl localhost -create /NetInfo/users/postgrey home /var/db/postgrey
dscl localhost -create /NetInfo/users/postgrey passwd '*'

dscl localhost -create /NetInfo/groups/postgrey
dscl localhost -create /NetInfo/groups/postgrey gid 100
dscl localhost -create /NetInfo/groups/postgrey passwd '*'

mkdir /var/db/postgrey
chown postgrey:postgrey /var/db/postgrey

perl -MCPAN -e shell
 > test IO::Multiplex
 > install IO::Multiplex
 > test Parse::Syslog
 > install Parse::Syslog

* LANCEMENT GREYLIST *

commande de lancement de l'Usine :

Si on a copié postgrey dans /usr/bin plutôt que dans /usr/local/bin,  
PERL
ne râle pas, et on peut se passer de "PATH=/usr/loc..." devant la  
commande.

/usr/bin/postgrey \
     --pidfile=/var/run/postgrey.pid \
     --unix=/var/run/postgrey.sock \
     -d --user=postgrey --group=postgrey \
     --dbdir=/var/db/postgrey \
     --auto-whitelist-clients=10 \
     --delay=600 \
     --max-age=20


L'utilisation de launchd n'est pas souhaitable pour plusieurs raisons :
- cela n'autorise pas l'option -d de passage en mode démon
- sans le mode -d, postgrey ne sait pas loguer, on n'a donc pas de  
trace des
   transactions
- comme il ne peut pas loguer, c'est visiblement launchd qui prend  
tout dans la
   figure, et il perd la trace du process au bout de quelques secondes  
d'usage.
- de plus, sans le mode -d, les performances de postgrey chute à moins  
de 200
   requêtes par secondes, dans des conditions de test où nous obtenons  
près de
   900 requêtes par seconde en mode "démon".

* TEST GREYLIST *

test, bench, et feed de la DB. Prendre un ou des log du serveur  
archivé, et le donner
à manger à l'utilitaire policy-test fourni avec postgrey. On indique  
le socket
de postgrey.
$ gzcat mail.log.*.gz | /usr/local/src/postgrey-1.30/policy-test unix:/ 
var/run/postgrey.sock
123111 requests in 139s (885.69 r/s)

--------------------------------------------------------------------------------

Au final mon startup script enregistré dans le fichier /Library/ 
StartupItems/Postgrey/Postgrey ressemble à ça :

--------------------------------------------------------------------------------
#!/bin/sh
#
# $Id: Postgrey 861 2007-08-17 09:03:08Z patpro $
#
# 1.0 - 20070817 - Patrick Proniewski
#   First version.

. /etc/rc.common

StartService ()
{
     if [ "${POSTGREY:=-NO-}" = "-YES-" ]; then
         ConsoleMessage "Starting Postgrey daemon"
         rm -f /var/run/postgrey.pid
         /usr/bin/postgrey \
--pidfile=/var/run/postgrey.pid \
--unix=/var/run/postgrey.sock \
-d --user=postgrey --group=postgrey \
--dbdir=/var/db/postgrey \
--auto-whitelist-clients=10 \
--delay=600 \
--max-age=20
     fi
}

StopService ()
{
         ConsoleMessage "Stopping Postgrey daemon"
         kill $(cat /var/run/postgrey.pid) 2> /dev/null
         rm /var/run/postgrey.pid
}

RestartService ()
{
     if [ "${POSTGREY:=-NO-}" = "-YES-" ]; then
         ConsoleMessage "Restarting Postgrey daemon"
                 StopService
                 sleep 1
                 StartService
         else
         StopService
     fi
}

RunService "$1"
--------------------------------------------------------------------------------

Il faut bien sûr ajouter POSTGREY:=-YES- dans /etc/hostconfig

A noter aussi : avant d'activer postgrey, j'ai filtré plusieurs Go de  
log de mail pour repérer les plus gros expéditeurs légitimes externes  
(scores de spam bien négatifs). Une fois cette collecte effectuée,  
j'ai rapidement regardé les domaines de messagerie associés. Après ce  
dernier tri "à la tête du client", j'ai établi un fichier de 1000  
netblocs (A.B.C.D/24) que j'ai mis en whitelist *devant* ma greylist.  
De sorte que ces expéditeurs ne sont jamais greylistés, ils passent  
directement.
Cela me donne un client_access de 1000 lignes ressemblant à ça :
...
12.130.136 permit
17.72.133 permit
24.201.245 permit
...

Après 15 jours de fonctionnement, j'ai fait des stats sur les 10  
derniers jours. J'ai trouvé que :

88,6 % des emails arrivent sans aucun délai
92.2 % des emails arrivent avant 15 minutes d'attente
96.5 % des emails arrivent avant 30 minutes d'attente
98   % des emails arrivent avant 60 minutes d'attente

Le délai le plus long enregistré à cette époque (septembre 2007) était  
de presque 48h, mais pour une poignée de cas vraiment marginaux.



Patrick PRONIEWSKI
-- 
Administrateur Système - SENTIER - Université Lumière Lyon 2




Plus d'informations sur la liste de diffusion Admin-ml