[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Exim+exiscan+clamav+spamassassin[une solution]



J'avais il y a quelques mois évoqué un  problème avec cette chaine. Lorsqu'on
installe classiquement exim+exiscan+clamav+spamassassin, un mail qui arrive
suit la chaine suivante:

-> Exiscan
[traitement  clamav de 1mn en gros]
Exiscan -> Exim
[transport spamcheck]
exim -> spamd  
spad -> exim
[ traitement du mail proprement dit]
-> sortie variable.

Le problème est que, comme ça a été le cas il y a 4 jours, si un crétin (un
italien 62.10.119.20 en l'occurrence) envoit des dizaines de milliers de spam
au nom de personnes imaginaires du domaine dont je m'occupe, je me retrouve
avec près de 20000 SMTP par jour pendant 3-4 jours se connectant avec un ou
plusieurs messages d'erreurs (en moyenne une dizaine)  pour une personne
n'existant pas dans mon domaine. Ces messages parcourt la chaine clamav
+spamassassin avant d'être éliminé par exim. Surcharge du serveur, file
d'attente qui s'accumule et système à la limite de l'écroulement.
J'ai fini par régler le problème de la façon suivante:

1) Création d'un répertoire /var/filtre contenant un fichier par compte
en clair
# mkdir /var/filtre
# cd /var/filtre
# cat /etc/aliases | grep -v "^#" | grep -v "^$" | cut -d: -f1   | xargs -n 1 touch
# cat /etc/passwd | cut -d: -f1 | xargs -n 1 touch

puis ajustement divers.

2) Ajustement d'exim pour que spamassassin ne soit appelé que pour ces comptes:
La directive «spamchecheck_director» anciennement
spamcheck_director:
    no_verify
  condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} {!eq {$received_protocol}{local}} } {1}{0}}"
  driver = smartuser
  transport = spamcheck

devient

spamcheck_director:
    no_verify
  condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} {!eq {$received_protocol}{local}} } {1}{0}}"
  require_files = /var/filtre/$local_part
  driver = smartuser
  transport = spamcheck

(en clair, elle n'est utilisé que si /var/filtre/$destinataire existe.

3) Utilisation d'un wrapper pour clamscan, ce wrapper regarde si le
destinataire du mail est un compte local avant de regarder le mail, cela évite
de tester les mails pour rien. À ne pas faire si vous souhaitez controler les
mails sortants:
Le wrapper /usr/local/bin/clamwrapper
**************************************
#!/bin/sh
FLAGS=" --unzip --unrar --arj --no-summary "
CLAM=/usr/bin/clamscan
DIR=$1
FICHIER=`echo $DIR | sed -e 's/-tmp$/-complete/'`
EXISTE=0
grep -E "for.*@" $FICHIER | head -n 1 >> /var/log/clamlog
DEST=`grep -E "for.*@" $FICHIER | head -n 1 | sed -e 's/^.*for[ <]*\([^@]*\)@.*$/\1/'`
echo -n $DEST >> /var/log/clamlog
FINAL=`echo $DEST | sed -e 's/^\([^@]*\)@.*$/\1/'`
if [ -f /var/filtre/$FINAL ] ; then
    EXISTE=$[$EXISTE+1]
fi
DEST=`grep To: $FICHIER | head -n 1 | sed -e 's/To: //'`
echo -n " - "$DEST" " >> /var/log/clamlog
while `echo $DEST | grep -q  ','` ; do
    DESTS=`echo $DEST | sed -e 's/^[^,]*, *\(.*\)$/\1/'`
    DESTD=`echo $DEST | sed -e 's/^\([^,]*\), *.*$/\1/'`
    DESTV=`echo $DESTD | sed -e 's/^.*<\([^>]*\)>.*/\1/'`
    FINAL=`echo $DESTV | sed -e 's/^\([^@]*\)@.*$/\1/'`
    echo -n " "$FINAL >> /var/log/clamlog
    if [ -f /var/filtre/$FINAL ] ; then
        EXISTE=$[$EXISTE+1]
    fi
    DEST=$DESTS
done
DESTV=`echo $DEST | sed -e 's/^.*<\([^>]*\)>.*/\1/'`
FINAL=`echo $DESTV | sed -e 's/^\([^@]*\)@.*$/\1/'`
echo -n " "$FINAL >> /var/log/clamlog
if [ -f /var/filtre/$FINAL ] ; then
        EXISTE=$[$EXISTE+1]
fi
if [ ! 0 -eq $EXISTE ] ; then
    echo " : YES" >> /var/log/clamlog
    $CLAM $FLAGS $DIR
else
    echo " : NO" >> /var/log/clamlog
fi
****************************

Il suffit alors de modifier /etc/exiscan/exiscan.conf par le patch suivant:
***************************
--- exiscan.conf        Sat Jan 26 16:01:46 2008
+++ exiscan.conf~       Sat Jan 26 15:07:47 2008
@@ -100,7 +100,7 @@
   # If you use a "daemon" type scanner, this is the path and filename
   # of the UNIX socket used to communicate with the daemon.

-  $scannerex="/usr/local/bin/clamwrapper";
+  $scannerex="/usr/bin/clamscan";


   # Scanner command line flags
@@ -116,7 +116,7 @@
   # with the directory location the scanner should recursively sweep.

   %scannerflags = (
-                      'clamav'     => ' <DIRECTORY>',
+                      'clamav'     => '--unzip --unrar --arj --no-summary <DIRECTORY>',
                       'mcafee'     => '--noboot --unzip -r <DIRECTORY>',
                       'sophos'     => '-all -archive -ss <DIRECTORY>',
                       'nod32'      => '-heursafe -basedir=/usr/local/nod32/nod32 -all <DIRECTORY>',
******************

(en gros on appelle clamwrapper au lieu de clamscan).

Ces modifications ont réglé le problème de surcharge du serveur en cas de
crise comme celle d'il y a 4 jours même si la solution trouvée pour clamscan
est un peu de chez bricolo/bricolette.

Je n'ai pas pu retrouver le message où j'évoquais le problème il y a plusieurs
mois mais ceux qui s'était intéressé au problème le reconnaitront.

François Boisson


Reply to: