Postfix : Amavis couplé avec SpamAssassin et ClamAV

1.   Introduction :

Nous verrons ici comment installer Amavis pour filtrer les e-mails de Postfix. Pour
information, Amavis n’est pas un anti-virus ni un anti-spam. En faite dans notre cas, il fera appel à
ClamAV pour les virus et à SpamAssassin pour définir si les e-mails sont des spams ou non. En
gros, Amavis ne sert que d’interface entre Postfix et le « couple » ClamAV / SpamAssassin.
Dans cette documentation, le système d’exploitation est Linux Ubuntu 10.04 LTS avec
Postfix en version 2.8.5, SpamAssassin 3.3.1, Amavis 2.6.4 et ClamAV 0.96.5 .

2.   Installation :

Nous partons du principe que votre serveur Postfix est configuré et distribue le courrier sans
problème.

  • Pour installer nos amis, on va faire un coup d’apt-get :

apt-get install amavisd-new clamav clamav-daemon spamassassin gzip bzip2 unzip unrar cpio rpm nomarch cabextract arj arc zoo lzop pax

Remarque : Ici, je vous fais installer divers décompacteurs pour que Amavis puisse ouvrir les
différents types d’archives.

  • Après l’installation, Amavis crée un utilisateur et un groupe « Amavis » et ClamAV crée le sien.

Pour que ce dernier puisse accéder aux pièces jointes décompressées par Amavis, il faut le rajouter
au groupe « Amavis ».

addgroup clamav amavis

3.   Configuration :

  • Configuration Générale :

➢ Pour permettre à Amavis de décompresser certains types d’archives, il vous faut éditer le
fichier « /etc/amavis/conf.d/01-debian » et dé-commenter les lignes suivantes :

#$unfreeze = [‘unfreeze’, ‘freeze -d’, ‘melt’, ‘fcat’]; #disabled (non-free, no security support)

Et commenter la ligne du dessous :

$unfreeze = undef;
#$unrar     = [‘rar’, ‘unrar’]; #disabled (non-free, no security support)

Et commenter la ligne suivante :

$unrar       = [‘unrar-free’];

#$lha = ‘lha’; #disabled (non-free, no security support)

Et commenter la ligne qui suit :

$lha = undef;

➢ Maintenant, il faut autoriser le filtrage de ClamAV et de SpamAssassin. Il faut éditer
« /etc/amavis/conf.d/15-content_filter_mode » et dé-commenter les lignes suivantes :

#@bypass_virus_checks_maps = (
# \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
#@bypass_spam_checks_maps = (
# \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Maintenant, Amavis est configuré pour utilise ClamAV et SpamAssassin mais aucun e-mail ne lui
arrive pour le moment.
➢ Il est temps que Amavis reçoit des e-mails. Pour cela, éditez le fichier /etc/postfix/main.cf et
ajoutez y cette ligne :

content_filter = smtp-amavis:[127.0.0.1]:10024

➢ Et ajoutez les lignes suivantes dans le fichier master.cf :

smtp-amavis unix - - y - 2 smtp
  -o smtp_data_done_timeout=1200
  -o disable_dns_lookups=yes
 127.0.0.1:10025 inet              n          -          y           -         -         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

Faites bien attention à conserver un espace avant chaque « -o ».

Pour bénéficier de toutes les fonctionnalités d’Amavis, il est possible de lui indiquer les domaines locaux gérant des boites e-mails sur le serveur. Je vous le recommande vivement car Amavis ne tague pas les sujets d’e-mail vers des domaines qu’il ne connaît pas!

➢ Pour cela, éditez le fichier « /etc/amavis/conf.d/05-domain_id » et modifier la ligne :

@local_domains_maps = ( [ ‘.domain1.com’, ‘.domain2.com’, ‘.domain3.com’ ] );

Exemple :

@local_domains_maps = ( [‘.infos-reseau.com’, ‘.grominet.cheztiti.com’] ) ;

Dans le cas où votre serveur gère plusieurs domaines, vous pouvez déclarer seulement  la partie que j’appelle « commune », exemple :

Admet-on que tout mes domaines se termine en « .fr » et d’autres en « .com » et que je ne souhaite pas tous les saisir, je vais donc déclarer les domaines suivants:

@local_domains_maps = ( [‘.fr’, ‘.com’] ) ;

Ce genre de paramètre n’est pas gênant vu qu’il concerne les domaines de destinations, vos domaines. C’est sans doute plus « propre » de tous les déclarer mais quand on héberge plusieurs dizaines de domaines, c’est pas pratique de tous les saisir !

Nous devons modifier le fichier « /etc/default/spamassassin » pour que notre ami SpamAssassin se
lance au démarrage du système. Donc ouvrez le fichier et mettez la valeur de « ENABLED » à 1.

ENABLED = 1

Et ajouter cette ligne pour régler le nombre de processus de SpamAssassin :

OPTIONS="--max-children 5 --helper-home-dir"

À présent, relancez Postfix, Amavis, ClamAV et SpamAssassin :

/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/spamassassin restart
/etc/init.d/postfix restart (ou postfix reload)

➢ Test :
Pour vérifier qu’Amavis a bien pris en compte ClamAV et SpamAssassin, allez voir les logs
(/var/log/mail.info) et vous devriez y trouver les lignes suivantes :

Jan 20 12:40:08 hostname amavis[13676]: ANTI-VIRUS code loaded
Jan 20 12:40:08 hostname amavis[13676]: ANTI-SPAM-SA code loaded
Jan 20 12:40:08 hostname amavis[13676]: Using internal av scanner code for (primary)
ClamAV-clamd
Jan 20 12:40:08 hostname amavis[13676]: Found secondary av scanner ClamAV-clamscan at
/usr/bin/clamscan

Nous allons tester avec la configuration par défaut d’Amavis. Notez bien que nous ne sommes pas
rentrés dans la configuration personnalisé d’Amavis, nous allons d’abord tester si ça marche bien.
➢ Pour tester ClamAV, créez un fichier .bat avec la chaîne de test « Eicar » suivante :

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Envoyez vous un e-mail avec en pièce jointe ce fichier .bat . Puis allez vérifier dans les logs, vous
devriez avoir ceci :

hostname amavis[13251]: (13251-01) Blocked INFECTED (Eicar-Test-Signature), […]

Cela signifie que ClamAV a analysé votre pièce jointe et que ça fonctionne.
➢ Nous allons faire la même chose pour SpamAssassin, envoyez-vous un e-mail avec la chaîne
de test suivante :

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Dans les logs, vous devrez obtenir ceci :

hostname amavis[6446]: (06446-02) Blocked SPAM, […]

Parfait, notre configuration de base fonctionne.

 

  • Configuration un peu plus avancée :

Nous allons désormais passer à la configuration plus poussée d’Amavis. Dans le cas actuel,
les spams sont tout simplement bloqué mais il peut arriver qu’un e-mail passe pour un spam alors
qu’il ne l’est pas, on appelle ça un faux-positif. Alors pour éviter de perdre des e-mails importants,
nous les laisserons passés avec des tags « X-Spam ». En ce qui concerne les e-mails infectés par des
virus, par défaut ils vont stockés sur le serveur. Chez nous, personne ne les réclame donc nous les
rejetterons.
Passons à l’action maintenant ! Vous l’aurez sans doute compris, les fichiers de configuration
d’Amavis se trouve dans « /etc/amavis/conf.d ». Ici nous allons parler de deux fichiers « 20-
debian_defaults » et de « 21-ubuntu_defaults ».
➢ La gestion des fichiers d’Amavis est assez particulière pour être expliqué. Amavis va en
faite lire tout les fichiers contenus dans ce répertoire par ordre alpha-numérique. Là où il
faut prêter attention, c’est quand deux paramètres se trouvent dans deux fichiers car c’est
le dernier paramètre rencontré qui sera pris en compte. Par conséquent, avant toute
modification, allez commenter toutes les lignes dans le fichier 21-ubuntu_defaults, ça
devrait donner ceci :

use strict;
#
# These are Ubuntu specific defaults for amavisd-new configuration
#
# DOMAIN KEYS IDENTIFIED MAIL (DKIM)
#$enable_dkim_verification = 1;
# Don’t be verbose about sending mail:
#@whitelist_sender_acl = qw( .$mydomain );
#$final_virus_destiny          = D_DISCARD; # (defaults to D_BOUNCE)
#$final_banned_destiny = D_DISCARD; # (defaults to D_BOUNCE)
#$final_spam_destiny            = D_DISCARD; # (defaults to D_REJECT)
#$final_bad_header_destiny = D_PASS; # (defaults to D_PASS), D_BOUNCE suggested
#$virus_admin = undef;
#$spam_admin = undef;
#———— Do not modify anything below this line ————-
1; # insure a defined return

➢ Ensuite, ouvrez le fichier « 20-debian_defaults » pour commencer la configuration d’amavis.
Nous allons nous intéresser aux variables suivantes :

Vous l’aurez constater que les variables « $final_virus_destiny », « $final_banned_destiny »,
« $final_spam_destiny » et « $final_bad_header_destiny » utilisent des paramètres tel que
« D_REJECT » et etc… Nous allons voir leur signification :

D_DISCARD    Détruit les données sauf pour les virus, ils sont mis en quarantaine
D_BOUNCE      Génère un e-mail de notification par Amavis (Ne jamais utiliser sur « $final_spam_destiny »)
D_REJECT        Rejette tout simplement l’email.
D_PASS             Laisse passer l’e-mail

Ce sont les paramètres que vous êtes susceptible de modifier en premier lieu.

➢ Ensuite on a les white-lists et les blacklists. Plus bas dans le fichier, vous devez avoir ceci :

# This are some examples for whitelists, since envelope senders can be forged
# they are not enabled by default.
{ # a hash-type lookup table (associative array)
#’nobody@cert.org’                   => -3.0,
#’cert-advisory@us-cert.gov’           => -3.0,
#’owner-alert@iss.net’               => -3.0,
#’slashdot@slashdot.org’              => -3.0,
#’securityfocus.com’                => -3.0,
#’ntbugtraq@listserv.ntbugtraq.com’         => -3.0,
#’security-alerts@linuxsecurity.com’       => -3.0,
#’mailman-announce-admin@python.org’             => -3.0,
#’amavis-user-admin@lists.sourceforge.net’=> -3.0,
#’amavis-user-bounces@lists.sourceforge.net’ => -3.0,
#’spamassassin.apache.org’             => -3.0,
#’notification-return@lists.sophos.com’ => -3.0,
#’owner-postfix-users@postfix.org’         => -3.0,
#’owner-postfix-announce@postfix.org’ => -3.0,
#’owner-sendmail-announce@lists.sendmail.org’ => -3.0,
#’sendmail-announce-request@lists.sendmail.org’ => -3.0,
#’donotreply@sendmail.org’              => -3.0,
#’ca+envelope@sendmail.org’               => -3.0,
#’noreply@freshmeat.net’               => -3.0,
#’owner-technews@postel.acm.org’             => -3.0,
#’ietf-123-owner@loki.ietf.org’         => -3.0,
#’cvs-commits-list-admin@gnome.org’            => -3.0,
#’rt-users-admin@lists.fsck.com’         => -3.0,
#’clp-request@comp.nus.edu.sg’            => -3.0,
#’surveys-errors@lists.nua.ie’         => -3.0,
#’emailnews@genomeweb.com’                    => -5.0,
#’yahoo-dev-null@yahoo-inc.com’              => -3.0,
#’returns.groups.yahoo.com’            => -3.0,
#’clusternews@linuxnetworx.com’              => -3.0,
#lc(‘lvs-users-admin@LinuxVirtualServer.org’) => -3.0,
#lc(‘owner-textbreakingnews@CNNIMAIL12.CNN.COM’) => -5.0,
# soft-blacklisting (positive score)
#’sender@example.net’                 => 3.0,
#’.example.net’                  => 1.0,
},

Par défaut, tout est désactivé (commenté). Ici on procède par domaine et le fonctionnement est
assez simple. Pour ajouter un domaine dans la white-list, créez une ligne de la forme suivante (entre
les deux crochets) :

‘infos-reseau.com’               => -3.0,

Dans Amavis, le score doit être négatif pour être considéré comme faisant partit de la white-list.
Pour la black-list, c’est l’inverse ! Exemple :

‘truc.fr’                       => 4.0,

Après avoir modifier les fichiers de configuration d’Amavis et de Postfix, il faut redémarrer ces
derniers :

/etc/init.d/amavis restart
/etc/init.d/postfix restart (ou postfix reload)

/!\ ATTENTION /!\ : Cette configuration envoie deux e-mails de DSN (Delivery Status
Notification) lors de l’envoie d’un e-mail avec une adresse incorrect. L’un des e-mails vient
d’Amavis et l’autre de Postfix.

  • Configuration de Freshclam de ClamAV :

Ici, nous allons voir comment utiliser freshclam de ClamAV. Avant d’aller plus loin, qu’est ce
que freshclam ? Pour la petite histoire, c’est bien beau d’installer ClamAV mais si on ne met pas à
jour sa base virale, on va avoir des virus qui vont passer à travers les mailles du filet. Pas de
panique, freshclam est le programme de la situation ! Il permet justement de mettre à jour
automatiquement ou manuellement la base virale de notre ami ClamAV. Si vous installez pour la
première fois de votre vie, vous aurez sans doute remarqué dans vos recherches google qu’aucun
tutoriel ne parle de la mise à jour de cette base virale (ou très peu! Ou alors il est bien caché).
Pour la configuration de freshclam rien de bien difficile en soit pour qu’il fonctionne, vous
aurez remarqués que je n’ai pas parlé de l’installation. Tout simplement parce qu’il vient d’office
avec ClamAV lorsque vous l’installez. Bon passons à la configuration de ce dernier !
➢ Freshclam avec sa configuration par défaut est fonctionnel et il fonctionne. Nous allons juste
l’ajuster.
Ce qui nous intéresse, c’est que freshclam se lance automatique au démarrage du système
pour qu’il puisse travailler tout seul. Et par défaut, c’est déjà le cas. Vous pouvez le vérifier par la
seule présence d’un fichier « clamav-freshclam » dans le dossier /etc/init.d .
D’ailleurs pour démarrer ou arrêter freshclam, voici les commandes à saisir :

/etc/init.d/clamav-freshclam start
/etc/init.d/clamav-freshclam stop
/etc/init.d/clamav-freshclam restart

Ensuite, nous allons voir deux paramètres dans le fichier de configuration de freshclam qui nous
intéresse. Pour commencer, ouvrez le fichier /etc/clamav/freshclam.conf . Vous devez obtenir un
contenu similaire à celui-ci :

# Automatically created by the clamav-freshclam postinst
# Comments will get lost when you reconfigure the clamav-freshclam package
DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose false
LogSyslog false
LogFacility LOG_LOCAL6
LogFileMaxSize 0
LogTime true
Foreground false
Debug false
MaxAttempts 5
DatabaseDirectory /var/lib/clamav
DNSDatabaseInfo current.cvd.clamav.net
AllowSupplementaryGroups false
PidFile /var/run/clamav/freshclam.pid
ConnectTimeout 30
ReceiveTimeout 30
TestDatabases yes
ScriptedUpdates yes
CompressLocalDatabase no
Bytecode true
# Check for new database 24 times a day
Checks 24
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net

Les deux paramètres intéressant sont les suivants :
« UpdateLogFile » : il permet d’indiquer où freshclam doit dire ce qu’il se passe. Vous êtes
libre de le changer de répertoire. Après la modification, pensez à redémarrer freshclam.
Le second paramètre intéressant, c’est le « Checks 24 ». Ce paramètre indique à freshclam
de vérifier 24 fois par jour s’il y a une nouvelle version de la base virale. Donc vous pouvez
l’ajuster selon vos besoins.
Après toute modification de ce fichier, n’oubliez pas de redémarrer freshclam.

 

  • Conclusion :

Nous venons de mettre en place une solution de filtrage gratuit, libre et efficace sur un
serveur mail Postfix !

14 comments

  1. Pingback: Filtrer virus et spam sur son serveur mail avec amavis et spamassassin

  2. fred - Répondre

    bonjour,

    j’ai suivi vos tutos et effectué les testes

    coté anti virus pas de soucis

    par contre coté spam aucun changement

    les mails passent tout de meme

    si quelq’un avais une idée?

    • Antoine B - Répondre

      Bonjour,

      Que disent les logs. Le fichier de conf est il pris en charge au lancement de la machine.
      une petit copier coller des logs serait un plus

  3. arnoux - Répondre

    Bonjour super tuto,
    il y a la partie ‘127.0.0.1:10025’ que je n comprends pas bien et qui me pose problème dans ma conf

    smtp-amavis unix – – y – 2 smtp
    -o smtp_data_done_timeout=1200
    -o disable_dns_lookups=yes
    127.0.0.1:10025 inet n – y – – 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

    voici les logs: (mail.err)

    postfix/smtp[22471]: fatal: unexpected command-line argument: 127.0.0.1:10025

    j’ai aussi ce message d’erreur dans syslog :

    linkad-demo amavis[21895]: starting. /usr/sbin/amavisd-new at linkad-demo.com amavisd-new-2.7.1 (20120429), Unicode aware, LANG= »fr_FR.UTF-8″
    Nov 6 11:30:39 linkad-demo amavis[21903]: Net::Server: Group Not Defined. Defaulting to EGID ‘139 139’
    Nov 6 11:30:39 linkad-demo amavis[21903]: Net::Server: User Not Defined. Defaulting to EUID ‘129’

    un petit coup de main serait super sympa 🙂

  4. Eagle - Répondre

    Salut,
    Super tuto, par contre j’ai eu des soucis de permission malgré l’ajout de clamav à Amavis.
    la solution :

    Dans clamd.conf AllowSupplementaryGroups est par defaut sur false

    La mettre sur true

    AllowSupplementaryGroups true

  5. J.V.F - Répondre

    Bonjour,

    Tuto bien fait, il peut même être suivi pas à pas.
    C’est du bon travail.

    Félicitation.

    Parfois il est compliqué de trouver de la documentation francophone, a fortiori de ce niveau.

    Bien cordialement.

  6. Mathias - Répondre

    Bonjour ,

    je tombe sur ton article qui m’intéresse enormement ! Super article !

    Par contre je rencontre une difficulté , j’ai l’impression que la config faite via l’interface d’ISP config est prioritare sur le fichier  » 20-debian_defaults « .

    Dans ce dernier jai mis le Tag [SPAM] , et dans l’interface d’ISP c’est *** SPAM ISP . Et bien c’est toujours ce dernier qui sort !

    ISP utilise un « autre » spam assassin ? ou un fichier config vient ecraser l’autre par la suite ?

    Dailleurs quand dans l’interface je désactive spamassassin , plus aucun mail n’arrive . Ce qui parait normal car lelien n’est plus fait .

    Bref si tu as un avis , je suis preneur 🙂

    Merci

    • bosco - Répondre

      Bonsoir,

      pourquoi tu ne le modifies pas dans ISP directement ?

      Sinon, un rgrep « SPAM » * dans /etc/amavis/conf.d et dans le dossier de ISP.

    • GOUDARD - Répondre

      Bonjour
      Merci beaucoup pour ce tuto qui m’a permis de re-ajuster qq details ou l’anglais m’avait joue qq tours.

      Pour autant, j’ai un serveur avec un fonctionnement un peu .. bizarre
      voila un extrait du 20-debian_defaults

      $sa_tag_level_deflt = 1.0;
      $sa_tag2_level_deflt = 4.2;
      $sa_kill_level_deflt = 7.0;
      $sa_quarantine_cutoff_level = 25;
      $sa_dsn_cutoff_level = 25;

      Quand le spam arrive avec un score a 1000, il est détruit
      si je désactive le paramètre $sa_quarantine_cutoff_level = 25, il va ds la quarantaine et a bien toutes les entêtes X-SPAM ….
      par contre si j’envoie un message avec un hit à 2 ou à 3 il ne se passe rien … quelle peut être l’explication ?

      Si je laisse activé l’info de spam par mail je vois « Content analysis details: (13.3 points, 5.0 required) »

      je ne comprends pas ou il prend ce paramètre, je n’ai fait aucune autre config de spamassassin (en tout cas, rien dans le local.cf)

      Si avis, je suis interessee
      (Ubuntu 16, spamassassin 3.4.1)

Leave Comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *