Filtrer virus et spam sur son serveur mail avec amavis et spamassassin

Configurer son serveur mail sous Ubuntu serveur 12.04 pour que les emails soient vérifiés pour la recherche de virus et de spam.

Ce tutoriel est la suite des posts :

Il présente comment utiliser amavis, un logiciel de filtrage de contenu des e-mails,  clamav, un logiciel de détection des virus, et spamassassin, un logiciel de détection des spams. Ce tutoriel est largement inspiré de l’excellent tutoriel de Christoph Hass que vous pouvez consulter ici pour des détails techniques plus poussés, ainsi que de ce lien pour la configuration de spamassassin.

Installer les packages suivants :

sudo apt-get install amavisd-new spamassassin clamav-daemon lha arj unrar-free zoo
nomarch cpio lzop cabextract p7zip rpm

La configuration de amavis est effectuée en éditant les fichiers du répertoire /etc/amavis/conf.d/. En particulier, commencez par éditer le fichier 50-user et à ajouter ou modifier les lignes suivantes :

$sa_spam_subject_tag="[MY-SPAM] ";
$sa_tag_level_deflt=3.0;
$sa_tag2_level_deflt=3.0;
$final_spam_destiny=D_PASS;
$spam_quarantine_to=undef;

La première ligne sert à définir le tag qui sera ajouté aux e-mails lorsque ceux-ci seront détectés comme SPAM : il suffira alors de créer une règle spécifique avec sieve pour les rediriger vers un répertoire adéquat. La deuxième et la troisième lignes servent à définir le niveau (score spamassassin) à partir duquel amavis taguera les e-mail comme étant des spams, soit uniquement dans l’en-tête, soit dans le sujet. La quatrième ligne indique que les messages détectés comme spam sont quand même envoyé à leurs destinataires mais avec un tag supplémentaire ajouté (d’autres politiques peuvent être choisies, qui ne délivrent pas l’e-mail aux destinataires). Enfin, la dernière ligne sert à définir le répertoire vers lequel les messages marqués SPAM doivent être dirigés ; la valeur “undef” laisse le destinataire configurer seul ses règles de gestion des e-mails et n’envoie les spams vers aucun répertoire particulier.

On redémarre et on vérifie ensuite le fonctionnement de amavis avec :

/etc/init.d/amavis restart
netstat -nap | grep 10024

qui doit répondre :

tcp        0      0 127.0.0.1:10024         0.0.0.0:*               LISTEN
28222/amavisd

Communication entre amavis et postfix

L’étape suivante consiste à faire communiquer amavis et postfix ; on commence par définir amavis comme filtre de contenu

postconf -e content_filter=smtp-amavis:[127.0.0.1]:10024
postconf -e receive_override_options=no_address_mappings

Ces options seront ajoutées au fichier /etc/postfix/main.cf ; la deuxième ligne sert à indiquer que le logiciel de gestion de contenu doit voir les adresses originales de l’e-mail et pas les résultats résultats des redirections, de la gestion des hôtes virtuels, etc. Il faut ensuite éditer le fichier /etc/postfix/master.cf pour y ajouter :

smtp-amavis unix -      -       n     -       2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20
127.0.0.1:10025 inet n  -       -     -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
    -o local_header_rewrite_clients=

puis redémarrer postfix :

sudo service postfix reload

FIX IT! Comment configurer amavis pour qu’il ne scanne pas le contenu des messages sortants ?

Communication entre amavis et clamav

Pour permettre à amavis d’utiliser clamav pour filtrer les virus, il faut ajouter amavis au groupe des utilisateurs clamav :

adduser clamav amavis
/etc/init.d/clamav-daemon restart

Configurer Spamassassin

amavis utilise spamassassin via l’appel direct du module perl de spamassassin. Si vous disposez déjà d’une base d’apprentissage d’e-mails personnels spam et non spam (de plusieurs milliers d’e-mails de préférence), il est recommandé d’utiliser cette base pour entraîner spamassassin. Pour lancer spamassassin, éditez le fichier etc/default/spamassassin pour y modifier la ligne suivante :

ENABLED = 1

Mes e-mails sont contenus dans le répertoire Maildir de mon dossier IMAP : les spams dans un répertoire .Junk et les autres dans des répertoires .INBOX.XXX ; l’apprentissage de spamassassin se fait alors avec :

sa-learn --spam /home/mail/domain-name.org/tuxette/Maildir/.Junk
sa-learn --ham /home/mail/domain-name.org/tuxette/Maildir/.INBOX.*

Pour finir…

Relancer tout :

/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/spamassassin restart
/etc/init.d/postfix restart

La configuration est bien prise en compte si le fichier /etc/log/mail.log contient les informations suivantes :

Aug  5 07:59:01 hostname amavis[27182]: ANTI-VIRUS code      loaded
Aug  5 07:59:01 hostname amavis[27182]: ANTI-SPAM code       loaded
Aug  5 07:59:01 hostname amavis[27182]: ANTI-SPAM-SA code    loaded

La configuration peut être testée par l’envoi d’un fichier exemple fourni par spamassassin :

sendmail tuxette@domain-name.org < /usr/share/doc/spamassassin/examples/sample-spam.txt

L’e-mail reçu est tagué par [MY-SPAM] dans l’objet et contient des informations de ce type dans les en-têtes :

X-Virus-Scanned: Debian amavisd-new at domain-name.org
X-Spam-Flag: YES
X-Spam-Score: 7.019
X-Spam-Level: *******
X-Spam-Status: Yes, score=7.019 required=6.31 tests=[DKIM_SIGNED=0.1,
	DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_IMAGE_RATIO_04=0.61,
	HTML_MESSAGE=0.001, MIME_HTML_ONLY=1.105, SPF_PASS=-0.001,
	TVD_RCVD_SPACE_BRACKET=0.001, T_SURBL_MULTI1=0.01,
	T_URIBL_BLACK_OVERLAP=0.01, UNPARSEABLE_RELAY=0.001,
	URIBL_BLACK=1.775, URIBL_JP_SURBL=1.948, URIBL_WS_SURBL=1.659]
	autolearn=no