Mailscanner & Mailwatch

Installazione

Mailscanner è un ottimo sistema antispam largamente utilizzato in tutto il mondo e, fortuna per noi, rilasciato con licenza GPL. La configurazione che portiamo in esempio parte da una debian Lenny con abilitati i repository backports e volatile.

Installiamo tutto ciò di cui avremo bisogno, non proprio un’installazione minimale…

apt-get install -t lenny-backports postfix postfix-pcre
apt-get install -t lenny-volatile clamav-daemon clamav-freshclam
apt-get install --no-install-recommends  -t lenny-backports mailscanner libhtml-format-perl libio-socket-inet6-perl libmail-spf-perl libnet-cidr-lite-perl libsys-syslog-perl spamc tnef re2c zip unrar bzip2

Creiamo anche un gruppo apposito che ci servirà in seguito.

addgroup mailscanner
adduser www-data mailscanner
adduser clamav mailscanner
adduser postfix mailscanner

Configurazione di postfix

Il sistema funziona come mero filtro a monte di qualsiasi server di posta, non è quindi necessario che abbia conoscenza delle caselle di posta effettivamente configurate. Quello che farà sarà riceve la posta sull’interfaccia pubblica, filtrarla e girarla al server di posta interno. Ovviamente anche il server interni useranno questo sistema per l’invio, diventa quindi necessario conoscere i domini per i quali si fa da relay. Una configurazione minimale di postfix potrebbe essere la seguente:

postconf -e "myorigin = interno.local"
postconf -e "myhostname = spamfilter.interno.local"
postconf -e "mynetworks = 127.0.0.0/8 192.168.0.0/24"
postconf -e "inet_protocols = ipv4"
postconf -e "relayhost = mail.interno.local"
postconf -e "smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain, reject_non_fqdn_sender, permit"
postconf -e "smtpd_recipient_restrictions = reject_unauth_pipelining, reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_mynetworks, reject_invalid_hostname, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_destination, reject_rbl_client zen.spamhaus.org, reject_rbl_client combined.njabl.org, reject_rbl_client bl.spamcop.net, permit"
postconf -e "smtpd_data_restrictions = reject_unauth_pipelining"
postconf -e "smtpd_helo_required = yes"
postconf -e "header_checks = regexp:/etc/postfix/header_checks"
postconf -e "relay_domains = hash:/etc/postfix/relay_domains"

echo "/^Received:/ HOLD" > /etc/postfix/header_checks

/etc/init.d/postfix restart
chgrp mailscanner /var/spool/postfix/hold
chmod g+rX /var/spool/postfix/hold

In pratica postfix effettuerà le verifiche del caso sulle email, controlla che non siano provenienti da una blacklist, dopo di che, grazie alla direttiva header_check, inserirà le email valide nella coda hold dalla quale saranno prelevate da mailscanner ed analizzate.

Potremmo anche vole evitare che postfix (ri)controlli anche le mail generate localmente. Per fare questo modifichiamo il file master.cf in modo che la direttiva pickup sia così impostata:

pickup    fifo  n       -       -       60      1       pickup
         -o content_filter=
         -o receive_override_options=no_header_body_checks

Configurazione di Mailscanner

Mailscanner ha un’infinità di parametri, riporto solo quelli che andremo a modificare.

cp /etc/MailScanner/MailScanner.conf /etc/MailScanner/MailScanner.conf.orig
touch /etc/MailScanner/conf.d/MiaDitta.conf

In MailScanner.conf modifichiamo i seguenti parametri

%org-name% = MiaDitta
%org-long-name% = MiaDitta spa
%web-site% = www.MiaDitta.com
Max Children = 3
Run As User = postfix
Run As Group = mailscanner
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
Virus Scanners = clamd
Monitors for ClamAV Updates = /var/lib/clamav/*.cld /var/lib/clamav/*.cvd
High SpamAssassin Score = 15
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin

In un sistema debian come il nostro è anche richiesto di modificare lo script di avvio

# modificare /etc/init.d/mailscanner

check_dir /var/spool/MailScanner       ${user:-postfix} ${group:-postfix}
check_dir /var/lib/MailScanner         ${user:-postfix} ${group:-postfix}
check_dir /var/run/MailScanner         ${user:-postfix} ${group:-postfix}
check_dir /var/lock/subsys             ${user:-root} ${group:-root}
check_dir /var/lock/subsys/MailScanner ${user:-postfix} ${group:-postfix}

# In /etc/default/mailscanner
run_mailscanner=1

Sfortunatamente il pacchetto di mailscanner non è perfetto e ci sono ancora un po’ di cose da sistemare, ad esempio lo script /usr/sbin/update_bad_phishing_emails ha i percorsi impostati in modo errato

# Alla linea 42 modificare come segue
my $msconf = new FileHandle("< /etc/MailScanner/MailScanner.conf") or warn "Cannot open main configuration file /etc/MailScanner.conf";

# Alla linea 52
my $target= "/etc/MailScanner/phishing.bad.emails.conf";

Configuriamo anche un paio di aggiornamenti automatici

# In /etc/cron.d/mailscanner

00    05  * * *  root /usr/sbin/update_phishing_sites
15    02  * * *  root /usr/sbin/update_bad_phishing_emails

E con questo abbiamo finito :-)

Configurazione di mailwatch

Mailwatch è una pratica interfaccia per visualizzare lo stato delle email in transito dal nostro gateway di posta Sfortunatamente non esiste un pacchetto per debian, ma essendo una classica applicazione php l’installazione non è particolarmente complessa

apt-get install php5 php5-gd php5-mysql php5-cli
apt-get install mysql-client

Minimizziamo l’uso delle risorse utilizzate da apache

<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       2
    MaxClients           15
    MaxRequestsPerChild   0
</IfModule>

Dal sito http://mailwatch.sourceforge.net/doku.php scarichiamo l’ultima versione (1.0.5, al momento in cui scrivo)

Da http://www.gbnetwork.co.uk/mailscanner/index.html invece preleviamo la patch riportata in fondo alla pagina per correggere un piccolo baco con la visualizzazione dei messaggi in coda se l’MTA in uso è postfix

cd /usr/local/src/
wget  http://www.gbnetwork.co.uk/mailscanner/files/postfixmail.tar.gz
wget http://sourceforge.net/projects/mailwatch/files/mailwatch/1.0.5/mailwatch-1.0.5.tar.gz/download

tar xzf mailwatch-1.0.5.tar.gz
tar -xzf postfixmail.tar.gz

La pecca peggiore di mailwatch è che supporta solo MySQL, quindi niente postgresql (pare che il supporto sia previsto per la fantomatica ver.2).

mysql> grant ALL on mailscanner.* to 'mailscanner'@'mailgw'  IDENTIFIED BY 'password';
cd mailwatch-1.0.5
mysql mailscanner -h mysql-host -u mailscanner -p < create.sql
mysql mailscanner -h mysql-host -u mailscanner -p

mysql> INSERT INTO users (username, password, fullname, type) VALUES (‘admin’,md5(‘password’),’Mailscanner Admin’,'A’)

Dobbiamo anche istruire mailscanner ad usare il DB appena creato

cp /usr/local/mailwatch-1.0.5/*.pm /etc/MailScanner/CustomFunctions/
cd /etc/MailScanner/CustomFunctions
vim MailWatch.pm
vim SQLBlackWhiteList.pm
vim SQLSpamSettings.pm

Modifichiamo anche MailScanner.conf in modo che utilizzi il DB per White/BlackList

Quarantine User = postfix
Quarantine Group = mailscanner
Quarantine Permissions = 0660
Quarantine Whole Message = yes
Is Definitely Not Spam = &SQLWhitelist
Is Definitely Spam = &SQLBlacklist
Always Looked Up Last = &MailWatchLogging

Configuriamo anche la parte php di mailwatch

cd /usr/local/src/mailwatch-1.0.5/
cp -a mailscanner /var/www/
cd /var/www/mailscanner
chgrp www-data temp
chmod g+w temp
chgrp www-data images
chgrp www-data images/cache
chmod ug+rwx images
chmod ug+rwx images/cache

cp conf.php.example conf.php

In conf.php sono da correggere i parametri relativi al DB e alla

define('DB_TYPE', 'mysql');
define('DB_NAME', 'mailscanner');
define('DB_USER', 'mailscanner');
define('DB_HOST', 'mysql-host');
define('DB_PASS', 'password');

define('MAILWATCH_HOME', '/var/www/mailscanner');
define('MS_LIB_DIR', '/usr/share/MailScanner/');
define('QUARANTINE_USE_FLAG', true);
define('QUARANTINE_FROM_ADDR', 'mailscanner@MiaDitta.it');

Sistemiamo anche geoipupdate.php che ha il solito path errato e il comando SQL non è preciso.

...
$OUTDIR="/var/www/mailscanner/temp";
...
dbquery("LOAD DATA LOCAL INFILE '".$base.'/'.$file2."' INTO TABLE geoip_country FIELDS TERMINATED BY ',' ENCLOSED BY '\"'");
...

Applichiamo anche la patch di cui si parlava sopra

cd /var/www/mailscanner
cp /usr/local/src/postfixmail/postfix* .
patch functions.php /usr/local/src/postfixmail/functions.php.diff

SpamAssassin

Ultime fatiche: aggiustiamo la conf di spamassassin

mv /etc/spamassassin/local.cf /etc/spamassassin/local.cf.disabled
cp /etc/MailScanner/spam.assassin.prefs.conf /etc/MailScanner/spam.assassin.prefs.conf.orig

Configurare a piacere spam.assassin.prefs.conf :-)

Ritocchi

Copiamo e configuriamo gli script di manutenzione di mailwatch

cp /usr/local/src/mailwatch-1.0.5/tools/* /usr/local/sbin/

Su tutti i file php va modificata la posizione di mailscanner da /var/www/html/mailscanner a /var/www/mailscanner, mentre in sendmailrelay.init va modificata la posizione dello script php da /usr/sbin a /usr/local/sbin

SPF

Installiamo il pacchetto postfix-policyd-spf-python e configuriamolo come segue

apt-get install postfix-policyd-spf-python
# /etc/postfix-policyd-spf-python/policyd-spf.conf
debugLevel = 1
defaultSeedOnly = 1
HELO_reject = SPF_Not_Pass
Mail_From_reject = Fail
PermError_reject = False
TempError_Defer = False
skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0//104,::1//128
Whitelist = 192.168.0.0/24

Aggiungiamo la seguente direttiva al file master.cf di postfix

policyd-spf  unix  -       n       n       -       0       spawn
            user=nobody argv=/usr/bin/python /usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf

Modifichiamo anche la direttiva smtpdrecipientrestrictions in main.cf

smtpd_recipient_restrictions =...
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf,
   ...

Greylisting

Un altro utile strumento per ovviare allo spam è il greylisting, ovvero all’arrivo di un’email, se il mittente è ignoto, si richiede al server remoto di rispedire il messaggio successivamente. Normalmente uno spammer non considera i msg di errore ritornati dai server ed ecco che il msg non sarà rispedito e noi averemo un’email in meno di cui preoccuparci. Ci sono molto strumenti per farlo, uno dei più pratici è sqlgrey, evoluzione di postgrey con il supporto ai DB (PostgreSQL! :-) )

apt-get install sqlgrey
vim /etc/sqlgrey/sqlgrey.conf
user = sqlgrey
group = sqlgrey
inet = 2501    # bind to localhost:2501
db_type = Pg
db_name = sqlgrey
db_host =
db_port = 5484
db_user = sqlgrey
db_pass = pippo
prepend = 1
greymethod = smart
optmethod = none
reject_first_attempt = delay

Al riavvio sqlgrey popolerà il db con le tabelle opportune. Ora non resta che modificare la conf. di postfix

smtpd_recipient_restrictions = ...
    reject_unauth_destination,
    check_policy_service inet:127.0.0.1:2501,
    check_policy_service unix:private/policyd-spf,
    ...

Manutenzione

Configuriamo alcuni script di manutenzione per il db, in particolare per il controllo dei messaggi in quarantena

cp /usr/local/src/mailwatch-1.0.5/tools/quarantine_* /usr/local/sbin/
cp /usr/local/src/mailwatch-1.0.5/tools/db_clean.php /usr/local/sbin/
chmod +x /usr/local/sbin/*

Modifichiamo la prima linea di quarantinemaint.php rimuovendo il parametro ‘n’, altrimenti php-cli non legge la configurazione di php

#!/usr/bin/php -q

Aggiungiamo a /etc/cron.d/mailscanner gli script da eseguire

# In /etc/cron.d/mailscanner

30    7 * * 2    root /usr/local/sbin/quarantine_maint.php --clean &> /dev/null
45    23 * * *   root /usr/local/sbin/db_clean.php &> /dev/null

Altro script interessante è ScamNailer http://www.scamnailer.info/downloads.html, dello stesso autore di MailScanner.

Filtri Bayesiani

Un filtro bayesiano applica un’analisi statistica (vedi: http://it.wikipedia.org/wiki/Statistica_bayesiana) alle email in arrivo per valutare se esse siano spam o meno. Nel nostro caso centralizzeremo i filtri bayesiani su un DB esterno, SpamAssassin viene già con tutto l’occorrente :-)

Modifichiamo quindi il file /etc/MailScanner/spam.assassin.prefs.conf

use_bayes 1
bayes_store_module           Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn                DBI:mysql:mailscanner:mysql-host
bayes_sql_username           mailscanner
bayes_sql_password           mailscanner
bayes_sql_override_username  postfix

bayes_ignore_header MiaDitta-MailScanner
bayes_ignore_header MiaDitta-MailScanner-SpamCheck
bayes_ignore_header MiaDitta-MailScanner-SpamScore
bayes_ignore_header MiaDitta-MailScanner-Information

Per semplicità utilizziamo le stesse credenziali viste per mailscanner. Creiamo le tabelle necessarie a SpamAssassin

mysql mailscanner -h mysql-host -u mailscanner -p <  /usr/share/doc/spamassassin/sql/bayes_mysql.sql

Ogni email viene scomposta e le sue parti sono archiviate nel db che abbiamo preposto, nella configurazione predefinita i filtri beyesiani non sono in funzione fino a che non siano state individuate almeno 200 email considerate sicuramente spam, con un punteggio assegnato da SpamAssassin di almeno 12 punti. Il database può crescere in modo molto rapido, in funzione del traffico sul server, istruiamo quindi il sistema a fare pulizia nottetempo. Nel solito file di cron /etc/cron.d/mailscanner aggiungiamo:

30 01 * * * root /usr/bin/sa-learn --force-expire --sync -p /etc/MailScanner/spam.assassin.prefs.conf

Note

Volendo si possono anche personalizzare i messaggi di mailscanner. Li trovate in etc/Mailscanner/reports

NB: In produzione abbiamo disabilitato i controlli bayesiani. Non fornivano un vantaggio reale e rallentavano molto l’analisi nella posta in transito.

Tags:

I commenti sono bloccati.