simscan

Simscan è un semplice programma che abilita il servizio qmail smtpd a rigettare virus , spam e a bloccare allegati durante la conversazione SMTP in modo da ridurre al minimo il carico per il sistema.

ripMIME

La funzione principale di ripMIME è estrarre gli allegati da un MIME email package criptato. E' usato da simscan. E' un pacchetto raccomandato.

cd /usr/local/src
wget http://www.pldaniels.com/ripmime/ripmime-1.4.0.10.tar.gz
tar xzf ripmime-1.4.0.10.tar.gz
cd ripmime-1.4.0.10
chown -R root.root .
make
make install

Installazione di simscan

Per maggiori informazioni sulla patch applicata si veda la pagina del sito di J.Simpson linkata sopra. La patch include anche un bug fix di Bob Greco (maggiori informazioni qui).

cd /usr/local/src
wget -O simscan-1.4.0.tar.gz http://downloads.sourceforge.net/project/simscan/simscan/simscan-1.4.0/simscan-1.4.0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fsimscan%2F&ts=1287839373&use_mirror=ovh
wget http://notes.sagredo.eu/comment/844#comment-844
tar xzf simscan-1.4.0.tar.gz
cd simscan-1.4.0
chown -R root.root .
patch < ../simscan-1.4.0.patch

./configure \
--enable-user=clamav \
--enable-clamav=y \
--enable-spam=y \
--enable-spam-passthru=y \
--enable-spam-hits=9.5 \
--enable-per-domain=y \
--enable-ripmime \
--enable-attach=y \ 
--enable-custom-smtp-reject=y \
--enable-spamc-user=y \
--enable-received=y

make
make install-strip

Dare un'occhiata al file README per una spiegazione di di tutte le opzioni di configurazione. Per quanto riguarda lo spam, faremo in modo di rigettare già a livello smtp lo spam con un punteggio maggiore di 9.5 e di passare gli altri messaggi all'utente dopo averli eventualmente opportunamente etichettati come spam. Questo consente di non rigettare mai messaggi che siano falsi spam.

--enable-per-domain=y|n Abilita la possibilita di assegnare settaggi differenti per i vari domini.
--enable-spam=y|n Abilita il controllo dello spam. Per default è no.
--enable-spam-passthru=y|n Lascia passare lo spam oppure lo rigetta. Default: disable (reject)
--enable-spam-hits=number Rigetta lo spam con punteggio superiore a questo "hit level". Default 10.0
--enable-custom-smtp-reject=y Abilita la possibilità di personalizzare il messaggio di rifiuto di un messaggio.  Quando viene abilitato verrà messo il nome del virus trovato nel messaggio restituito al mittente. Richiede la patch qmail-queue-custom-error.patch. Abilitando dropmsg si disabilita questa opzione. (maggiori informazioni qui http://www.qmailwiki.org/index.php/Simscan/README#How_SMTP_rejection_works)
--enable-spamc-user=y Impostazione obbligatoria se si vogliono gestire le userprefs (blacklist personalizzate a livello utente ad es.) via SQL.
--enable-received=y Aggiunge una linea Received: al messaggio, mostrando gli scanners in azione e qualche statistica (è necessario aver patchato simscan)

qmail-queue-custom-error.patch

Se non l'hai già fatto, potrebbe essere utile patchare qmail con la qmail-queue-custom-error.patch (maggiori informazioni qui) come mostrato prima. La patch abilita Simscan a restituire dei messaggi appropriati per ogni messaggio che rifiuta di recapitare.

Riferirsi a questa pagina (http://www.qmailwiki.org/index.php/Simscan/README#How_SMTP_rejection_works) per capire come il rigetto smtp funziona con simscan. Questa guida ricorda brevemente che:

In caso di rigetto causato da virus, il messaggio contiene il nome del virus:

Your email was rejected because it contains the Worm.Bagle.AU virus

In caso di rigetto causa spam, il messaggio è più generico:

Your email is considered spam (53.5 spam-hits)

In caso di rigetto a causa di allegato non ammesso, il messaggio contiene il nome dell'allegato:

Your email was rejected because it contains a bad attachment: trojan.exe

Come impostare simscan per gestire al meglio lo spamming

Supponiamo che spamassassin sia configurato con una soglia (spam-score) di 5.0, cosicchè i messaggi con un punteggio superiore a questo siano etichettati come spam.

Allora, o prima o poi, spamassassin commetterà un errore di valutazione etichettando come spam una email importante di un cliente di uno dei vostri clienti, e siamo tutti d'accordo che questa è una cosa che non deve mai succedere. D'altro canto è estremamente improbabile che i messaggi con un punteggio al di sopra di un limite ragionevole, ad esempio 9.5, siano realmente spam e per questi possiamo ragionavolmente fidarci dell'operato di spamassassin e istruire simscan per rigettare questi messaggi senza intasare la nostra casella (Cartella Spam).

Pertanto configureremo simscan/spamassassin al fine di:

  • Rigettare le email con un punteggio spam > 9.5
  • Lasciar passare (pass through) le email con un 5.0<punteggio<9.5, per i quali messaggi non si sa mai che spamassassin abbia commesso un errore, etichettandoli comunque come spam. In questo caso vorremmo adoperare una regola sieve (come già spiegato prima) che sposti i messaggi spam nella cartella Spam, di modo che all'occorrenza possano esere recuperati dalla webmail.
  • Considerare tutte le email con punteggio <5.0 come regolari e salvarle nella cartella Inbox dell'utente.

Per fare questo creiamo un file simcontrol come il seguente:

cat > /var/qmail/control/simcontrol << __EOF__
:clam=yes,spam=yes,spam_hits=9.5,attach=.vbs:.lnk:.scr:.wsh:.hta:.pif
__EOF__

Ricordare di aggiornare simcontrol.cdb ogni qual volta si modifica simcontrol

# update simcontrol.cdb
/var/qmail/bin/simscanmk

Abilitare la scansione

echo ':allow,CHKUSER_WRONGRCPTLIMIT="3",QMAILQUEUE="/var/qmail/bin/simscan"' >> ~vpopmail/etc/tcp.smtp
qmailctl cdb

Ora simscan/chkuser interromperanno la comunicazione smtp dopo 3 destinatari sbagliati. Si può anche aggiungere un'istruzione come CHKUSER_RCPTLIMIT="50" per limitare il numero di destinatari per connessione SMTP. Ad essere precisi, queste impostazione di chkuser non hanno a che vedere con simscan, ma era il caso di parlarne visto che stiamo qui impostando tcp.smtp.

Il file simcontrol

Si possono impostare delle regole per uno specifico utente, domino e una regola di defalut come segue:

cat > /var/qmail/control/simcontrol << __EOF__
postmaster@example.com:clam=yes,spam=no,attach=.txt:.com
example.com:clam=no,spam=yes,attach=.mp3
:clam=yes,spam=yes,spam_hits=9.5,attach=.vbs:.lnk:.scr:.wsh:.hta:.pif
__EOF__
  1. La prima riga disabilita clam (virus) e spam per l'utente postmaster@example.com e controlla i virus negli allegati del tipo .txt e .com.
  2. La seconda riga abilita clam e spam per il dominio example.com e disabilita la scansione sugli file .mp3 allegati.
  3. La terza riga imposta la regola di default (valida se non sono valide le precedenti) abilitando la scansione di clamav e spamassassin, e impostando il punteggio spam oltre il quale i messaggi sono rigettati a 9.5.

Configurazione di simscan in presenza della patch DKIM

Se si vuole abilitare DKIM è necessario modificare la configurazione di simscan come spiegato nella pagina riguardante DKIM.

Aggiornare sil database di simscan

La patch applicata aggiunge una linea come questa all'intestazione:

Received: by simscan 1.4.0 ppid: 5613, pid: 5684, t: 0.7355s 
          scanners: attach: 1.4.0 clamav: 0.98.4/m:55/d:19599 spam: 3.4.0

E' necessario aggiornare il database di simscan sesi vuole che vengano mostrate le versioni aggiornate degli scanners usati:

# /var/qmail/bin/simscanmk -g
simscan versions cdb file built. /var/qmail/control/simversions.cdb

Poichè questo aggiornamento deve essere fatto ogni qual volta si aggiorna il database dei virus, è necessario modificare di conseguenza il file di configurazionedi freshclam come segue.

Prima di tutto scarichiamo e installiamo il programma che farà l'update:

wget --no-check-certificate https://qmail.jms1.net/simscan/update-simscan.c
gcc -s -o /usr/local/sbin/update-simscan update-simscan.c
chown root:clamav /usr/local/sbin/update-simscan
chmod 4110 /usr/local/sbin/update-simscan

Ora modifichiamo il file di configurazione di freshclam affinchè esegua update-simscan ogni volta che il database è cambiato. E' necessario modificare una linea del file come segue:

OnUpdateExecute
OnUpdateExecute /usr/local/sbin/update-simscan

/var/qmail/simscan on a ramdisk

Nella sua pagina su simscan John Simpson suggerisce di montare la directory di lavoro di simscan su un ramdisk, al fine di velocizzare di caricamento dei file.

Per fare ciò è sufficiente montare quella directory agendo sul proprio /etc/fstab:

none on /var/qmail/simscan type tmpfs (nodev,noexec,noatime,uid=1010,gid=1004,mode=2750)

E' necessario che i parametri uid e gid corrispondano ai numeri utente e gruppo di clamav rispettivamente, o per lo meno all'utente e il gruppo con cui gira simscan.

Commenti

Complimenti per il tutorial che mi ha permesso di configurare l'ostico qmail, gli unici problemi li ho avuti a far funzionare correttamente simscan, risolti seguendo l'indicazioni del sito qmail.jms.net , in parole povere occorre patchare simscan in modo da far funzionare la scansione degli allegati con il file simscan-1.4.0-combined.4.patch.

Inoltre non e' restituito il motivo di rifuito della mail poiche' con la tua patch di qmail si usa il descrittore file 6 invece del 4 usato da simscan, per cui occorre questa ulteriore patch:

--- simscan.c 2011-11-26 13:25:51.000000000 +0100
+++ simscan.guy 2011-11-26 13:26:57.000000000 +0100
@@ -431,7 +431,7 @@
#ifdef ENABLE_CUSTOM_SMTP_REJECT
snprintf(RejectMsg,sizeof(RejectMsg),
"DYou are not authorized to send email to this address");
- write(4,RejectMsg, strlen(RejectMsg));
+ write(6,RejectMsg, strlen(RejectMsg));
exit_clean(EXIT_MSG);
#else
exit_clean(EXIT_500);
@@ -461,7 +461,7 @@
snprintf(RejectMsg,sizeof(RejectMsg),
"DYour email was rejected because it matches a filter (%s)",
VirusName );
- write(4,RejectMsg, strlen(RejectMsg));
+ write(6,RejectMsg, strlen(RejectMsg));
exit_clean(EXIT_MSG);
#else
exit_clean(EXIT_500);
@@ -520,7 +520,7 @@
#else
#ifdef ENABLE_CUSTOM_SMTP_REJECT
snprintf(RejectMsg,sizeof(RejectMsg), "DYour email is considered spam (%.4f probability)", SpamProbability );
- write(4,RejectMsg, strlen(RejectMsg));
+ write(6,RejectMsg, strlen(RejectMsg));
exit_clean(EXIT_MSG);
#else
exit_clean(EXIT_500);
@@ -568,7 +568,7 @@
snprintf(RejectMsg,sizeof(RejectMsg),
"DYour email was rejected because it contains a bad attachment: %s",
AttachName );
- write(4,RejectMsg, strlen(RejectMsg));
+ write(6,RejectMsg, strlen(RejectMsg));
exit_clean(EXIT_MSG);
#else
exit_clean(EXIT_500);
@@ -651,7 +651,7 @@
snprintf(RejectMsg,sizeof(RejectMsg),
"DYour email was rejected because it contains the %s virus",
VirusName );
- write(4,RejectMsg, strlen(RejectMsg));
+ write(6,RejectMsg, strlen(RejectMsg));
exit_clean(EXIT_MSG);
#else
exit_clean(EXIT_500);
@@ -709,7 +709,7 @@
#ifdef ENABLE_CUSTOM_SMTP_REJECT
snprintf(RejectMsg,sizeof(RejectMsg),
"DYour email is considered spam (%.2f spam-hits)", SpamHits );
- write(4,RejectMsg, strlen(RejectMsg));
+ write(6,RejectMsg, strlen(RejectMsg));
exit_clean(EXIT_MSG);
#else
exit_clean(EXIT_500);


Grazie. Proverò appena possibile

Eppure a me simscan funziona come deve, restituendo il motivo del rigetto, senza bisogno di patchare per il numero del descrittore. Ora non ricordo più, sono passati molti mesi da quando ci ho messo le mani, però mi pare che il descrittore 6 sia stato messo per andare d'accordo con la patch DKIM di modo che la funzionalità qmail-custom-error potesse restituire pure gli errori causati dalla firma DKIM...

Complimenti per l'ottimo lavoro.

Segnalo che per chi, come me, ha installato il compilatore gcc versione 4.4 la compilazione va in errore:

# make
make  all-recursive
make[1]: Entering directory `/usr/local/src/simscan-1.4.0'
Making all in cdb
make[2]: Entering directory `/usr/local/src/simscan-1.4.0/cdb'
...
make[2]: Leaving directory `/usr/local/src/simscan-1.4.0/cdb'
make[2]: Entering directory `/usr/local/src/simscan-1.4.0'
gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -Wall -c `test -f 'simscan.c' || echo './'`simscan.c
simscan.c: In function âmainâ:
simscan.c:767: warning: missing sentinel in function call
simscan.c:358: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result
simscan.c:563: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result
simscan.c:646: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result
simscan.c:704: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result
simscan.c: In function âcheck_spamâ:
simscan.c:1346: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result
simscan.c: In function âper_domain_lookupâ:
simscan.c:1750: warning: âvalâ may be used uninitialized in this function
gcc  -g -O2 -Wall   -o simscan  simscan.o cdb/cdb.a cdb/buffer.a cdb/unix.a cdb/byte.a cdb/alloc.a
gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -Wall -c `test -f 'simscanmk.c' || echo './'`simscanmk.c
In file included from /usr/include/fcntl.h:205,
                 from simscanmk.c:33:
In function âopenâ,
    inlined from âmake_cdbâ at simscanmk.c:379:
/usr/include/bits/fcntl2.h:51: error: call to â__open_missing_modeâ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make[2]: *** [simscanmk.o] Error 1
make[2]: Leaving directory `/usr/local/src/simscan-1.4.0'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/simscan-1.4.0'
make: *** [all] Error 2

Bisogna allora fare un downgrade del gcc alla versione 4.1 perchè tutto fili liscio:

# gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# sudo apt-get install gcc-4.1

# ln -sf /urs/bin/gcc-4.1 /urs/bin/gcc

# gcc --version
gcc (GCC) 4.1.3 20080704 (prerelease) (Ubuntu 4.1.2-27ubuntu1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# make clean
Making clean in cdb
make[1]: Entering directory `/usr/local/src/simscan-1.4.0/cdb'
rm -rf *.o *.a uint32.h systype auto-str cdbdump cdbget cdbmake \
cdbmake-12 cdbmake-sv cdbstats cdbtest compile instcheck load makelib \
rts testzero
make[1]: Leaving directory `/usr/local/src/simscan-1.4.0/cdb'
Making clean in .
make[1]: Entering directory `/usr/local/src/simscan-1.4.0'
test -z "simscan simscanmk" || rm -f simscan simscanmk
rm -f *.o core *.core
make[1]: Leaving directory `/usr/local/src/simscan-1.4.0'

# make

qui nessun problema con gcc 4.5.2 su Slackware64-13.37