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[ <]*\([EMAIL PROTECTED])@.*$/\1/'` echo -n $DEST >> /var/log/clamlog FINAL=`echo $DEST | sed -e 's/^\([EMAIL PROTECTED])@.*$/\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/^\([EMAIL PROTECTED])@.*$/\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/^\([EMAIL PROTECTED])@.*$/\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 -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:" To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]