Installazione e configurazione di Spamassassin

25 giugno 2023 by Roberto Puzzanghera 2 commenti

SpamAssassin is a mature, widely-deployed open source project that serves as a mail filter to identify Spam. SpamAssassin uses a variety of mechanisms including header and text analysis, Bayesian filtering, DNS blocklists, and collaborative filtering databases. SpamAssassin runs on a server, and filters spam before it reaches your mailbox.

Changelog

  • Jun 25, 2023
    - The ExtractText notes have been revised and corrected by Gabriel Torres
  • Dec 27, 2022
    - SA upgraded to v. 4.0.0
  • 14 luglio 2021
    - aggiunto il setup di DCC (nella prossima pagina)
    - spostata la configurazione di Razor, Pyzor e Spamcop a una pagina separata

Aggiornamento di spamassassin alla versione 4.0.x

Ho scritto come aggiornare alla version 4.0 in una pagina separata qui.

Installazione

Creare l'utente e il gruppo spamd, preparare le cartelle:

mkdir -p /etc/mail/spamassassin /home/spamd

groupadd spamd
useradd -g spamd -d /home/spamd spamd
chown -R spamd:spamd /home/spamd

Installare spamassassin via Cpan

perl -MCPAN -e shell
o conf prerequisites_policy ask
install Mail::SpamAssassin
quit

Note di installazione per gli utenti Slackware

  • REQUIRED module missing: HTML::Parser
  • REQUIRED module missing: Net::DNS
  • REQUIRED module missing: NetAddr::IP
  • REQUIRED module missing: BSD::Resource
  • optional module missing: Digest::SHA1
  • optional module missing: Mail::SPF
  • optional module missing: Razor2
  • optional module missing: IO::Socket::INET6
  • optional module missing: IO::Socket::SSL
  • optional module missing: Mail::DKIM
  • optional module missing: LWP::UserAgent
  • optional module missing: HTTP::Date
  • optional module missing: Encode::Detect
  • optional module missing: Geo::IP
  • optional module missing: IO::Socket::IP
  • optional module missing: Net::Patricia

Questi moduli mancano e devono essere installati con CPAN. Alcuni di essi hanno a loro volta delle dipendenze...

Alla fine questi sono i moduli che ho installato, nel seguente ordine (rispondere yes se vengono trovate delle dipendenze, installare il tutto in questo ordine)

perl -MCPAN -e shell
o conf prerequisites_policy ask

force notest install Socket6 IO::Socket IO::Socket::INET6 LWP install MD5 CPAN::DistnameInfo Mail::DKIM

Installare i prerequisiti di Net::DNS:

force notest install Test::More MIME::Base64 Digest::MD5 Digest::HMAC_MD5 Net::IP

Continuare installando (sempre da CPAN):

force notest install Net::Ping Net::DNS Time::HiRes Digest::SHA1 Getopt::Long Digest::Nilsimsa URI::Escape HTML::Parser HTTP::Date IO::Zlib Archive::Tar Mail::SPF
force notest install Mail::SPF::Query Net::Ident IO::Socket::SSL Mail::DomainKeys Mail::DKIM LWP::UserAgent HTTP::Date Encode::Detect BSD::Resource
force notest install Storable DB_File Net::SMTP IP::Country::Fast BerkeleyDB
force notest install Geo::IP IO::Socket::IP Net::Patricia
force notest install Mail::DMARC::PurePerl DBD::SQLite

Infine, se tutto è ok installare i moduli spamassassin e Razor2 da CPAN

force notest install Mail::SpamAssassin Mail::SpamAssassin::Plugin::Razor2

Ho dovuto dare un "force" all'installzione.. comunque funziona.

Abbiamo installato il pacchetto perl Razor2 che vedremo nella pagina successiva.

Configurazione

I file di configurazione sono in /etc/mail/spamassassin

# cd /etc/mail/spamassassin
# ls
init.pre  local.cf  v310.pre  v312.pre  v320.pre  v330.pre v341.pre v342.pre v343.pre v400.pre

local.cf

# Add *****SPAM***** to the Subject header of spam e-mails
# rewrite_header Subject *****SPAM*****
# put here your subnet
trusted_networks 10.0.0.
# Set the threshold at which a message is considered spam (default: 5.0)
required_score 5.0
use_bayes 1
bayes_auto_learn 1
use_txrep 1
txrep_factory Mail::SpamAssassin::SQLBasedAddrList

ExtractText

Il compito del plugin ExtractText, quando abilitato, è di convertire gli allegati (incluse le immagini, per mezzo di un programma esterno OCR) in testo semplice al fine di consentire a SpamAssassin di applicare le sue regole al testo. Pertanto se viene ricevuto un file di tipo doc/pdf/images con testo contenente spam all'interno, SpamAssassin sarà in grado di marcare l'email come spam in modo sicuro.

A tal fine è prima necessario installare alcuni programmi esterni nel nostro server. La configurazione da aggiungere a local.cf caricherà questi programmi per fare la scansione di ogni allegato ai messaggi ricevuti.

Installare i programmi esterni richiesti. Gli utenti Debian faranno in questo modo;

apt-get install antiword
apt-get install docx2txt
apt-get install unrtf
apt-get install odt2txt
apt-get install tesseract-ocr
apt-get install poppler-utils

Gli utenti Slackware troveranno questi programmi su SlackBuild, mentre poppler è già disponibile nella distribuzione.

Aggiungere le seguenti righe al file local.cf:

ifplugin Mail::SpamAssassin::Plugin::ExtractText

extracttext_external pdftotext /usr/bin/pdftotext -nopgbrk -layout -enc UTF-8 {} -
extracttext_use pdftotext .pdf application/pdf

# http://docx2txt.sourceforge.net
extracttext_external docx2txt /usr/bin/docx2txt {} -
extracttext_use docx2txt .docx application/docx

extracttext_external antiword /usr/bin/antiword -t -w 0 -m UTF-8.txt {}
extracttext_use antiword .doc application/(?:vnd\.?)?ms-?word.*

extracttext_external unrtf /usr/bin/unrtf --nopict {}
extracttext_use unrtf .doc .rtf application/rtf text/rtf

extracttext_external odt2txt /usr/bin/odt2txt --encoding=UTF-8 {}
extracttext_use odt2txt .odt .ott application/.*?opendocument.*text
extracttext_use odt2txt .sdw .stw application/(?:x-)?soffice application/(?:x-)?starwriter

extracttext_external tesseract {OMP_THREAD_LIMIT=1} /usr/bin/tesseract -c page_separator= {} -
extracttext_use tesseract .jpg .png .bmp .tif .tiff image/(?:jpeg|png|x-ms-bmp|tiff)

add_header all ExtractText-Flags _EXTRACTTEXTFLAGS_

#header PDF_NO_TEXT X-ExtractText-Flags =~ /\bNoText\b/
#describe PDF_NO_TEXT PDF without text
#score PDF_NO_TEXT 0.2

#header DOC_NO_TEXT X-ExtractText-Flags =~ /\bNoText\b/
#describe DOC_NO_TEXT Document without text
#score DOC_NO_TEXT 0.2

#header EXTRACTTEXT exists:X-ExtractText-Flags
#describe EXTRACTTEXT Email processed by extracttext plugin
#score EXTRACTTEXT 0.001

endif

Si possono notare alcune righe commentate, che si possono lasciare così oppure abilitare per fare test. La regola EXTRACTTEXT serve solo per testare che il plugini sia effettivamente attivo. PDF_NO_TEXT e DOC_NO_TEXT saranno azionate nel caso di documenti vuoti in allegato. In tal caso si avrà un header come il seguente:

X-Spam-ExtractText-Flags: NoText

init.pre

# RelayCountry - add metadata for Bayes learning, marking the countries
# a message was relayed through
#
# Note: This requires the IP::Country::Fast Perl module
#
loadplugin Mail::SpamAssassin::Plugin::RelayCountry

# URIDNSBL - look up URLs found in the message against several DNS
# blocklists.
#
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL

# SPF - perform SPF verification.
#
loadplugin Mail::SpamAssassin::Plugin::SPF

v400.pre

Abilitare tutti i nuovi plugin disponibili con la versione 4 di SA

loadplugin Mail::SpamAssassin::Plugin::ExtractText 
loadplugin Mail::SpamAssassin::Plugin::DecodeShortURLs 
loadplugin Mail::SpamAssassin::Plugin::DMARC

sa-update

sa-update aggiorna le regole (richiede gpg 1.4). Prima di avviare spamassassin per la prima volta è necessario scaricare le regole:

sa-update

Aggiungere poi al crontab questa riga per aggiornare le regole quotidianamente

# spamassassin update
30 3 * * * /usr/loacl/bin/sa-update --nogpg -v &

L'ozione -v produrrà un avviso email nella casella postmaster.

Test

Lanciare questo test di debug dalla linea di comando. Se non si ottengono errori tutto è pronto per lanciare il daemone.

sudo -u spamd -H spamassassin -D --lint

A questo punto non chiudere spamd with ctrl+C, perchè il prossimo test fatto con spamc avrà bisogno di connettersi a questo servizio.

Da un altro terminale, controllare che l'intestazione sia correttamente inserita:

echo -e "From: myself@mymailserver.net\nTo:myfriend@domain.net\nSubject: test\n\n" | spamc

Received: from localhost by qmail.mymailserver.net
 with SpamAssassin (version 3.3.1);
 Tue, 30 Nov 2010 23:18:37 +0100
From: myself@mymailserver.net
To: myfriend@domain.net
Subject: test
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-04-18) on qmail.mymailserver.net
X-Spam-Flag: YES
X-Spam-Level: *****
X-Spam-Status: Yes, score=5.4 required=5.0 tests=BAYES_99,FREEMAIL_FROM,
 MISSING_DATE,MISSING_MID,NO_RECEIVED,NO_RELAYS,TVD_SPACE_RATIO,
 T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.3.1

Avvio di spamassassin

Scaricare lo startup script:

cd /usr/local/bin
wget https://notes.sagredo.eu/files/qmail/spamdctl
chmod +x spamdctl

E' necessario sostituire l'IP del firewall (l'IP del server come visto dalla rete Internet) e controllare che il path dove è stato installato spamd coincida con quello indicato nello script seguente.

#!/bin/bash

# Spamd init script
#
# August, 2th 2003
# Martin Ostlund, nomicon
# Modified slightly by Troy Belding for Qmailrocks - February 23, 2004
#
# Modified by Roberto Puzzanghera - September 02, 2014
# November 17, 2020: moved log file to /var/log/spamassassin/spamd.log

# The IP of your server as seen from the internet
IP=<firewall-IP>

DAEMON=/usr/local/bin/spamd
NAME=spamd
SNAME=spamdctl
DESC="SpamAssassin Mail Filter Daemon"
PIDFILE="/var/run/$NAME.pid"
PNAME="spamd"

DOPTIONS="-x -u spamd -A 127.0.0.1,::1,${IP} -s /var/log/spamassassin/spamd.log -H /home/spamd -d --pidfile=$PIDFILE"

KILL="/bin/kill"
KILLALL="/bin/killall"
# Defaults - don''t touch, edit /etc/mail/spamassassin/local.cf
ENABLED=0
OPTIONS=""

set -e

case "$1" in
start)
echo -n "Starting $DESC: "
$DAEMON $OPTIONS $DOPTIONS

echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
$KILL -9 `cat $PIDFILE`
/bin/rm $PIDFILE
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
$0 stop
$0 start

echo "$NAME."
;;
*)
ME=/usr/local/bin/$SNAME
echo "Usage: $ME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0

Controlliamo che spamd sia in esecuzione:

# spamdctl start
# ps axfu|grep spamd
root      1859  0.1  3.4 139360 61044 ?        Ss   19:00   0:01 /usr/bin/spamd -x -u spamd -A 127.0.0.1,[firewall-IP] -H /home/spamd -d --pidfile=/var/run/spamd.pid
spamd     1860  0.0  3.2 139360 58984 ?        S    19:00   0:00  \_ spamd child
spamd     1861  0.0  3.2 139360 58984 ?        S    19:00   0:00  \_ spamd child

Digitare spamd -c per vedere come deve essere usato spamd. Vedere anche http://spamassassin.apache.org/full/3.4.x/doc/spamd.html

Avviare spamassassin al boot

Per far sì che spamassassin sia avviato al boot inserire lo startup script nel proprio rc.local:

/usr/local/bin/spamdctl start &

logrotate

Creare un file /etc/logrotate.d/spamd come questo (slackware) per ruotare i log di spamd:

cat > /etc/logrotate.d/spamassassin/spamd /var/log/spamassassin/razor-agent.log << __EOF__
/var/log/spamd.log {
su root apache
rotate 5
daily
missingok
notifempty
delaycompress
postrotate
   [ -f '/var/run/spamd.pid' ] && (kill -HUP `cat /var/run/spamd.pid`) || exit 0
endscript
}
__EOF__

Commenti

Chiarimento configurazione

Buongirono Roberto,

un chiarimento sulla configurazione di SA, all'inizio della pagina scrivi "Abilitare tutti i nuovi plugin dal file /etc/mail/spamassassin/v343.pre."

Nella lista dei files da modificare fai riferimento a v310.pre.

Grazie dell'attenzione

Gabriele

Rispondi |

Chiarimento configurazione

Ciao Gabriele,

in effetti quella frase su v343.pre è fuorviante (ora la levo). Come sai in questi file ci sono i plugin aggiunti nella rispettiva versione. Io cito solo v310.pre perchè contiene spamcop, razor, pyzor, che menziono esplicitamente nella guida. Negli altri file ci sono plugin addizionali che ognuno può decidere o meno di mettere dentro. 

Rispondi |