[Linuxtrent] courier-mta: hack per integrazione con Clam Antivirus

  • From: Flavio Stanchina <flavio@xxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Tue, 10 Feb 2004 01:17:30 +0100

Qualcuno di voi usa Courier come mail server ed ha provato ad integrarlo con Clam antivirus per controllare le email in ingresso? ClamAV ha un'opzione --mbox per controllare le email, ma l'autore dice che è piena di buchi e sconsiglia di usarla. Era da un po' che cercavo un modo furbo per integrare i due programmi, ma sembra che tutte le soluzioni già pronte siano pensate per SendMail, Exim e pochi altri. Per Courier non avevo trovato niente di semplice.

Ieri ho scoperto l'esistenza di reformime, un programmino distribuito con Courier che permette di esaminare e/o spacchettare una email MIME; può anche passare le varie parti dell'email ad un filtro esterno. Allora mi è venuta l'illuminazione: faccio chiamare /usr/bin/clamdscan da reformime e con la piccola patch che allego[1] bastano due righe in /etc/courier/maildroprc per fare il filtro antivirus.

Per ora ho installato il reformime patchato in /usr/bin/reformimeXexit; se non incontro problemi, proporrò di includere la patch nella versione ufficiale, ma prima vorrei il parere di qualcuno che fa 'ste cose non per gioco e magari mi trova subito qualche buco grande così...

Le righe da aggiungere a /etc/courier/maildroprc:
  # log dei virus, per debug finché non sono sicuro che va
  logfile ./maildrop.log
  exception {
    `/usr/bin/reformimeXexit -X /usr/bin/clamdscan --quiet -`
    if ($RETURNCODE > 20)
    {
      log "Virus found!"
      to "./Maildir/.Virus"
    }
  }

Naturalmente dopo aver verificato che funziona spedirò le mail direttamente a /dev/null...

Sono molto interessato alla vostra opinione. Qualcun altro usa una configurazione simile ed ha voglia di provare?

--
1. La patch è necessaria perché normalmente reformime ignora
   il risultato del filtro. Con questa modifica, se il filtro
   esce con uno stato diverso da 0, reformime esce a sua volta
   e restituisce (risultato originale + 20) al chiamante.

--
Ciao,
    Flavio Stanchina
    Trento - Italy

diff -ur courier-0.42.2-10/debian/changelog 
courier-0.42.2-10flavio/debian/changelog
--- courier-0.42.2-10/debian/changelog  2004-02-09 16:11:08.000000000 +0100
+++ courier-0.42.2-10flavio/debian/changelog    2004-02-09 16:16:40.000000000 
+0100
@@ -1,3 +1,9 @@
+courier (0.42.2-10flavio) experimental; urgency=low
+
+  * reformime: -X returns the exit code of the launched program.
+
+ -- Flavio Stanchina <flavio@xxxxxxxxxxxx>  Mon,  9 Feb 2004 22:15:45 +0100
+
 courier (0.42.2-10) unstable; urgency=low
 
   * updated French translation of debconf templates (Closes: #213816,
diff -ur courier-0.42.2-10/rfc2045/reformime.1 
courier-0.42.2-10flavio/rfc2045/reformime.1
--- courier-0.42.2-10/rfc2045/reformime.1       2003-04-21 22:56:15.000000000 
+0200
+++ courier-0.42.2-10flavio/rfc2045/reformime.1 2004-02-09 16:52:39.000000000 
+0100
@@ -208,6 +208,10 @@
 \fBreformime\fR's liking. If the \fB-s\fR option is
 not specified, the program runs once
 for every MIME section in the message.
+.B "EXPERIMENTAL:"
+If the external program terminates with a nonzero exit status,
+\fBreformime\fR terminates and returns
+(program exit status + 20).
 .sp
 .RS
 .B "Note:"
diff -ur courier-0.42.2-10/rfc2045/reformime.c 
courier-0.42.2-10flavio/rfc2045/reformime.c
--- courier-0.42.2-10/rfc2045/reformime.c       2003-03-07 01:47:30.000000000 
+0100
+++ courier-0.42.2-10flavio/rfc2045/reformime.c 2004-02-09 16:43:34.000000000 
+0100
@@ -615,6 +615,16 @@
        while ((p2=wait(&waitstat)) != pid && p2 != -1)
                ;
        free(f);
+
+       if ((p2 == pid) && WIFEXITED(waitstat))
+       {
+               if (WEXITSTATUS(waitstat) != 0)
+               {
+                       fprintf(stderr, "reformime: %s exited with status 
%d.\n",
+                               argv[0], WEXITSTATUS(waitstat));
+                       exit(WEXITSTATUS(waitstat) + 20);
+               }
+       }
 }
 
 static void extract_section(struct rfc2045 *top_rfcp, const char *mimesection,

Other related posts:

  • » [Linuxtrent] courier-mta: hack per integrazione con Clam Antivirus