Mail – Configuration de SpamAssassin et ClamAV

Introduction

Ce document va expliquer l’intégration de Amavisd avec ClamAV et SpamAssassin dans Postfix. Cela marche aussi bien sur un serveur de boite qu’un serveur qui sert de relais.

Postfix étant notre daemon mail avec ClamAV qui est l’anti-virus, SpamAssassin l’anti-spam et enfin Amavisd qui fait l’interconnexion entre tout ce petit monde.

Cela s’applique aussi bien à une distribution Linux, testé sur Debian Sarge & Etch, que sur FreeBSD, testé en 6.2.

Dans ce document, les extraits de fichiers de configuration seront ceux de Debian.

 

Prérequis

Une fois n’est pas coutume, il n’y a pas de prérequis pour ce document. Cette partie est strictement indépendante des autres !

 

Configuration de Postfix

Du côté de Postfix’, il n’y que peu de choses à faire, nous allons lui indiquer comment parler à notre système d’analyse de contenu et aussi comment Amavisd lui répond.

Pour cela, on édite le fichier main.cf et on ajoute la ligne suivante:

content_filter = amavis:[127.0.0.1]:10024

Postfix sait où envoyer les mails à tester.

Puis éditer le fichier master.cf pour ajouter les lignes suivantes:

amavis unix - - n - 2 smtp
        -o smtp_data_done_timeout=1200
        -o disable_dns_lookups=yes

127.0.0.1:10025 inet n - n - - smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_client_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks=127.0.0.0/8
        -o strict_rfc821_envelopes=yes

Amavisd sait comment répondre à Postfix

 

Configuration de ClamAV

Il y a deux daemons pour ClamAV:

  • clamav-daemon qui analyse les mails
  • clamav-freshclam qui vérifie sur différents sites web si il y a des nouvelles bases de données de virus et éventuellement il notifie clamav-daemon des mises à jour

 

Configuration de clamav-freshclan

Le fichier de configuration s’appelle freshclam.conf.

Voici un exemple de configuration:

# L'utilisateur qui possède la base
DatabaseOwner clamav
# Le fichier de log des updates
UpdateLogFile /var/log/clamav/freshclam.log
# La taille maximum de ce fichier
LogFileMaxSize 0
# Le nombre d'essai maximum avant de considérer que la mise à jour a échouée
MaxAttempts 5
# On vérifie les mises à jour 24 fois par jour
# Toutes les heures donc !
Checks 24
# Les différents serveurs où l'on peut aller chercher les mises à jour
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net
DatabaseMirror db.fr.clamav.net
# Le répertoire où se trouve la base de données
DatabaseDirectory /var/lib/clamav/
# On notifie le daemon clamd pour qu'il charge la nouvelle base en cas de mise à jour
NotifyClamd
# Active la vérification de la version de la base de données grâce à un enregistrement DNS TXT 
DNSDatabaseInfo current.cvd.clamav.net

 

Configuration de clamav-daemon

Le fichier de configuration s’appelle clamd.conf.

Voici un exemple de configuration:

# Le socket local d'écoute du daemon
LocalSocket /var/run/clamav/clamd.ctl
# On efface un socket qui serait resté après un redémarrage sale du daemon
FixStaleSocket
# L'utilisateur qui exécute le daemon
User clamav
# Autorise d'autres groupes à accéder au daemon
# L'utilité de ce paramètre n'est pas très clair !
AllowSupplementaryGroups
# On active l'analyse des mails
ScanMail
# On scanne les archives dans les mails
ScanArchive
# On descend autant de niveau d'archive qu'il y en a
ArchiveMaxRecursion 0
# On ne limite pas la taille des fichiers à scanner dans les archives
ArchiveMaxFiles 0
# On ne scanne pas les archives de plus de 20M
# De toutes facons, on aura interdit avec Postfix les mails aussi gros
ArchiveMaxFileSize 20M
# On ne limite pas le scan sur le % de compression des archives
ArchiveMaxCompressionRatio 0
# On interdit les archives encryptées
ArchiveBlockEncrypted
# On scanne aussi les archives de type rar
ScanRAR
# Timeout à 3 minutes pour la réception des mails à scanner
ReadTimeout 180
# Le nombre maximum de threads
MaxThreads 12
# Le nombre maximum de mail dans la queue
# En attente d'analyse ou d'un thread ?
MaxConnectionQueueLength 15
# Le fichier de log
LogFile /var/log/clamav/clamav.log
# On log l'heure pour tous les messages
LogTime
# Pas de taille maximum pour le fichier de log
LogFileMaxSize 0
# Le fichier pid du daemon
PidFile /var/run/clamav/clamd.pid
# Le répertoire qui contient la base de données des virus
DatabaseDirectory /var/lib/clamav
# Le daemon vérifie toutes les heures qu'il est vivant
SelfCheck 3600
# On recherche les macros dans les documents Office
ScanOLE2
# On scanne les éxécutables windows
ScanPE
# On cherche à détecter les éxécutables cassés
DetectBrokenExecutables
# On analyse et on normalise le HTML
ScanHTML
# On block les archives quand on dépasse certains seuils avec celle-ci
ArchiveBlockMax

 

Configuration de SpamAssassin

Au niveau de SpamAssassin, je n’ai pas fait de modification. Les réglages les plus importants se font dans Amavisd. SpamAssassin est appelé avec ses options par défaut et ensuite, c’est Amavisd qui en fonction de ses seuils fait les choix sur ce qui va arriver au mail.

 

Configuration de Amavisd

C’est Amavisd qui va nous permettre de définir les domaines, les seuils, etc pour l’analyse de nos mails.

Voici des extraits intéressants du fichier de configuration de Amavisd. Sur Debian, ils ont coupé le fichier en plusieurs morceaux qui sont dans un répertoire conf.d:

[...]
# Fichier 05-domain_id
#
# Le domain pour lequel on traite les mails
chomp($mydomain = `head -n 1 /etc/mailname`); 
@local_domains_acl = ( ".$mydomain", 'lohez.eu', 'libre-ajamais.net' ); 
# Sur FreeBSD, le domain est spécifié en direct:
# $mydomain = 'centile.com';
[...]
# Fichier 15-av_scanners
#
# On laisse uniquement cela décommenté dans la section sur les antivirus
# Seul ClamAV est utilisé
 ['ClamAV-clamd',
   &ask_daemon, ["CONTSCAN {}n", "/var/run/clamav/clamd.ctl"],
   qr/bOK$/, qr/bFOUND$/,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
[...]
# Fichier 20-debian_defaults
#
# Le répertoire où les mails sont mis en quarantaine  
$QUARANTINEDIR = "$MYHOME/virusmails";
# Le tag que l'on insert dans le sujet pour les mails à petit score
$sa_spam_subject_tag = '***SPAM*** ';
[...]
# On choisit les actions en fonction de ce qu'on détecte dans les mails
# On jete les mails avec des virus
$final_virus_destiny      = D_DISCARD;
# Amavis génère un message de rejet
$final_banned_destiny     = D_BOUNCE;
# Amavis génère un message de rejet
$final_spam_destiny       = D_BOUNCE;
# Ces mails passent
$final_bad_header_destiny = D_PASS;

# Les notifications en cas de virus sont envoyées à cette addresse
$virus_admin = "silencer@$mydomain";

 

Application des modifications

Il ne nous reste plus qu’à redémarrer nos services.

On commence par ClamAV:

/etc/init.d/clamav-freshclam

pour lancer la récuperation automatique des mises à jour, puis:

/etc/init.d/clamav-daemon

pour lancer le daemon qui scanne les mails

Ensuite on démarre Amavisd qui peut maintenant parler à ClamAV:

/etc/init.d/amavisd restart

Puis on termine par Postfix qui peut maintenant parler à Amavisd:

/etc/init.d/postfix restart

Il n’y a pas de daemon pour SpamAssassin car il est lancé de façon interactive par Amavisd.

 

Tester l’analyse de contenu

Pour tester l’analyse de virus, on peut utiliser le fichier eicar qui se trouve sur différents sites web. Il existe dans différents formats y compris des archives avec pas mal de niveau à l’intérieur.

Pour l’analyse des spams, SpamAssassin est fournit avec des fichiers d’exemple qui produisent différents scores pour être:

  • en dessous du premier niveau de marquage, on doit juste voir dans les headers que l’on a anaylsé le mail
  • au dessus du premier niveau donc le sujet du mail doit être marqué avec ***SPAM***
  • enfin un score suffisant pour que le mail soit placé directement en quarantaine.

 

Apprentissage de ‘SpamAssassin

Le plus simple pour apprendre à SpamAssassin est d’utiliser la commande sa-learn. Pour cela, sauvegardez un mail de spam non détecté dans un fichier texte puis lancez la commande suivante:

su amavis -c sa-learn --spam mon_mail_de_spam.txt

Sinon, un autre façon assez propre, si vous travaillez avec un serveur IMAP, est de placer les mails non détectés dans le répertoire junk de la inbox. Puis côté serveur, mettre une commande en crontab qui va analyser le contenu de ce sous-répertoire de la inbox avec une ligne de la forme:

26 5    * * *   amavis    /usr/bin/sa-learn --spam /path_to_maildir/Maildir/.Junk/cur/*

Si vous avez un faux positif, on utilise la commande sa-learn –ham.

 

Mot de la fin

Vous avez maintenant une analyse de contenu sur votre serveur de mail. Mais il y a encore un grand nombre de modules Perl pour SpamAssassin.

Le principal avec SpamAssassin est qu’il faut lui apprendre ce qui est du spam et ce qui ne l’est pas. Enfin surtout ce qui est du spam !

Si vous avez peur des faux positifs, dans un premier temps, vous pouvez aller regarder les mails qui ont été mis en quarantaine.

 

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s