Postfix + Clamav + Courier + Spamassassin + Postgrey
postfix è un server di posta sviluppato tenendo d'occhio la sicurezza. Su una macchina Linux gli utenti di sistema, di default hanno una casella di posta. I diversi servizi associati alla posta elettronica (smtp, pop, imap, ...) controllano e inoltrano le email verso la casella di posta dell'utente. Questa è una configurazione sconsigliabile, benché molo facile da configurare (in pratica bisogna installare il software e poco più), dal momento che per abilitare la posta a un utente bisogna creare un utente di sistema, con ovvie ricadute negative dal punto di vista della sicurezza.
Quindi, in questo articolo proporremo una configurazione "virtuale", nel senso che le caselle di posta saranno delle cosiddette caselle di posta virtuali, slegate dagli utenti del sistema. Le credenziali di autenticazione e altri parametri necessari saranno definiti in un database mysql.
Gli altri programmi associati a questo servizio sono:
courier, che fornisce i servizi pop e imap;
clamav, l'antivirus;
spamassassin e postgrey, per il controllo antispam.
Il sistema proposto avrà quindi due sistemi antispam:
inizialmente postgrey rifiuta tutta la posta che arriva per la prima volta al server (dove il criterio per discriminare se accettare la posta o meno è costituito dalla combinazione di host inviante, mittente e destinatario). Il server inviante aspetta un po' e, se è configurato correttamente, riprova ad inviare il messaggio dopo un certo tempo. Quando un messaggio con la combinazione di parametri sopra indicata arriva di nuovo al server, dopo essere stato rifiutato da postgrey, viene lasciato passare, dal momento che il programma considera che il sistema mittente "si comporta bene", secondo le RFC relative a questo tipo di servizi Internet. Questo semplice meccanismo stronca alla radice il 90% dello spam che ci arriverà, dal momento che molti spammer non hanno un vero server di posta e inviano i messaggi con un normale client, per cui i messaggi vengono ricevuti solo una volta;
i messaggi che passano il filtro di postgrey vengono passati a un sistema antispam vero e proprio, che controlla il contenuto e altri aspetti del messaggio, dando dei punteggi a un certo numero di parametri, come ad esempio se contiene codice html o certe ricorrenze di parole. Questo sottosistema, costituito fondamentalmente da spamassassin, valuta se lasciare passare o mettere in quarantena il messaggio. Il tutto può essere configurato in modo che l'amministratore del server riceva un messaggio per ognuna delle email fermate da spamassassin.
A questi due sottosistemi si aggiunge anche il controllo che postfix può realizzare sul messaggio in arrivo in base a un certo numero di restrizioni che possono essere impostate. Ad esempio, possiamo scegliere di accettare solo i messaggi che hanno un FQDN valido, oppure controllare se il mittente si trova in qualche blacklist di spammer. Questo controllo viene realizzato prima dell'inoltro del messaggio al sottosistema gestito da postgrey. Questo triplo meccanismo, nella mia esperienza, è enormemente efficiente nella gestione dello spam che arriverà sul nostro server.
L'interfacciamento tra postfix e il sistema antivirus/antispam avviene attraverso un software aggiuntivo, chiamato amavis-new.
Innanzitutto installiamo tutto il software necessario, incluse le librerie che permettono l'interfacciamento di postfix e courier a mysql:
aptitude install postgrey postfix courier-pop courier-imap courier-authlib courier-authlib-mysql postfix-mysql clamav clamav-daemon razor spamassassin amavisd-new
Impostiamo alcuni parametri di configurazione di postfix, definiti nel file /etc/postfix/main.cf:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
delay_warning_time = 4h
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = $mydomain
mynetworks = 127.0.0.0/8 192.168.0.0/24
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
message_size_limit = 30360000
recipient_delimiter = +Direttive importanti sono alias_maps e alias_database, che contengono le impostazioni degli alias, usati anche da programmi come mailman (ulteriormente aggiungeremo le direttive per specificare la tabella di mysql dove verranno registrati gli alias virtuali), mynetworks che definisce le reti per le quali i client sono definiti locali (in pratica le reti dalle quali postfix accetterà posta). mailbox_size_limit = 0 indica che la casella di posta è senza limiti.
Abbiamo detto che tutti gli account saranno definiti in un database mysql. Quindi creiamo un database di nome postfix e un utente postfix che sarà l'unico a poter accedere a questo db:
CREATE DATABASE postfix;
GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY 'password';dopodiché bisogna definire la struttura delle tabelle del db postfix:
CREATE TABLE `admin` (
`username` varchar(255) NOT NULL default ",
`password` varchar(255) NOT NULL default ",
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`username`),
KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Admins';
CREATE TABLE `alias` (
`address` varchar(255) NOT NULL default ",
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL default ",
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`address`),
KEY `address` (`address`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Aliases';
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default ",
`description` varchar(255) NOT NULL default ",
`aliases` int(10) NOT NULL default '0',
`mailboxes` int(10) NOT NULL default '0',
`maxquota` int(10) NOT NULL default '0',
`transport` varchar(255) default NULL,
`backupmx` tinyint(1) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`),
KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Domains';
CREATE TABLE `domain_admins` (
`username` varchar(255) NOT NULL default ",
`domain` varchar(255) NOT NULL default ",
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Admins';
CREATE TABLE `log` (
`timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
`username` varchar(255) NOT NULL default ",
`domain` varchar(255) NOT NULL default ",
`action` varchar(255) NOT NULL default ",
`data` varchar(255) NOT NULL default ",
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Log';
CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default ",
`password` varchar(255) NOT NULL default ",
`name` varchar(255) NOT NULL default ",
`maildir` varchar(255) NOT NULL default ",
`quota` int(10) NOT NULL default '0',
`domain` varchar(255) NOT NULL default ",
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`username`),
KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';
CREATE TABLE `vacation` (
`email` varchar(255) NOT NULL default ",
`subject` varchar(255) NOT NULL default ",
`body` text NOT NULL,
`cache` text NOT NULL,
`domain` varchar(255) NOT NULL default ",
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`),
KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation';Per la configurazione delle caselle di posta virtuali, usiamo le seguenti direttive in /etc/postfix/main.cf:
# VIRTUAL MAILBOXES
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:105
virtual_mailbox_base = /var/mail/virtual/
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 104
virtual_transport = virtual
virtual_uid_maps = static:104
# quota support
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Mi dispiace, la casella di posta dell'utente ha superato il suo limite
virtual_overquota_bounce = yesImportanti sono le direttive virtual_uid_maps e virtual_gid_maps, che indicano l'id dell'utente e del gruppo di sistema dell'utente postfix. Questi id si possono trovare in /etc/passwd e /etc/group-.
Con questa configurazione, il server è pronto per il supporto quote, che però non vedremo in questo articolo per non allungare eccessivamente la trattazione. Il file mysql_virtual_mailbox_limit_maps.cf contiene i riferimenti alla tabella dove vengono registrate eventuali impostazioni per le quote utenti.
Vediamo i file contenenti la configurazione per l'accesso alle diverse tabelle del db postfix:
mysql_virtual_alias_maps.cf
user = postfix
password = <password>
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = addressmysql_virtual_domains_maps.cf
user = postfix
password = <password>
hosts = 127.0.0.1
dbname = postfix
select_field = description
table = domain
where_field = domainmysql_virtual_mailbox_maps.cf
user = postfix
password = <password>
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = usernamemysql_virtual_mailbox_limit_maps.cf
user = postfix
password = <password>
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = quota
where_field = username
-
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname,
check_policy_service inet:127.0.0.1:60000che in pratica consente il relay mail ai client appartenenti alle sottoreti definite in mynetworks e in cui gli host mittente e destinatario sono ben formati. L'ultima direttiva (check_policy_service) gira tutto quello che arriva al servizio di rete in ascolto sulla porta 60000, in pratica postgrey, come vedremo più avanti.
E' possibile specificare altre direttive in smtpd_recipient_restrictions che permettono il controllo del mittente sulle blacklist di spammer, ad esempio:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname,
check_policy_service inet:127.0.0.1:60000,
reject_rbl_client opm.blitzed.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client sbl-xbl.spamhaus.org -
root: email@dominio
poi bisogna lanciare il programma newaliases o postalias /etc/aliases per aggiornare la tabella degli alias (file /etc/aliases.db).
-
mkdir /var/mail/virtual
chown postfix:postfix /var/mail/virtual/
chmod ug+rwx /var/mail/virtual/
chmod -s /var/mail/virtual/
chmod o-rwx /var/mail/virtual/
/etc/init.d/postfix restartBisogna ricordarsi che, nel caso di domini virtuali, la username per il login sui servizi pop e imap deve essere specificata comprensiva del dominio.
-
authmodulelist="authmysql"
authmodulelistorig="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
daemons=5
authdaemonvar=/var/run/courier/authdaemone /etc/courier/authmysqlrc:
# The server name, userid, and password used to log in.
MYSQL_SERVER 127.0.0.1
MYSQL_USERNAME postfix
MYSQL_PASSWORD <password>
# MYSQL_PORT can be used with MySQL version 3.22 or later to specify a port to
# connect to.
MYSQL_PORT 0
# Leave MYSQL_OPT as 0, unless you know what you're doing.
MYSQL_OPT 0
# The name of the MySQL database we will open:
MYSQL_DATABASE postfix
# The name of the table containing your user data. See README.authmysqlrc
# for the required fields in this table.
MYSQL_USER_TABLE mailbox
# Either MYSQL_CRYPT_PWFIELD or MYSQL_CLEAR_PWFIELD must be defined. Both
# are OK too. crypted passwords go into MYSQL_CRYPT_PWFIELD, cleartext
# passwords go into MYSQL_CLEAR_PWFIELD. Cleartext passwords allow
# CRAM-MD5 authentication to be implemented.
MYSQL_CRYPT_PWFIELD password
# MYSQL_UID_FIELD - contains the numerical userid of the account
MYSQL_UID_FIELD 104
# Numerical groupid of the account
MYSQL_GID_FIELD 105
# The login id, default is id. Basically the query is:
#
# SELECT MYSQL_UID_FIELD, MYSQL_GID_FIELD, ... WHERE id='loginid'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/var/mail/virtual'
# The user's name (optional)
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
# MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)Oltre alle direttive che specificano i parametri di connessione al server mysql, sono molto importanti MYSQL_UID_FIELD e MYSQL_GID_FIELD, che specificano l'utente postfix e il gruppo di appartenenza tramite il quale si accederà ai servizi di courier, in modo simile a quanto detto relativamente al file main.cf di postfix.
Finito tutto facciamo ripartire tutti i servizi:/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-imap restart -
content_filter = amavis:[127.0.0.1]:10024
che come si vede, viene configurato come un servizio di rete in ascolto sulla porta 10024. Nel file /etc/postfix/master.cf, dobbiamo inserire:
amavis unix - - n - 3 smtp -o smtp_data_done_timeout=1200 -o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd -o content_filterquindi, amavis ascolta sulla porta 10024, ma poi gira tutto alla porta 10025, dove vengono applicate le direttive specificate in master.cf.
-
Read-only configuration: /usr/share/amavis/conf.d/
10-debian_scripts: Stuff you'd better not override
20-package: Packaging decisions, override at will
Read-write conffiles: /etc/amavis/conf.d/
01-debian: Rarely modified settings
05-domain_id: mydomain autodetection, local_domains config
05-node_id: myhostname autodetection
15-av_scanners: AV scanner interface configuration
15-content_filter_mode: Use this to re-enable spamassassin/av checks
20-debian_defaults: Commonly modified settings
50-user: Place your overrides here, if you want
If the package detects legacy config files, it renames them adding a ".disabled" extension, and the amavisd-new initscript will refuse to start the service until these files with a ".disabled" extension are removed or renamed. The legacy config files are /etc/amavis.conf and /etc/amavis/amavis.conf.
Come si vede, la configurazione di amavis è piuttosto complessa e articolata. Seguendo quanto consigliato nel file README.Debian, noi inseriremo le nostre direttive personalizzate in /etc/amavis/conf.d/50-user, che essendo l'ultimo file ad essere letto, sovrascrive tutta la configurazione definita precedentemente dagli altri file di configurazione. Le direttive più importanti in questo file sono:
# $MYHOME serves as a quick default for some other configuration settings.
# More refined control is available with each individual setting further down.
# $MYHOME is not used directly by the program. No trailing slash!
$MYHOME = '/var/lib/amavis'; # (default is '/var/amavis')
# $mydomain serves as a quick default for some other configuration settings.
# More refined control is available with each individual setting further down.
# $mydomain is never used directly by the program.
$mydomain = 'dominio'; # (no useful default)
# Set the user and group to which the daemon will change if started as root
# (otherwise just keeps the UID unchanged, and these settings have no effect):
$daemon_user = 'amavis'; # (no default (undef))
$daemon_group = 'amavis'; # (no default (undef))
# Runtime working directory (cwd), and a place where
# temporary directories for unpacking mail are created.
# if you change this, you might want to modify the cleanup()
# function in /etc/init.d/amavisd-new
# (no trailing slash, may be a scratch file system)
$TEMPBASE = $MYHOME; # (must be set if other config vars use is)
# Run the daemon in the specified chroot jail if nonempty:
#$daemon_chroot_dir = $MYHOME; # (default is undef, meaning: do not chroot)
$pid_file = "/var/run/amavis/amavisd.pid"; # (default: "$MYHOME/amavisd.pid")
$lock_file = "/var/run/amavis/amavisd.lock"; # (default: "$MYHOME/amavisd.lock")
# POSTFIX, or SENDMAIL in dual-MTA setup, or EXIM V4
# (set host and port number as required; host can be specified
# as IP address or DNS name (A or CNAME, but MX is ignored)
$forward_method = 'smtp:127.0.0.1:10025'; # where to forward checked mail
$notify_method = $forward_method; # where to submit notifications
# Net::Server pre-forking settings
# You may want $max_servers to match the width of your MTA pipe
# feeding amavisd, e.g. with Postfix the 'Max procs' field in the
# master.cf file, like the '2' in the: smtp-amavis unix - - n - 2 smtp
$max_servers = 2; # number of pre-forked children (default 2)
$max_requests = 10; # retire a child after that many accepts (default 10)
$child_timeout=5*60; # abort child if it does not complete each task in n sec
# (default: 8*60 seconds)
# With Postfix (2.0) a quick reminder on what local domains normally are:
# a union of domains specified in: $mydestination, $virtual_alias_domains,
# $virtual_mailbox_domains, and $relay_domains.
@local_domains_acl = ( ".$mydomain" ); # $mydomain and its subdomains
# SMTP SERVER (INPUT) PROTOCOL SETTINGS (e.g. with Postfix, Exim v4, ...)
# (used when MTA is configured to pass mail to amavisd via SMTP or LMTP)
$inet_socket_port = 10024; # accept SMTP on this local TCP port
# SMTP SERVER (INPUT) access control
# - do not allow free access to the amavisd SMTP port !!!
#
# when MTA is at the same host, use the following (one or the other or both):
$inet_socket_bind = '127.0.0.1'; # limit socket bind to loopback interface
# (default is '127.0.0.1')
@inet_acl = qw( 127.0.0.1 ); # allow SMTP access only from localhost IP
# (default is qw( 127.0.0.1 ) )
# Notifications
$notify_spam_sender_templ = read_text('/var/lib/amavis/notify_spam_sender.txt');
# The following symbolic constants can be used in *destiny settings:
#
# D_PASS mail will pass to recipients, regardless of bad contents;
#
# D_DISCARD mail will not be delivered to its recipients, sender will NOT be
# notified. Effectively we lose mail (but will be quarantined
# unless disabled). Losing mail is not decent for a mailer,
# but might be desired.
#
# D_BOUNCE mail will not be delivered to its recipients, a non-delivery
# notification (bounce) will be sent to the sender by amavisd-new;
# Exception: bounce (DSN) will not be sent if a virus name matches
# $viruses_that_fake_sender_re, or to messages from mailing lists
# (Precedence: bulk|list|junk);
#
# D_REJECT mail will not be delivered to its recipients, sender should
# preferably get a reject, e.g. SMTP permanent reject response
# (e.g. with milter), or non-delivery notification from MTA
# (e.g. Postfix). If this is not possible (e.g. different recipients
# have different tolerances to bad mail contents and not using LMTP)
# amavisd-new sends a bounce by itself (same as D_BOUNCE).
#
# Notes:
# D_REJECT and D_BOUNCE are similar, the difference is in who is responsible
# for informing the sender about non-delivery, and how informative
# the notification can be (amavisd-new knows more than MTA);
# With D_REJECT, MTA may reject original SMTP, or send DSN (delivery status
# notification, colloquially called 'bounce') - depending on MTA;
# Best suited for sendmail milter, especially for spam.
# With D_BOUNCE, amavisd-new (not MTA) sends DSN (can better explain the
# reason for mail non-delivery, but unable to reject the original
# SMTP session). Best suited to reporting viruses, and for Postfix
# and other dual-MTA setups, which can't reject original client SMTP
# session, as the mail has already been enqueued.
$final_virus_destiny = D_BOUNCE; # (defaults to D_BOUNCE)
$final_banned_destiny = D_BOUNCE; # (defaults to D_BOUNCE)
$final_spam_destiny = D_BOUNCE; # (defaults to D_REJECT)
$final_bad_header_destiny = D_BOUNCE; # (defaults to D_PASS), D_BOUNCE suggested
$virus_admin = "antivirus\@$mydomain";
$spam_admin = "antispam\@$mydomain";
# whom notification reports are sent from (ENVELOPE SENDER);
# may be a null reverse path, or a fully qualified address:
# (admin and recip sender addresses default to $mailfrom
# for compatibility, which in turn defaults to undef (empty) )
# If using strings in double quotes, don't forget to quote @, i.e. \@
$mailfrom_notify_admin = "antivirus\@$mydomain";
$mailfrom_notify_recip = "antispam\@$mydomain";
$mailfrom_notify_spamadmin = "antispam\@$mydomain";
# 'From' HEADER FIELD for sender and admin notifications.
# This should be a replyable address, see rfc1894. Not to be confused
# with $mailfrom_notify_sender, which is the envelope return address
# and should be empty (null reverse path) according to rfc2821.
#
# The syntax of the 'From' header field is specified in rfc2822, section
# '3.4. Address Specification'. Note in particular that display-name must be
# a quoted-string if it contains any special characters like spaces and dots.
$hdrfrom_notify_sender = "Antispam <antispam\@$mydomain>";
# Location to put infected mail into: (applies to 'local:' quarantine method)
# empty for not quarantining, may be a file (mailbox),
# or a directory (no trailing slash)
# (the default value is undef, meaning no quarantine)
$QUARANTINEDIR = '/var/lib/amavis/virusmails';
$virus_quarantine_to = 'virus-quarantine'; # traditional local quarantine
$spam_quarantine_to = 'spam-quarantine';
# Add X-Virus-Scanned header field to mail?
$X_HEADER_TAG = 'X-Virus-Scanned'; # (default: undef)
$X_HEADER_LINE = "by $myversion (Debian) at $mydomain";
# a hash lookup table can be read from a file,
# one address per line, comments and empty lines are permitted:
read_hash(\%whitelist_sender, '/var/lib/amavis/whitelist');
read_hash(\%blacklist_sender, '/var/lib/amavis/blacklist');
read_hash(\%spam_lovers, '/var/lib/amavis/spam_lovers');Chiaramente, bisogna definire due caselle virtuali: antivirus@dominio e antispam@dominio, per poter ricevere le notifiche amministrative quando amavis identifica un virus o un messaggio di spam. Le tre direttive finali indicano la posizione della blacklist e whitelist (si rimanda alla documentazione ufficiale per la sintassi utilizzata in questi file). Ho preferito essere prolisso nell'illustrare questa configurazione, in modo da inserire i commenti esplicitativi presenti nello stesso file.
Il file /var/lib/amavis/notify_spam_sender.txt contiene il template del testo con cui il mittente verrà avvisato che il messaggio non è stato recapitato perché non ha superato il filtro antispam:
From: AutoSpamChecker <antispam@dominio>
Subject: **Message you sent blocked by our SPAM filter**
[? %m |#|In-Reply-To: %m]
Message-ID: <SS%n@%h>
Your message to: %R
has triggered our SpamAssassin SPAM filters and has been rejected.
The email you sent with the following subject has NOT BEEN DELIVERED:
Subject: %j
Our company uses a set of email filters to help block the delivery of
unsolicited commercial email, otherwise known as SPAM. For more
information on SPAM, please visit http://spam.abuse.net.
If you believe that you have received this message in error, please
accept our sincere apologies. We ask that you please reply to this
email message. When we receive your reply, we will add your email
address to our list of approved senders so that in the future
we can avoid making this mistake again. Please note that this is a
manual process and is only done during business hours.
The report below will help you determine why your message was flagged
as SPAM. If you continue to have problems, please contact our
administrator at abuse@dominio.
Thank you very much,
Postmaster
SpamAssassin report:
[%A
]\dove si suppone che abuse@dominio sia una casella di posta valida.
Se facciamo un /etc/init.d/amavis restart, possiamo leggere in /var/log/syslog alcune righe relative alla configurazione di amavis che ci danno indicazione dei moduli caricati (decompressori, il modulo per spamassassin, ecc.):
Jan 12 17:16:46 marte amavis[32333]: Module Archive::Tar 1.30
Jan 12 17:16:46 marte amavis[32333]: Module Archive::Zip 1.16
Jan 12 17:16:46 marte amavis[32333]: Module Compress::Zlib 1.42
Jan 12 17:16:46 marte amavis[32333]: Module Mail::SpamAssassin 3.002003
Jan 12 17:16:46 marte amavis[32333]: Module Razor2::Client::Version 2.81
...e se i sottosistemi antivirus e antispam sono funzionanti:
Jan 12 17:16:46 marte amavis[32333]: Amavis::DB code loaded
Jan 12 17:16:46 marte amavis[32333]: ANTI-VIRUS code loaded
Jan 12 17:16:46 marte amavis[32333]: ANTI-SPAM code loaded
Jan 12 17:16:46 marte amavis[32333]: ANTI-SPAM-SA code loaded
Jan 12 17:16:46 marte amavis[32333]: Unpackers code loaded
...
Jan 12 17:16:46 marte amavis[32333]: Using internal av scanner code for (primary) Clam Antivirus-clamd
Jan 12 17:16:46 marte amavis[32333]: Found secondary av scanner Clam Antivirus - clamscan at /usr/bin/clamscan
Jan 12 17:16:46 marte amavis[32333]: Creating db in /var/lib/amavis/db/; BerkeleyDB 0.31, libdb 4.4razor è un sistema distribuito di blacklisting per spammers, e viene usato da spamassassin per realizzare una verifica sul mittente del messaggio, prima dell'analisi effettiva del contenuto. razor verrà implementato e configurato più avanti, come parte del sottosistema relativo a spamassassin.
-
DatabaseOwner clamav
con
DatabaseOwner amavis
nel file /etc/clamav/freshclam.conf. Poi cambiamo tutti i permessi dei file di lavoro interessati:
/etc/init.d/clamav-daemon stop
/etc/init.d/clamav-freshclam stop
chown -R amavis:amavis /var/log/clamav
chown -R amavis:amavis /var/run/clamav
chown -R amavis:amavis /var/lib/clamav
sed -i 's/clamav adm/amavis adm/' /etc/logrotate.d/clamav-daemon
sed -i 's/clamav adm/amavis adm/' /etc/logrotate.d/clamav-freshclam
sed -i 's/User clamav/User amavis/' /etc/clamav/clamd.conf
/etc/init.d/clamav-freshclam start
/etc/init.d/clamav-daemon start -
# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
###########################################################################
#
rewrite_header Subject *****SPAM*****
report_safe 1
required_hits 5.0
skip_rbl_checks 0
rbl_timeout 10
dns_available yes
ok_locales all
score DCC_CHECK 3.8
score RAZOR_CHECK 2.5
score PYZOR_CHECK 2.5
# dcc
use_dcc 1
dcc_path /usr/bin/dccproc
dcc_add_header 1
dcc_dccifd_path /usr/sbin/dccifd
#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor
pyzor_add_header 1
#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf
#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 10.0Per completezza, riporto anche la configurazione di dcc e pyzor (altri due sistemi di verifica spammer distribuiti) che ho usato in passato. Per quanto riguarda razor (/etc/razor/razor-agent.conf):
# See razor-agent.conf (5)
# Change this to 5 for safer classification of MIME attachments. This will let more spam through
logic_method = 4
# Uncomment the next line for logging via syslog
#logfile = sys-syslog
# If you do log to syslog, consider using logrotate
# (see /usr/share/doc/razor/logcheck.ignore.eg)C'è un altro file in /var/lib/amavis/.razor/razor-agent.conf, che però viene autogenerato dallo stesso software:
#
# Razor2 config file
#
# Autogenerated by Razor-Agents v2.81
# Thu Jul 12 11:29:12 2007
# Non-default values taken from /var/lib/amavis/.razor/razor-agent.conf
#
# see razor-agent.conf(5) man page
#
debuglevel = 3
identity = identity
ignorelist = 0
listfile_catalogue = servers.catalogue.lst
listfile_discovery = servers.discovery.lst
listfile_nomination = servers.nomination.lst
logfile = razor-agent.log
logic_method = 4
min_cf = ac
razordiscovery = discovery.spamnet.com
rediscovery_wait = 172800
report_headers = 1
turn_off_discovery = 0
use_engines = 4,8
whitelist = razor-whitelistA questo punto bisogna dire al sistema di far partire spamassassin come servizio all'avvio della macchina. Questa operazione la si fa mettendo ENABLED = 1 nel file /etc/default/spamassassin:
# /etc/default/spamassassin
# Duncan Findlay
# WARNING: please read README.spamd before using.
# There may be security risks.
# Change to one to enable spamd
ENABLED=1
# Options
# See man spamd for possible options. The -d option is automatically added.
# SpamAssassin uses a preforking model, so be careful! You need to
# make sure -max-children is not set to anything higher than 5,
# unless you know what you're doing.
OPTIONS="-create-prefs -max-children 5 -helper-home-dir"
# Pid file
# Where should spamd write its PID to file? If you use the -u or
# -username option above, this needs to be writable by that user.
# Otherwise, the init script will not be able to shut spamd down.
PIDFILE="/var/run/spamd.pid"
# Set nice level of spamd
#NICE="-nicelevel 15"
# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
CRON=0Poi facciamo partire il servizio:
/etc/init.d/spamassassin start
# postgrey startup options, created for Debian
# (c)2004 Adrian von Bidder <[email protected]>
# Distribute and/or modify at will.
# you may want to set
# -delay=N how long to greylist, seconds (default: 300)
# -max-age=N delete old entries after N days (default: 30)
# see also the postgrey(8) manpage
POSTGREY_OPTS="-inet=127.0.0.1:60000"
# the -greylist-text commandline argument can not be easily passed through
# POSTGREY_OPTS when it contains spaces. So, insert your text here:
#POSTGREY_TEXT="Your customized rejection message here"