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: mailscanner
