Installazione configurazione di simscan

27 gennaio 2024 by Roberto Puzzanghera 5 commenti

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.

Dettagli sulla versione 1.4.3

Come si può notare, per comodità ho spostato i sorgenti di simscan nel mio spazio github. Ciononostante, tutte le informazioni riguardanti simscan continueranno a essere pubblicate qui, e questa è la pagina dove chiedere eventualmente supporto.

La versione 1.4.3 è un fork della version 1.4.1, che a sua volta aggiorna il programma originale di Inter7.

Nella versione 1.4.1 i sorgenti sono stati ripuliti e leggermente modernizzati (per evitare vari warming durante la compilazione), contegono varie correzioni di bug e patche, tra le quali quasi tutte quelle di John Simpson (l'unica mancante è la patch "debug" che applicheremo comunque, come mostrato sotto) e il bug fix di Gustavo Castro che era presente nella mia precedente patch combinata. Pertanto la versione 1.4.2 aggiunge solamente solo quanto segue:

  • La debug patch di John Simpson, che consente di migliorare il debud a livello di qmail-smtpd (maggiori informazioni nel sito di jms);
  • un bug fix di Bob Greco secondo il quale un messaggio ricevuto con destinatari locali multipli eseguiva spamc come utente null invece di estrarre il nome utente dal primo destinatario.
    Maggiori informazioni qui https://notes.sagredo.eu/en/qmail-notes-185/simscan-38.html#comment844
  • La mia patch attachments-size-limit che consente di superare un limite di simscan per cui i messaggi con allegati di dimensione superiore a 250k non vengono passati a spamassassin. Questa patch consente di impostare la dimensione massima in byte attraverso il file /var/qmail/control/simsizelimit file. Inoltre, gli eventi dove simscan non viene attivato sono ora loggati (prima lo erano solo se il debug è attivo).

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 https://github.com/inflex/ripMIME/archive/refs/tags/1.4.1.0.tar.gz
tar xzf 1.4.1.0.tar.gz
cd ripMIME-1.4.1.0
chown -R root:root .
make
make install

Test

  • man ripmime per maggiori informazioni

Salvare una mail con un allegato dentro nel file "message.eml".

mkdir tmp
ripmime --debug --disable-qmail-bounce -i message.eml -d tmp > ripmime.log

Gli allegati dovrebbero essere stati estratti nella cartella tmp.

# ls -l tmp/ 
total 2352 
-rw------- 1 root root 2396801 Aug  2 16:10 attached_file.jpeg 
-rw-r--r-- 1 root root       0 Aug  2 16:10 textfile0 
-rw-r--r-- 1 root root       4 Aug  2 16:10 textfile1 
-rw-r--r-- 1 root root      25 Aug  2 16:10 textfile2

Come si può notare, ripMIME ha estratto il file allegato attached_file.jpeg senza dotarlo dei privilegi di lettura per il gruppo. Questo non sarà un problema per noi, dal momento che sceglieremo di eseguire simscan con l'utente clamav, ma se si sta pensando di eseguirlo come utente simscan e perciò includendo clamav nel gruppo simscan, allora sarà necessario modificare ripMIME con questa patch (probabilmente si dovrà farlo a manualmente poichè la patch è per la vecchia versione v. 1.4.0.9 che non compila più), altrimenti clamav non avrà i privilegi per leggere gli allegati.

Installazione di simscan

Installare come segue. Notare che è necessario dire esplicitamente al compilatore dove si trova il database di clamav (--enable-clamavdb-path).

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

SIMSCAN_VER=1.4.3
cd /usr/local/src
wget https://github.com/sagredo-dev/simscan/archive/refs/tags/v${SIMSCAN_VER}.tar.gz
tar xzf simscan-${SIMSCAN_VER}.tar.gz
cd simscan-${SIMSCAN_VER}
chown -R root:root .

./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 \
--enable-clamavdb-path=/usr/local/share/clamav

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)
--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)

Configurare il file /var/qmail/control/simsizelimit se non lo si è ancora fatto. Esso imposterà a circa 10MB le dimensioni dei messaggi che saranno passati a spamassassin:

echo 10000000 > /var/qmail/control/simsizelimit

Creare la cartella tyemporanea sotto qmail e assegnare i privilegi opportuni:

mkdir /var/qmail/simscan
chown clamav:clamav /var/qmail/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 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

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 in un 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:

CLAMAV_UID=`id -u clamav` 
CLAMAV_GID=`id -g clamav` 
echo "none /var/qmail/simscan tmpfs nodev,noexec,noatime,uid=$CLAMAV_UID,gid=$CLAMAV_GID,mode=2750 0 0" >> /etc/fstab

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

Errore in compilazione con gcc 4.4

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

Rispondi |

nessun problema con gcc 4.5.2

qui nessun problema con gcc 4.5.2 su Slackware64-13.37

Rispondi |

patch per simscan

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);


Rispondi |

Eppure a me simscan funziona

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...

Rispondi |

Grazie. Proverò appena

Grazie. Proverò appena possibile

Rispondi |