Gentoo Logo

Guide de configuration d'une passerelle de filtrage de courrier électronique sous Gentoo

Table des matières :

1.  Introduction

Nous allons décrire dans ce guide les étapes d'installation d'une passerelle de filtrage de spam (N.D.T : courrier indésirable) et de virus. Vous pourrez l'adapter facilement pour mettre en place une solution mettant en œuvre un serveur seul.

Présentation des acteurs

Ce document indique comment mettre en place une passerelle de filtrage du courrier électronique multi-domaines. Ce serveur devra se situer en amont des serveurs de courrier électronique qui disposent des comptes de messagerie, comme par exemple Microsoft Exchange ou Lotus Notes.

Nous avons choisi pour notre configuration des applications ayant des fichiers de configuration lisibles et une bonne réputation au niveau de la sécurité. L'agent de transport de courrier (MTA) choisi est postfix, parce qu'il répond de manière convenable aux deux critères présentés. Postfix écoutera par défaut le port 25 pour le courrier entrant. Après réception, il transmettra le courrier à Amavisd-new sur le port 10024. Amavisd-new filtrera le courrier avec plusieurs méthodes, avant de le rendre à postfix sur le port 10025. Enfin, Postfix se chargera de transmettre le courrier au prochain serveur de courrier électronique.

Amavisd-new est une plate-forme de filtrage de contenu qui, avec l'aide d'autres applications, permet de filtrer le courrier contre les virus et le spam. Dans notre configuration, nous utiliserons deux applications. ClamAV s'occupera de filtrer les virus et Spamassassin le spam. Spamassassin peut à son tour fonctionner comme une plate-forme de filtrage de contenu et utilisera les applications DCC et Razor2 de Vipul.

Contrairement à d'autres technologies contre le spam, comme par exemple les RBL, Spamassassin n'accepte ou ne rejette pas un courrier à partir d'un seul et unique test, mais il utilise de nombreux tests internes et des applications externes pour calculer un score de spam pour chaque courrier analysé. Ce score est basé sur les tests suivants :

  • Filtrage bayésien ;
  • Règles statiques basées sur des expressions rationnelles ;
  • Réseaux distribués collaboratifs :
    • RBL,
    • Razor2,
    • Pyzor,
    • DCC.

La première partie de ce guide (du chapitre 1 au 4) décrit la mise en place d'une passerelle de filtrage de courrier électronique de base. Les chapitres suivants peuvent être suivis individuellement, il n'y a aucune dépendance entre les différents chapitres. Ils indiquent comment :

  • Mettre en place des répertoires IMAP spéciaux pour l'apprentissage bayésien et pour soumettre les faux positifs et négatifs.
  • Mettre en place un service de liste grise à l'aide de Postfix.
  • Configurer Amavisd-new pour conserver les préférences des utilisateurs dans une base MySQL.
  • Configurer Spamassassin pour utiliser MySQL pour AWL et les données bayésiennes.

Note : Les répertoires IMAP utiliseront le format maildir. Ne placer qu'un seul courrier par fichier permet de les manier plus facilement. Si vous utilisez le format mbox, je vous suggère de tester tout de même le format maildir. Si vous ne l'utilisez pas déjà, il faudra que vous installiez les outils nécessaires avec la commande emerge courier-imap.

Une cinquième partie est prévue, qui contiendra divers trucs et astuces concernant les performances et quelques points utiles (comme l'utilisation d'environnements chrootés, l'application de restrictions sur postfix, etc.).

Note : Déléguer un certain nombre de tâches à une tierce partie n'est pas sans risque. Vous devez connaître et avoir confiance en celle-ci. Dans notre configuration, la seule décision qui sera laissée à un tiers unique est la mise en quarantaine des courriers électroniques contenant des virus. En utilisant le système de scores de Spamassassin, la décision d'arrêter un courrier indésirable n'est pas basée sur une seule autorité, sauf peut-être les règles statiques propres à Spamassassin.

Attention : Lorsque vous rejetez du spam au niveau du MTA, vous devez faire attention lors de la sélection de la RBL que vous souhaitez utiliser. Par exemple, SpamCop est une mauvaise liste RBL pour un MTA comme le nôtre, car il en résultera de nombreux faux positifs. En effet, la liste est parfois tout simplement trop agressive. Voici une explication sur pourquoi les listes RBL sont mauvaises et que penser des RBL pour le spam.

Préparation

Avant de commencer, vous devez disposer d'une installation fonctionnelle de Postfix qui vous permet déjà d'envoyer et de recevoir du courrier électronique. Si vous n'avez aucune expérience de la configuration de postfix, les choses risquent de se compliquer très rapidement dans le cas où vous vouliez tout configurer rapidement. Si vous avez besoin d'aide, vous pouvez en trouver dans l'excellent guide « Mise en place d'un système de messagerie multidomaine avec Postfix » de la documentation Gentoo.

2.  Installer les programmes nécessaires

Commençons par installer les programmes les plus importants : Amavisd-new, Spamassassin et ClamAV.

Exemple de code 2.1 : Installer Amavis, Spamassassin et Clamav

# emerge amavisd-new spamassassin clamav

Note : Comme indiqué précédemment, vous devez déjà disposer d'un serveur postfix en état de marche sur votre machine. En gros, cela n'est pas bien plus compliqué que emerge postfix et une connaissance générale du fonctionnement global de Postfix.

Mise en place des noms de domaine

Note : Si vous ne souhaitez pas mettre en place de serveur passerelle, c'est-à-dire que vous voulez un unique serveur central avec l'ensemble des dispositifs sur la même machine, vous n'avez qu'à créer un enregistrement DNS MX.

Pendant l'installation des programmes, ouvrez un nouveau terminal et créez les champs MX nécessaires comme indiqué ci-dessous.

Commençons par créer un champ MX pour la passerelle de courrier et un champ A pour la prochaine destination.

Exemple de code 2.2 : Mise en place des DNS

(Créez un champ MX pour le serveur passerelle :)
                   MX      10      passerellemail.mondomaine.tld.
(Créez le champ A qui va avec :)
passerellemail     A       ip.de.la.passerelle
(Créez un champ A pour le prochain serveur de courrier contacté :)
mail               A       ip.du.prochain.serveurMail

Note : Certains fournisseurs d'accès de type ADSL bloquent le port 25 et vous obligent à relayer le courrier via l'un de leurs serveurs. Vous devez alors créer un champ MX secondaire comme MX 20 sauvegarde-mx.un-FAI.tld.

Ouvrir les flux sur votre pare-feu

En plus d'accepter le trafic usuel de courrier, certaines applications nécessitent une autorisation d'accès au réseau que vous devez mettre en place au niveau de votre pare-feu pour qu'elles puissent communiquer avec les serveurs.

Application Protocole Port
DCC UDP 6277
Razor (ping sortant) TCP 7
Razor TCP 2703

Razor utilise les pings pour trouver quels serveurs sont les plus proches.

Configurer Postfix

Nous allons tout d'abord indiquer à postfix d'écouter sur le port 10025, ensuite nous supprimerons la plupart des restrictions, dans la mesure où elles ont déjà été appliquées par l'instance de postfix qui tourne sur le port 25. Enfin, nous nous assurerons que le port 10025 ne sera ouvert que sur l'interface locale. Pour appliquer tout cela, vous devez ajouter les lignes suivantes à la fin de votre fichier /etc/postfix/master.cf :

Exemple de code 2.3 : Modifier le fichier master.cf

smtp-amavis     unix -        -       n     -       2  smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
# Si vous utilisez lmtp :
#lmtp-amavis unix -     -       n       -       2       lmtp
#   -o lmtp_data_done_timeout=1200
#   -o lmtp_send_xforward_command=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
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000

# Si vous voulez utiliser un filtrage par proxy :
#smtp            inet n         -       n      -       8 smtpd
# -o smtpd_proxy_filter=127.0.0.1:10024
# -o smtpd_client_connection_count_limit=4
# Si vous ne voulez pas faire de vérification sur le mail sortant :
#10.0.0.2:smtp   inet n         -       n       -      - smtpd
#-o content_filter=

Note : La première ligne avec smtp-amavis indique qu'au maximum deux processus pourront être exécutés en même temps. Vous pouvez modifier cette valeur pour l'adapter à vos besoins. Faites seulement bien attention de reporter cette modification dans la variable $max_servers du fichier amavisd.conf. Soyez conscient qu'amavisd-new est vraiment consommateur de mémoire et que trop augmenter le nombre d'instances d'amavisd-new peut facilement saturer la mémoire et donc provoquer un usage intensif de la mémoire virtuelle, ce qui réduira considérablement les performances.

Note : Si vous voulez rejeter le spam le plus rapidement possible, vous pouvez utiliser la méthode « Before-Queue » (proxy) à la place de la méthode « filter ». Si vous décommentez les trois lignes correspondantes, vous devrez mettre content_filter= dans votre fichier main.cf. Cela n'est pas recommandé pour les serveurs à fort trafic, car le nombre de connexions concurrentes est limité au nombre d'instances d'amavisd.

Attention : La méthode « Before-Queue » (proxy) n'a pas été convenablement testée.

Note : Si vous souhaitez pour une raison ou pour une autre envoyer un courrier depuis cette machine et que vous ne souhaitez pas qu'il soit vérifié, ajoutez une autre instance de postfix en enlevant les commentaires des deux dernières lignes et modifiez la direction IP pour utiliser la vôtre.

Le fichier master.cf indique au programme principal de postfix comment exécuter chacun des processus de postfix. Pour plus d'information, vous pouvez faire un man 8 master.

Ensuite, vous devez indiquer à l'instance principale de postfix, qui tourne sur le port 25, qu'elle doit filtrer le courrier en utilisant amavisd-new qui, lui, tourne sur le port 10024.

De plus, vous devez indiquer le nom du serveur de courrier destinataire. Indiquez à Postfix de filtrer tout le courrier grâce à un filtre de contenu externe, puis mettez en place un routage explicite pour lui permettre de savoir à qui renvoyer le courrier.

Exemple de code 2.4 : Modifier /etc/postfix/main.cf

biff = no
empty_address_recipient = MAILER-DAEMON
queue_minfree = 120000000

content_filter = smtp-amavis:[127.0.0.1]:10024
# Si vous utilisez lmtp :
#content_filter = lmtp-amavis:[127.0.0.1]:10024

# TRANSPORT MAP
#
# Insert text from sample-transport.cf if you need explicit routing.
transport_maps = hash:/etc/postfix/transport

relay_domains = $transport_maps

Postfix dispose d'un grand nombre d'options que vous pouvez configurer dans main.cf. Pour plus d'explications sur ce fichier, veuillez vous référer à la page de manuel man 5 postconf ou à la page web sur les paramètres de configuration de Postfix.

Le format de ce fichier transport est le même que celui des fichiers de hachage de Postfix. Les messages en destination du domaine inscrit sur la gauche seront envoyés au serveur inscrit sur la droite.

Exemple de code 2.5 : /etc/postfix/transport

mondomaine.tld                          smtp:mail.mondomaine.tld

Après avoir édité ce fichier, vous devez lancer la commande postmap. Postfix ne lit en fait pas directement ce fichier, il faut donc que vous le convertissiez dans un format convenable, en faisant postmap /etc/postfix/transport. Cela crée le fichier /etc/postfix/transport.db. Il n'y a pas besoin de recharger postfix dans la mesure où il prendra automatiquement en charge les modifications.

Note : Si le prochain serveur de courrier contacté n'écoute pas le port 25, standard pour le protocole SMTP, vous pouvez préciser le numéro du port, par exemple smtp:mail.mondomaine.tld:25000.

Si vos premières tentatives d'envoi de courrier donnent lieu à des retours de messages, vous avez probablement fait une erreur de configuration quelque part. Vous pouvez essayer d'activer provisoirement soft_bounce, le temps de régler vos problèmes de configuration. Cela empêche postfix d'envoyer des retours concernant les messages non délivrés en les traitant en tant qu'erreurs temporaires. Les messages sont conservés dans la file d'attente jusqu'à ce que soft_bounce soit désactivé ou retiré.

Exemple de code 2.6 : Activation de soft_bounce

# postconf -e "soft_bounce = yes"
# /etc/init.d/postfix reload

Une fois que vous avez trouvé une configuration fonctionnelle, assurez-vous de désactiver ou de retirer soft_bounce et relancez postfix.

Configurer Amavisd-new

Amavisd-new est utilisé pour gérer tout ce qui concerne le filtrage du courrier et vous permet de rassembler facilement différentes technologies. À la réception d'un courrier électronique, il extrait le contenu, le passe à travers certains filtres personnalisés, utilise des listes noires et blanches, filtre le courrier grâce à différents anti-virus et, finalement, le passe au crible de SpamAssassin.

Amavisd-new en lui-même propose un certain nombre de fonctionnalités supplémentaires :

  • Il identifie les pièces jointes dangereuses et dispose de règles pour les gérer.
  • Pour chaque utilisateur, chaque domaine et pour l'ensemble du système, il dispose de règles pour :
    • les listes blanches (whitelists) ;
    • les listes noires (blacklists) ;
    • la gestion de score de spam ;
    • la gestion de règles contre les virus et le spam.

Mis à part postfix et freshclam, l'ensemble des applications sera lancé par l'utilisateur amavis.

Éditez les lignes suivantes dans le fichier /etc/amavisd.conf :

Exemple de code 2.7 : Éditer /etc/amavisd.conf

(Insérer les domaines à vérifier :)
$mydomain = 'exemple.com';
(Écouter uniquement sur l'interface locale :)
$inet_socket_bind = '127.0.0.1';
(Renvoyer le courrier à Postfix sur le port 10025 :)
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;
(Définir le compte auquel envoyer les alertes en cas de courrier vérolé :)
$virus_admin = "alertevirus\@$mondomaine";
(Toujours ajouter les en-têtes de spam :)
$sa_tag_level_deflt  = -100;
(Ajouter l'en-tête X-Spam-Status: Yes pour le spam détecté :)
$sa_tag2_level_deflt = 5;
(Lancer une action d'échappement à ce niveau de spam :)
$sa_kill_level_deflt = $sa_tag2_level_deflt;
(Ne pas envoyer de notification de statut à l'envoyeur. Cela n'affecte
pas la réception du spam par le destinataire. Pour faire cela, utiliser le
kill_level.)
$sa_dsn_cutoff_level = 10;
(Ne pas passer le message et le mettre en quarantaine à la place :)
$final_virus_destiny      = D_DISCARD;  # (par défaut : D_DISCARD)
$final_banned_destiny     = D_DISCARD;  # (par défaut : D_BOUNCE)
$final_spam_destiny       = D_DISCARD;  # (par défaut : D_BOUNCE)

Note : Grâce à la ligne $sa_tag2_level_deflt = 5;, vous indiquez un score de spam pour Spamassassin qui sera de 5. Cela peut être un peu faible. Comme vous l'aviez peut-être remarqué, la valeur par défaut pour Amavisd-new est de 6.3. Si vous ne souhaitez voir aucun spam dans votre répertoire de courrier, choisissez 5, mais si vous ne voulez pas avoir de faux positifs, gardez la valeur de 6.3.

Créer un répertoire de quarantaine pour les mails vérolés, dans la mesure où nous ne souhaitons pas les délivrer à nos utilisateurs.

Exemple de code 2.8 : Créer le répertoire de quarantaine pour les mails vérolés

# mkdir /var/amavis/virusmails
# chown amavis:amavis /var/amavis/virusmails
# chmod 750 /var/amavis/virusmails

Note : Amavisd-new propose des politiques plus fines en utilisant les banques de politiques d'action.

Configurer ClamAV

Pour la vérification des virus nous utilisons ClamAV, car il propose de bons moyens de détection comparables aux offres commerciales. De plus, il est très rapide et c'est un logiciel libre. Comme nous aimons utiliser les fichiers de journalisation, vous allez configurer clamd pour utiliser syslog et utiliser une journalisation verbeuse. Enfin, clamd ne sera pas lancé en tant que root. Éditez le fichier /etc/clamd.conf :

Exemple de code 2.9 : Éditer /etc/clamd.conf

(Journalisation verbeuse avec syslog :)
LogSyslog
LogVerbose
LogFacility LOG_MAIL
(Changer la direction du fichier pid :)
PidFile /var/run/amavis/clamd.pid
(Fichier du socket de clamav :)
LocalSocket /var/amavis/clamd
(Fermer la connexion quand cette limite est dépassée :)
StreamMaxLength 10M
(Ne pas exécuter clamd en tant que root :)
User amavis
(Vous devez décommenter ces lignes avec les dernières versions :)
ScanMail
ScanArchive

Note : De plus, n'oubliez pas d'enlever l'exemple pour que ClamAV puisse fonctionner.

ClamAV est fourni avec le démon freshclam, qui permet de mettre à jour les signatures des nouveaux virus. Au lieu de mettre à jour ces signatures deux fois par jour, nous effectuerons une mise à jour de la base des signatures de virus toutes les deux heures.

Exemple de code 2.10 : Éditer /etc/freshclam.conf

(Journalisation avec syslog :)
LogSyslog
(Journalisation verbeuse :)
LogVerbose
(Abandonner explicitement les privilèges root :)
DatabaseOwner clamav
(Vérifier les mises à jour toutes les deux heures. C'est la
recommandation officielle :)
Checks 12
(Utilisez le miroir le plus proche de vous. Remplacer XY par le code
correspondant à votre pays :)
DatabaseMirror db.XY.clamav.net

Faites lancer clamd et freshclam par les scripts d'initialisation en modifiant le fichier /etc/conf.d/clamd.

Exemple de code 2.11 : Modifier /etc/conf.d/clamd

START_CLAMD=yes
FRESHCLAM_OPTS="-d"

Pour finir, modifiez le fichier amavisd.conf pour indiquer la bonne location du socket.

Exemple de code 2.12 : Modifier /etc/amavisd.conf

(Décommentez les lignes pour la vérification avec clamav et modifiez la
location du socket :)
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/amavis/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

Attention : NE PAS modifier la variable $unix_socketname sauf si vous savez ce que vous faites.

Configurer Razor de Vipul

Razor2 est un réseau collaboratif et distribué d'identification de spam. Installez-le grâce à emerge razor et créez les fichiers de configuration nécessaires sous le compte amavis en utilisant su - amavis, puis razor-admin -create.

Exemple de code 2.13 : Créer les fichiers de configuration nécessaires

# emerge razor
(Définir temporairement un shell pour amavis.)
# usermod -s /bin/bash amavis
# su - amavis
$ razor-admin -create
$ exit
(Remettre le shell à /bin/false.)
# usermod -s /bin/false amavis

Configurer DCC (Distributed Checksum Clearinghouse)

Tout comme Razor2, DCC est un réseau collaboratif et distribué d'identification de spam. Son fonctionnement repose sur le nombre de personnes qui reçoivent un mail donné en identifiant chacun d'eux avec une somme de contrôle.

Exemple de code 2.14 : Installer DCC

# emerge dcc

Configurer Spamassassin

Amavis utilise directement les bibliothèques Perl de Spamassasin, il n'y a donc pas besoin de lancer le service de spamassassin. Cela génère quelques confusions dans la configuration, vu que Spamassassin utilise le fichier de configuration /etc/mail/spamassassin/local.cf, mais le fichier /etc/amavisd.conf a priorité et remplace certaines de ces configurations.

Exemple de code 2.15 : Créer le fichier /etc/mail/spamassassin/local.cf

# Activer le système bayésien 
use_bayes               1

# Activer toutes les vérifications de réseaux
skip_rbl_checks         0

# Le courrier utilisant une langue de l'un de ces pays ne sera pas
# marqué comme étant du spam dans une langue étrangère.
# - français, anglais
ok_languages            fr en

# Le courrier utilisant une localisation parmi celles-ci ne sera pas
# marqué comme pouvant être du spam dans une langue étrangère.
ok_locales              en

# Utiliser un répertoire personnalisé pour le bayésien.
bayes_path              /var/amavis/.spamassassin/bayes

Note : Depuis la version 3.1 de Spamassassin, vous pouvez activer DCC et Razor2 en décommentant les lignes correspondantes dans le fichier v310.pre.

Note : Vous pouvez chercher de l'inspiration pour votre fichier local.cf en utilisant le générateur de configuration de Spamassassin.

Note : Vous pouvez évidemment adapter vos variables ok_languages et ok_locales à vos besoins.

3.  Toute règle a également ses exceptions

Lorsque les premiers courriers arriveront effectivement sur votre passerelle de courrier, vous découvrirez probablement que la configuration ci-dessus n'est pas parfaite. Par exemple, certains de vos clients souhaiteront probablement recevoir des courriers que les autres ne voudront pas. Vous pouvez facilement mettre en place des listes blanches et noires pour les expéditeurs. Décommentez la ligne suivante dans le fichier de configuration amavisd.conf.

Exemple de code 3.1 : Modifier amavisd.conf pour attribuer des notes par expéditeurs

read_hash("/var/amavis/sender_scores_sitewide"),

Dans le fichier sender_scores_sitewide, vous pouvez préciser des adresses complètes ou plus généralement des noms de domaine. Puis, vous leurs attribuez une note positive ou négative, à ajouter au score de spam.

Exemple de code 3.2 : Exemple de fichier whitelist_sender

(Mettre sur liste blanche tous les courriers provenant de cette adresse.)
postmaster@exemple.net     -3.0
(Mettre sur liste blanche tous les courriers provenant du domaine exemple.net, sauf ses sous-domaines.)
.exemple.net                1.0

Note : Voir /etc/amavisd.conf pour plus d'exemples.

Note : Mettre ces adresses en dehors de amavisd.conf permet une configuration plus propre et plus sûre.

Note : Vous pouvez également faire la même chose en passant par le fichier de configuration de Spamassassin /etc/mail/spamassassin/local.cf, mais je pense que c'est plus propre de le faire dans /etc/amavisd.conf.

Note : Dans un chapitre ultérieur, nous vous montrerons comment implémenter une politique de listes blanches et noires par utilisateur implémentée à l'aide de MySQL.

En attendant mieux, vous pouvez ajouter les lignes suivantes dans votre amavisd.conf pour passer outre les vérifications de spam pour les destinataires postmaster et abuse.

Exemple de code 3.3 : Ne pas filtrer contre le spam pour tous les courrier de postmaster et abuse

map { $bypass_spam_checks{lc($_)}=1 } (qw(
        postmaster@
        abuse@
));

Important : Tant qu'on en est à parler de postmaster et abuse, il ne faut jamais supprimer automatiquement de courriers à destination de ces adresses. Voir la RFC 2142 Mailbox names for common services, roles and functions (Noms de boîtes de courrier pour des services communs, rôles et fonctions). Sinon, votre domaine pourrait finir par être listé dans une des listes du mal qu'on pourra retrouver sur le site rfc-ignorant.org.

4.  Ajouter plus de règles

Si vous souhaitez ajouter quelques-unes des règles proposées par le SpamAssassin Rules Emporium, vous pouvez facilement le faire en en ajoutant ou en les mettant à jour grâce à la fonctionnalité sa-update incluse dans SpamAssassin.

Maintenant, éditez le fichier /etc/rulesdujour/config pour relancer Amavisd-new au lieu de spamd :

5.  Tester et finaliser

Tester la configuration

Avant de lancer freshclam vous pouvez vérifier manuellement que le service fonctionne.

Exemple de code 5.1 : Tester freshclam

# freshclam
ClamAV update process started at Sun May  2 09:13:41 2004
Reading CVD header (main.cvd): OK
Downloading main.cvd [*]
main.cvd updated (version: 22, sigs: 20229, f-level: 1, builder: tkojm)
Reading CVD header (daily.cvd): OK
Downloading daily.cvd [*]
daily.cvd updated (version: 298, sigs: 1141, f-level: 2, builder: diego)
Database updated (21370 signatures) from database.clamav.net (193.1.219.100).

Nous venons de mettre à jour les définitions de virus et nous sommes assurés au passage que freshclam.conf fonctionne correctement.

Testez ensuite freshclam et amavisd en utilisant la CLI (l'interface en ligne de commandes) avec des courriers de test d'amavisd. Lancez clamd et amavis avec les commandes suivantes :

Exemple de code 5.2 : Lancer amavisd et clamd et recharger la configuration de postfix

# /etc/init.d/clamd start
# /etc/init.d/amavisd start
# /etc/init.d/postfix reload

Si tout va bien, postfix devrait écouter sur le port 25 pour la réception de courrier et devrait les réinjecter sur le port 10024. Pour vous en assurer, jetez un coup d'œil dans vos fichiers de journalisation.

Exemple de code 5.3 : Vérifier les fichiers de journalisation

# tail -f /var/log/mail.log

Note : Selon votre configuration de journalisation, il se peut que le bon fichier soit /var/log/messages.

Maintenant, si vous n'avez aucun message étrange dans le fichier de journalisation, il est temps de faire les tests.

Utilisez netcat pour vous connecter manuellement à amavisd sur le port 10024 et à postfix sur le port 10025.

Note : Netcat peut être utilisé comme un remplacement amélioré de telnet. Pour l'installer, vous devez faire emerge netcat.

Note : Pour une raison inconnue, vous ne pouvez pas injecter manuellement un courrier complet avec netcat dans amavisd. Utilisez telnet à la place.

Exemple de code 5.4 : Vérification manuelle du fonctionnement d'amavisd et de postfix

# nc localhost 10024
(Amavis fonctionne)
220 [127.0.0.1] ESMTP amavisd-new service ready
nc localhost 10025
(la réinjection de postfix fonctionne)
220 exemple.com ESMTP Postfix

Note : Si vous souhaitez visualiser l'intégralité des messages de retour avec amavisd-new, lancez amavisd debug-sa avec le compte utilisateur amavis et envoyez un courrier. Pour que cela fonctionne, vous devrez probablement changer le Shell par défaut dans /etc/passwd.

Ajoutez amavisd et clamd aux scripts à lancer par défaut au démarrage.

Exemple de code 5.5 : Amavisd et clamd seront lancés par défaut au démarrage

# rc-update add clamd default
# rc-update add amavisd default

Note : Nous ne mettons pas spamd dans les scripts de démarrage, dans la mesure où amavisd utilise directement les bibliothèques en Perl de Spamassassin.

Note : Vous verrez probablement des lignes comme Net::Server: Couldn't POSIX::setuid to ... [] dans vos fichiers de journalisation. D'après le guide pour chrooter amavis, si l'UID du processus est 0 (root), le programme terminera. Du coup, vous pouvez considérer ce message comme simplement informatif. C'est dû au fait que POSIX::setuid() retourne une chaîne de caractère 0 but true.

Important : Si vous avez permis la connexion de l'utilisateur amavis, n'oubliez pas de remettre son shell de connexion dans /etc/passwd à /bin/false pour le désactiver à nouveau.

6.  Auto-apprentissage et mise en touche de courriers

Créer un utilisateur spamtrap

Nous allons créer un compte spamtrap ainsi qu'un certain nombre de répertoires utiles par la suite.

Exemple de code 6.1 : Création du compte spamtrap

# useradd -m spamtrap
# maildirmake /home/spamtrap/.maildir
# chown -R spamtrap:mailusers /home/spamtrap/.maildir
(Donner à l'utilisateur spamtrap un bon mot de passe)
# passwd spamtrap

Si vous voulez vérifier manuellement certains des courriers pour vous assurer qu'il n'y a pas de faux positifs, vous pouvez utiliser la commande procmail pour mettre à l'écart le spam trouvé dans différents répertoires de courrier.

Création du fichier .procmailrc

Exemple de code 6.2 : Création de /home/spamtrap/.procmailrc

# Définition de quelques variables par défaut
MAILDIR=$HOME/.maildir

SPAM_FOLDER=$MAILDIR/.spam-found/

LIKELY_SPAM_FOLDER=$MAILDIR/.likely-spam-found/

# Placer le courrier ayant un score de spam de plus de 7 dans le
# répertoire de spam.
:0:
* ^X-Spam-Status: Yes
* ^X-Spam-Level: \*\*\*\*\*\*\*
$SPAM_FOLDER

# Placer le courrier ayant un score de spam entre 5 et 7 dans le
# répertoire de courrier a priori de type spam.
:0:
* ^X-Spam-Status: Yes
$LIKELY_SPAM_FOLDER

# Placer le reste du courrier dans la boîte Inbox
:0
*
./

Attention : Si vous vous attendez à recevoir sur votre serveur de courrier une grande quantité de courrier, il vaut mieux ne pas utiliser le dépôt pour le courrier ayant un score entre 5 et 7. À la place, vous pouvez utiliser une valeur suffisamment grande pour la variable $sa_tag2_level_deflt pour éviter les faux positifs et vous les filtrerez alors directement dans le répertoire $SPAM_FOLDER.

Note : Si vous n'avez pas encore installé procmail, vous devez le faire avec emerge procmail.

Maintenant, assurez-vous que Postfix utilise procmail pour délivrer le courrier.

Exemple de code 6.3 : Modification de /etc/postfix/main.cf

mailbox_command = /usr/bin/procmail -a "DOMAIN"

Créer les répertoires de courrier

Nous allons désormais créer des répertoires partagés pour le spam et le ham (courrier indésirable et faux positifs).

Exemple de code 6.4 : Création des répertoires de courrier nécessaires

# maildirmake /var/amavis/.maildir
# maildirmake -S /var/amavis/.maildir/Bayes
# maildirmake -s write -f spam /var/amavis/.maildir/Bayes
# maildirmake -s write -f ham /var/amavis/.maildir/Bayes
# maildirmake -s write -f redeliver /var/amavis/.maildir/Bayes

Amavisd-new doit pouvoir lire ces fichiers ainsi que tous les fichiers de courrier des utilisateurs. Ainsi, nous allons ajouter tous les utilisateurs concernés ainsi que amavis au groupe mailusers.

Exemple de code 6.5 : Configuration des permissions d'accès

# groupadd mailusers
# usermod -G mailusers spamtrap
# chown -R amavis:mailusers /var/amavis/.maildir/
# chown amavis:mailusers /var/amavis/
# chmod -R 1733 /var/amavis/.maildir/Bayes/
# chmod g+rx /var/amavis/.maildir/
# chmod g+rx /var/amavis/.maildir/Bayes/

Attention : Ces lignes donnent aux membres du groupe mailusers un accès au courrier d'amavis.

Ici, vous avez donné aux répertoires de spam et ham des droits d'écriture, mais pas de lecture. De cette manière, les utilisateurs peuvent soumettre avec confiance leurs faux positifs sans que les autres utilisateurs puissent les lire.

Enfin, exécutez la commande suivante en tant qu'utilisateur spamtrap :

Exemple de code 6.6 : Ajouter les répertoires partagés aux répertoires courrier des utilisateurs

$ maildirmake --add Bayes=/var/amavis/.maildir/Bayes $HOME/.maildir

Note : Nous devons donner des droits de lecture pour le groupe sur le répertoire Bayes avant que le client mail puisse lire les sous-répertoires utilisés par IMAP.

Ajouter des tâches périodiques

Exécutez maintenant crontab -u amavis -e pour éditer la configuration crontab de l'utilisateur amavis pour permettre un apprentissage automatique des filtres bayésiens toutes les heures.

Exemple de code 6.7 : crontab d'amavis

# Auto-apprentissage
0 * * * *          /usr/bin/sa-learn --spam /var/amavis/.maildir/Bayes/.spam/{cur,new} \
                    > /dev/null 2>&1
0 * * * *          /usr/bin/sa-learn --ham /var/amavis/.maildir/Bayes/.ham/{cur,new} > \
                   /dev/null 2>&1

Note : Amavis doit être membre du groupe cron pour pouvoir exécuter les tâches périodiques.

Note : Il semble que les répertoires partagés de courrier obligeront à sa-learn d'examiner tous les messages deux fois. Cela ne devrait pas être un problème. En sortie, nous constaterons que le maximum de messages appris ainsi sera de la moitié de ceux réellement examinés.

Mofification de amavisd.conf

Maintenant nous allons modifier amavis pour rediriger les courriers de spam vers le compte spamtrap en gardant les en-têtes de spam.

Exemple de code 6.8 : Modification de /etc/amavisd.conf

(Définir le compte à qui envoyer les spams et les courriers vérolés.)
$spam_quarantine_to = "spamtrap\@$myhostname";

Envoyer de nouveau les faux positifs

Si, comme nous l'avons fait jusque là, vous rejetez le courrier ayant un score de spam très bas, vous aurez très probablement quelques faux positifs. Ils sont filtrés dans le répertoire likely-spam. Ils sont manuellement vérifiés et tous les faux positifs sont déplacés dans le répertoire redeliver. À partir de là, une première étape consiste à exécuter sa-learn --ham, puis la soumission du courrier, en gardant tous les en-têtes intacts, est effectuée en utilisant une version corrigée de smtpclient par Ralf S. Engelschall.

La version originale 1.0.0 de smtpclient est déjà dans Portage, mais pour préserver tous les en-têtes, nous devons utiliser une version modifiée. Voici comment installer cette version :

Exemple de code 6.9 : Installer une version modifiée de smtpclient

(Aller dans votre OVERLAY de Portage)
# wget http://home.coming.dk/files/smtpclient.tar.gz
# tar xzf smtpclient.tar.gz
# echo "mail-client/smtpclient    ~x86" >> /etc/portage/package.keywords
# echo "mail-client/smtpclient    fullheaders" >> /etc/portage/package.use
# emerge smtpclient

Vérifiez le courrier dans le répertoire redeliver toutes les minutes en utilisant cron.

Exemple de code 6.10 : crontab d'amavis

# Renvoyer les faux positifs
* * * * *          find /var/amavis/.maildir/Bayes/.redeliver/cur/ -type f -name \
                   "[0-9]*" -exec cp {} /var/amavis/.maildir/Bayes/.ham/cur/ \; \
                   && find /var/amavis/.maildir/Bayes/.redeliver/cur/ -type f \
                   -name "[0-9]*" -exec /usr/local/bin/redeliver.pl {} \;

Maintenant, tout ce que vous avez à faire est de copier le fichier redeliver.pl dans /usr/local/bin/. Télechargez-le ou utilisez la version ci-dessous.

Exemple de code 6.11 : redeliver.pl

#!/usr/bin/perl -w

# Renvoi le courrier en utilisant une version modifiée de smtpclient
# Par : Jens Hilligsoe <gentoo@hilli.dk>

use strict;

if(!($#ARGV == 0)) {
        die "Usage:\n$0 maildir_mail\n";
}

my $mail = $ARGV[0];
my $to = "";
my $from = "";

sub prunefile ( $ );

# Récupère les champs To et From
open (MAIL, $mail) or die "Could not open $mail: $?\n";
while(<MAIL>) {
    if(($to eq "") || ($from eq "")) {
        chop;
        (my $key, my $value) = split (/:/);
        if($key eq "X-Envelope-To") {
            $to = $value;
            $to =~ s/[\<\>,]//g; # Supprime "<", ">" and ","
            $to =~ s/^\s+|\s+$//g; # Supprime les espaces avant et après
        }
        if($key eq "X-Envelope-From") {
            $from = $value;
            $from =~ s/[\<\>,]//g;
            $from =~ s/^\s+|\s+$//g;
            if($from eq "") {
                $from = "postmaster";
            }
        }
    }
}

if($to eq "") {
    prunefile($ARGV[0]); # Supprimez-le simplement s'il est vide
} else {
    my $redelivercmd = "cat $ARGV[0] | smtpclient -F -S 127.0.0.1 -P 10025 -f $from $to";
    unless (system($redelivercmd) == 0 ) {
        die "Unable to redeliver: $?";
    }
    prunefile($ARGV[0]); # Clean up
}

sub prunefile ( $ ) {
    my ($file) = @_;
    unless (unlink $file) {
        die "Unable to remove mail: $?";
    }
}

Nettoyage

Vous ne voulez sans doute pas garder pour toujours le courrier dans les répertoires, donc utilisez tmpwatch pour faire un nettoyage régulier. Installez-le avec emerge tmpwatch. Seul l'utilisateur root est capable d'exécuter tmpwatch donc vous devez éditer la crontab root.

Exemple de code 6.12 : Modifier la crontab de root

# Nettoyage
# Garder les mails à virus pendant une semaine (24*7 hours)
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/virusmails/
# Supprimer le spam et le ham après une semaine
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/.maildir/Bayes/

7.  Listes grises

Introduction

Les listes grises sont l'une des armes les plus récentes pour la lutte contre le spam. Comme leur nom l'indique, c'est un mélange des listes blanches et des listes noires. À chaque fois qu'un serveur de courriers inconnu essaye d'envoyer du courrier, le courrier est rejeté avec un message essaye plus tard. Cela signifie que le courrier sera retardé, mais aussi que les robots de spam qui n'implémentent pas le protocole RFC refuseront de récupérer le spam et ne le renverront pas. Avec le temps, les robots de spam seront probablement modifiés pour tenir compte de cela, mais cela permet de gagner du temps pour développer de nouvelles technologies pour identifier le spam.

Note : Si votre fournisseur d'accès à Internet bloque le trafic entrant sur le port 25 et si tout le courrier vous est relayé à travers leur propre serveur de courrier, les listes grises ne fonctionneront pas.

Postfix 2.1 est fourni avec un simple script Perl implémentant un tel serveur qui gère les listes grises. Cependant, il donne des résultats imprévisibles quand la partition contenant la base de données de listes grises manque d'espace libre. Il existe une version améliorée qui ne souffre pas de ce problème. Nous allons tout d'abord vous présenter comment installer le support des listes grises fourni avec Postfix, puis nous vous montrerons comment configurer la version plus robuste qui remplacera ce script.

Note : D'autres serveurs de listes grises pour Postfix existent. Voyez par exemple Gld qui est dans Portage ou SQLgrey. Certaines utilisent des bases de données, le « listage blanc » automatique et d'autres fonctionnalités.

Listes grises simples

Note : Si vous préférez utiliser les listes grises améliorées de postgrey, vous pouvez ignorer la section suivante.

Nous avons besoin du fichier greylist.pl, mais malheureusement l'ebuild ne l'installe pas par défault.

Exemple de code 7.1 : Récupérer le fichier greylist.pl

# cp /usr/portage/distfiles/postfix-votre-version.tar.gz /root/
# tar xzf postfix-votre-version.tar.gz
# cp postfix-2.1.0/examples/smtpd-policy/greylist.pl /usr/bin/

Maintenant que nous disposons du fichier à l'endroit souhaité, nous devons créer un répertoire pour placer la base de données de listes grises :

Exemple de code 7.2 : Création du répertoire pour la base de données de listes grises

# mkdir /var/mta
# chown nobody /var/mta

Attention : Ne créez pas le répertoire de base de données de listes grises sur une partition qui risque de manquer d'espace disque. Si Postfix peut gérer des situations où il manque de l'espace disque pour les files d'attente de courrier et les boîtes de courriers des utilisateurs, ce n'est pas le cas pour la base de données des listes grises. Si le fichier est corrompu, vous ne pourrez plus recevoir du tout de courrier tant que vous n'aurez pas supprimé le fichier en question à la main.

Configurer les listes grises

Maintenant que tout est prêt, tout ce qu'il nous reste à faire est d'ajouter cette fonctionnalité à la configuration de Postfix. Tout d'abord, ajoutons les informations nécessaires au fichier master.cf :

Exemple de code 7.3 : Modification de master.cf pour l'utilisation des listes grises

policy-greylist  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/bin/greylist.pl

Le démon spawn de postfix tue normalement ses propres processus fils après 1000 secondes, mais ce temps est trop court pour le processus de listes grises, donc nous allons devoir augmenter la limite de temps dans main.cf :

Exemple de code 7.4 : Modification de main.cf pour l'utilisation de listes grises

policy-greylist_time_limit = 3600
(Dans smtpd_recipient_restrictions, ajouter :)
check_sender_access hash:/etc/postfix/sender_access
(Plus loin, ajouter :)
restriction_classes = greylist
greylist = check_policy_service unix:private/policy-greylist

Attention : Assurez-vous de bien définir check_sender_access APRÈS reject_unauth_destination car sinon votre système pourrait devenir un serveur relai de courrier ouvert.

Note : La base de données de listes grises se pollue rapidement d'adresses parasites. Il est bon de protéger les vérifications de la liste grise en ajoutant d'autres restrictions qui rejettent des expéditeurs et/ou destinataires inconnus.

Vous ne voudrez sans doute pas utiliser des listes grises pour tous les domaines mais seulement ceux qui subissent fréquemment les assauts des spammeurs. Après tout, les listes grises retardent la réception du courrier. Une liste de domaines MAIL FROM fréquemment forgés pour le spam est disponible. Ajoutez les domaines sur lesquels vous recevez beaucoup de spam à votre fichier /etc/postfix/sender_access :

Exemple de code 7.5 : Format du fichier sender_access

aol.com     greylist
hotmail.com greylist
bigfoot.com greylist

Si vous souhaitez une liste plus complète :

Exemple de code 7.6 : Ajouter tous les domaines à sender_access

# wget http://www.monkeys.com/anti-spam/filtering/sender-domain-validate.in
# cat sender-domain-validate.in | sort | awk {'print $1 "\t\t greylist"'} > /etc/postfix/sender_access

Maintenant, nous n'avons plus qu'à initialiser la base de données sender_access :

Exemple de code 7.7 : Initialiser sender_access

# postmap /etc/postfix/sender_access

La configuration du système de listes grises simples est terminée.

Attention : J'ai testé cette configuration sur une machine gérant des milliers de courriers par jour et le résultat a été un désastre complet. Après quatre jours, la machine était surchargée de centaines de vieux processus greylist.pl.

Configurer une amélioration des listes grises avec postgrey

Vous pouvez installer le serveur de politiques de listes grises améliorées en une seule commande emerge:

Exemple de code 7.8 : Installer postgrey

# emerge postgrey

Après avoir installé postgrey, vous devez éditer le fichier main.cf. Les modifications sont presque identiques à celles utilisées précédemment.

Exemple de code 7.9 : Modification de main.cf pour utiliser des listes grises

(Dans smtpd_recipient_restrictions ajouter :)
check_sender_access hash:/etc/postfix/sender_access
(Plus loin, ajouter :)
smtpd_restriction_classes = greylist
greylist = check_policy_service inet:127.0.0.1:10030

Note : La variable Postfix SMTPD_POLICY_README utilise uniquement restriction_classes mais cela semble ne pas fonctionner.

Note : Si vous souhaitez mettre en liste grise absolument tous les domaines, ajoutez à la place : check_policy_service inet:127.0.0.1:10030.

Pour finir, lancez le serveur et ajoutez-le au runlevel adéquat.

Exemple de code 7.10 : Démarrage de postgrey

# /etc/init.d/postgrey start
# rc-update add postgrey default

Note : Certaines personnes aiment récupérer rapidement leur courrier et dans ce cas les listes grises sont inutiles. Cela dit, si vous utilisez un serveur courrier de sauvegarde vous pouvez facilement mettre en place des listes grises dessus. Mon expérience limitée m'a appris que cela peut supprimer jusqu'à un tiers du spam reçu.

8.  SPF (Sender Policy Framework, ou Système de contrôle des expéditeurs)

Introduction

SPF permet aux propriétaires de noms de domaines d'indiquer dans leurs registres DNS quelles adresses IP ont le droit d'envoyer des courriers provenant de leurs domaines. Cela empêche les spammeurs de manipuler le Return-Path.

Note : Si votre fournisseur d'accès à Internet bloque le trafic entrant sur le port 25 et vous relaye tout le courrier depuis leur propre serveur de courrier, le SPF ne fonctionnera pas.

Tout d'abord, les propriétaires de domaines doivent créer un enregistrement DNS spécial nommé TXT. Ensuite, le MTA supportant le SPF pourra le lire et, si le courrier provient d'un serveur qui n'est pas décrit dans les enregistrements SPF, le courrier pourra être rejeté. Un exemple d'entrée SPF ressemble à ceci :

Exemple de code 8.1 : Exemple d'enregistrement SPF

exemple.com.  IN TXT  "v=spf1 a mx ptr -all"

L'option -all signifie qu'il faut rejeter tout courrier par défaut et autoriser le courrier provenant des enregistrements DNS A (a), MX (mx) et PTR (ptr). Pour plus d'information, consultez le chapitre des ressources à la fin du guide.

Note : Si vous relayez le courrier sortant à votre fournisseur d'accès Internet, il faudra que vous ajoutiez : include:votrefai.com.

Spamassassin 3.0 supporte le SPF, mais l'option n'est pas activée par défaut, et le nouveau démon de Postfix gérant les politiques supporte le SPF, donc nous installerons le support SPF proposé par Postfix.

Note : Si vous souhaitez utiliser le SPF avec Spamassassin, il vous suffit d'installer emerge dev-perl/Mail-SPF-Query et de relancer Amavisd-new.

Préparations

Nous allons tout d'abord devoir installer Postfix 2.1 comme vu précédemment. Une fois que vous avez téléchargé les sources, récupérez le fichier spf.pl ainsi :

Exemple de code 8.2 : Installer spf.pl

# cp postfix-<version>/examples/smtpd-policy/spf.pl /usr/local/bin/

Note : Le script spf.pl fourni avec Postfix est assez bogué. Il vous faudra trouver et décommenter la ligne suivante : push @HANDLERS, "sender_permitted_from"; use Mail::SPF::Query;. Ensuite, à la ligne 199 environ, remplacez comemnt par comment. Vous pouvez également télécharger la version de développement.

Ce script Perl nécessite également un certain nombre de bibliothèques qui ne sont pas fournies dans Portage, mais leur installation reste assez simple :

Exemple de code 8.3 : Installer les bibliothèques Perl nécessaires

# emerge Mail-SPF-Query Net-CIDR-Lite Sys-Hostname-Long

Maintenant que tout est en place, il ne nous reste plus qu'à configurer Postfix pour qu'il utilise cette nouvelle politique.

Exemple de code 8.4 : Modifier master.cf pour utiliser le SPF

policy-spf  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/local/bin/spf.pl

Ajoutez maintenant la vérification SPF dans main.cf. Un SPF bien configuré ne devrait pas poser de problème donc nous pouvons vérifier le SPF pour tous les domaines :

Exemple de code 8.5 : Modifier main.cf pour utiliser le SPF

(Après smtpd_recipient_restrictions, ajouter :)
check_policy_service unix:private/policy-spf

Note : Si vous rencontrez des problèmes avec le SPF, par exemple lors de l'utilisation de fetchmail, il vous faudra probablement n'activer le SPF que pour certains domaines.

9.  Configurer amavisd-new pour utiliser MySQL

Configurer MySQL

Note : Cette configuration n'a pas été testée avec des versions supérieures à la 2.2. Un retour d'expérience est le bienvenu :)

Pour des domaines importants, les valeurs par défaut que vous définissez dans amavisd.conf peuvent ne pas convenir à tous les utilisateurs. Si vous configurez amavisd-new avec le support de MySQL, vous pourrez avoir des configurations personnalisées pour les utilisateurs ou pour des groupes d'utilisateurs.

Exemple de code 9.1 : Création de la base de données MySQL et attribution des droits

# mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database maildb;
mysql> GRANT INSERT,UPDATE,DELETE,SELECT ON maildb.* TO 'mail'@'localhost' IDENTIFIED BY 'mot_de_passe_archi_secret';
mysql> use maildb;

Maintenant que la base de données a été créée, nous devons y ajouter les tables nécessaires. Vous pouvez copier/coller les lignes suivantes dans l'invite de commandes de mysql :

Exemple de code 9.2 : tables MySQL

CREATE TABLE users (
    id         int unsigned NOT NULL auto_increment,
    priority   int          NOT NULL DEFAULT '7',  -- 0 est une priorité faible
    policy_id  int unsigned NOT NULL DEFAULT '1',
    email      varchar(255) NOT NULL,
    fullname   varchar(255) DEFAULT NULL,    -- non utilisé par amavisd-new
    local      char(1),     -- Y/N  (champ optionnel, voir la note plus bas)
    PRIMARY KEY (id),
    KEY email (email)
    );
CREATE UNIQUE INDEX users_idx_email ON users(email);

-- (Toute adresse courrier, externe ou locale, utilisée comme expéditeur dans wblist)
CREATE TABLE mailaddr (
   id         int unsigned NOT NULL auto_increment,
   priority   int          NOT NULL DEFAULT '7',  -- 0 est une priorité faible
   email      varchar(255) NOT NULL,
   PRIMARY KEY (id),
   KEY email (email)
   );
CREATE UNIQUE INDEX mailaddr_idx_email ON mailaddr(email);

-- (listes blanches et/ou noires par destinataires,
-- mettre les expéditeurs et destinataires à la bonne place)
(expéditeurs sur listes blanches ou noires)
CREATE TABLE wblist (
   rid        int unsigned NOT NULL,     -- destinataire : users.id
   sid        int unsigned NOT NULL,     -- expéditeur :    mailaddr.id
   wb         char(1) NOT NULL, -- W/Y (blanche), B/N (noir), espace=neutre
   PRIMARY KEY (rid,sid)
   );

CREATE TABLE policy (
   id               int unsigned NOT NULL auto_increment,
   policy_name      varchar(32),     -- non utilisé par amavisd-new
   virus_lover          char(1),     -- Y/N (Oui/Non)
   spam_lover           char(1),     -- Y/N  (champ optionnel)
   banned_files_lover   char(1),     -- Y/N  (champ optionnel)
   bad_header_lover     char(1),     -- Y/N  (champ optionnel)
   bypass_virus_checks  char(1),     -- Y/N
   bypass_spam_checks   char(1),     -- Y/N
   bypass_banned_checks char(1),     -- Y/N  (champ optionnel)
   bypass_header_checks char(1),     -- Y/N (champ optionnel)
   spam_modifies_subj   char(1),     -- Y/N (champ optionnel)
   spam_quarantine_to   varchar(64) DEFAULT NULL, -- (champ optionnel)
   spam_tag_level  float,  -- un score supérieur ajoute les en-têtes de spam
   spam_tag2_level float DEFAULT NULL,  -- un score supérieur ajoute les champs
               -- d'en-tête d'information 'déclaré comme spam'
   spam_kill_level float,  -- un score supérieur active des actions d'évasion
               -- comme rejet/oubli, quarantaine, ...
               -- (lié à la configuration de final_spam_destiny)
   PRIMARY KEY (id)
  );

Note : Si vous rencontrez des problèmes avec la copie de ces lignes, copiez-les ailleurs puis supprimez les caractères inutiles.

Note : Les vérifications pour essayer d'identifier une adresse de courrier sont effectuées avec les adresses pures (rfc2821-unquoted and unbracketed) comme clef, c'est-à-dire : Jean « Pouet » Paul@exemple.com.

Note : Les vérifications sont effectuées dans l'ordre suivant : SQL, LDAP, hash, ACL, expressions rationnelles et constantes. Le premier à retourner une réponse définitive (autre que undef/NULL) arrête le processus de recherche.

Si vous souhaitez utiliser les listes blanches et noires, vous devez ajouter l'expéditeur et le destinataire dans mailadr. Après quoi, vous créerez une relation entre les deux adresses dans la table wblist et indiquerez s'il s'agit de liste blanche (W) ou de liste noire (B).

Maintenant que nous avons créé les tables, nous allons ajouter un utilisateur de test et une politique de test :

Exemple de code 9.3 : Création d'un utilisateur et une politique de test

INSERT INTO users
   SET
      id         =1,
      priority   =9,
      policy_id  =1,
      email      ="johndoe@exemple.com",
      fullname   ="John Doe",
      local      ="Y";

INSERT INTO policy
   SET
      id                     =1,
      policy_name            ="Politique de test 1",
      virus_lover            ="N",
      spam_lover             ="N",
      banned_files_lover     ="N",
      bad_header_lover       ="N",
      bypass_virus_checks    ="N",
      bypass_spam_checks     ="N",
      bypass_banned_checks   ="N",
      bypass_header_checks   ="N",
      spam_modifies_subj     ="N",
      spam_quarantine_to     =NULL,
      spam_tag_level         =-50.0,
      spam_tag2_level        =7.0,
      spam_kill_level        =10.0;

Note : Copiez ces lignes ailleurs et ajustez-les pour vous conformer à votre propre environnement avant de les ajouter à votre base.

Note : local devrait être initialisé à Y sinon le courrier ne sera pas vérifié pour le spam.

Ces lignes ajoutent un utilisateur de test et une politique de test. Ajustez ces exemples pour qu'ils s'adaptent à vos besoins. Vous pouvez trouver plus d'information sur la configuration dans le fichier amavisd.conf.

Configurer amavisd pour utiliser MySQL

Maintenant que MySQL est prêt, nous allons demander à amavis de l'utiliser.

Exemple de code 9.4 : Modification de amavisd.conf

@lookup_sql_dsn =
   ( ['DBI:mysql:maildb:host1', 'mail', 'mot_de_passe_secret']  );

(Pour plus de clarté, enlevez les commentaires par défaut.)
$sql_select_policy = 'SELECT *,users.id FROM users,policy'.
   ' WHERE (users.policy_id=policy.id) AND (users.email IN (%k))'.
   ' ORDER BY users.priority DESC';

(Si vous souhaitez des listes blanches/noires pour les expéditeurs :)
   $sql_select_white_black_list = 'SELECT wb FROM wblist,mailaddr'.
     ' WHERE (wblist.rid=?) AND (wblist.sid=mailaddr.id)'.
     '   AND (mailaddr.email IN (%k))'.
     ' ORDER BY mailaddr.priority DESC';

10.  Configurer Spamassassin pour utiliser MySQL

Depuis la version 3.0, Spamassassin permet de sauvegarder les données bayésiennes et AWL dans une base de données MySQL. Nous utilisons MySQL car ses performances sont supérieures aux autres pour ce genre de données. De plus, la gestion du système est plus facile si MySQL est utilisé pour stocker les deux types de données à la fois. Nous allons présenter comment le configurer simplement.

Tout d'abord, créez le nouvel utilisateur MySQL, puis créez les tables nécessaires.

Exemple de code 10.1 : Création d'un utilisateur et d'une base de données MySQL

# mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database nombdd;
mysql> GRANT INSERT,UPDATE,DELETE,SELECT ON nombdd.* TO 'dbuser'@'localhost' IDENTIFIED BY 'un_nouveau_mot_de_passe_super_secret';
mysql> use nombdd;

Maintenant que la base a été créée, nous allons créer les tables nécessaires. Vous pouvez copier/coller les lignes suivantes dans votre invite de commande mysql :

Exemple de code 10.2 : Structure des tables MySQL

CREATE TABLE bayes_expire (
    id                    int(11)         NOT NULL default '0',
    runtime               int(11)         NOT NULL default '0',
    KEY bayes_expire_idx1 (id)
    ) TYPE=MyISAM;

CREATE TABLE bayes_global_vars (
    variable              varchar(30)     NOT NULL default '',
    value                 varchar(200)    NOT NULL default '',
    PRIMARY KEY           (variable)
    ) TYPE=MyISAM;

INSERT INTO bayes_global_vars VALUES ('VERSION','3');

CREATE TABLE bayes_seen (
    id                    int(11)         NOT NULL default '0',
    msgid                 varchar(200) binary NOT NULL default '',
    flag                  char(1)         NOT NULL default '',
    PRIMARY KEY           (id,msgid)
    ) TYPE=MyISAM;

CREATE TABLE bayes_token (
    id                    int(11)         NOT NULL default '0',
    token                 char(5)         NOT NULL default '',
    spam_count            int(11)         NOT NULL default '0',
    ham_count             int(11)         NOT NULL default '0',
    atime                 int(11)         NOT NULL default '0',
    PRIMARY KEY           (id, token),
    INDEX                 (id, atime)
    ) TYPE=MyISAM;

CREATE TABLE bayes_vars (
    id                    int(11)         NOT NULL AUTO_INCREMENT,
    username              varchar(200)    NOT NULL default '',
    spam_count            int(11)         NOT NULL default '0',
    ham_count             int(11)         NOT NULL default '0',
    token_count           int(11)         NOT NULL default '0',
    last_expire           int(11)         NOT NULL default '0',
    last_atime_delta      int(11)         NOT NULL default '0',
    last_expire_reduce    int(11)         NOT NULL default '0',
    oldest_token_age      int(11)         NOT NULL default '2147483647',
    newest_token_age      int(11)         NOT NULL default '0',
    PRIMARY KEY           (id),
    UNIQUE bayes_vars_idx1 (username)
    ) TYPE=MyISAM;

CREATE TABLE awl (
    username              varchar(100)    NOT NULL default '',
    email                 varchar(200)    NOT NULL default '',
    ip                    varchar(10)     NOT NULL default '',
    count                 int(11)         default '0',
    totscore              float           default '0',
    PRIMARY KEY           (username,email,ip)
    ) TYPE=MyISAM;

Important : La ligne INSERT est nécessaire. Sans elle, Spamassassin ne fonctionnera pas.

Note : Vous trouverez également ces lignes dans l'archive source, dans les fichiers awl_mysql.sql et bayes_mysql.sql.

Configurer Spamassassin pour utiliser l'interface MySQL

Si vous avez une ancienne base de données bayésienne dans la base de données DBM et que vous souhaitez la garder, suivez les instructions suivantes :

Exemple de code 10.3 : Convertir une base bayésienne depuis une base de données DBM

# su - amavis
$ sa-learn --sync
$ sa-learn --backup > sauvegarde.txt
$ sa-learn --restore sauvegarde.txt

Note : Notez que la dernière étape ne doit être effectuée qu'une fois que la base de données MySQL et que le fichier secrets.cf ont été mis à jour.

Donnons maintenant à Spamassassin les informations nécessaires :

Exemple de code 10.4 : Modification de /etc/mail/spamassassin/secrets.cf

(Indiquez à Spamassassin d'utiliser MySQL pour la base bayésienne.)
bayes_store_module              Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn                   DBI:mysql:sa_bayes:localhost:3306
bayes_sql_username              nombdd
bayes_sql_password              un_nouveau_mot_de_passe_super_secret

(Indiquez à Spamassassin d'utiliser MySQL pour la base AWL.)
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                    DBI:mysql:sa_bayes:localhost:3306
user_awl_sql_username           nombdd
user_awl_sql_password           un_nouveau_mot_de_passe_super_secret

Ensuite, renforcez la sécurité du fichier :

Exemple de code 10.5 : Changer les permissions d'accès au fichier

# chmod 400 /etc/mail/spamassassin/secrets.cf

Note : Pour créer un mot de passe correct, utilisez emerge app-admin/makepasswd puis makepasswd -chars=8.

Tout ce qu'il reste à faire désormais est de lancer/etc/init.d/amavisd restart.

11.  Problèmes rencontrés

Amavisd-new

Pour déboguer amavisd-new, commencez par l'arrêter avec /etc/init.d/amavisd stop, puis lancez le manuellement avec amavisd debug, puis cherchez les anomalies dans les retours du programme.

Spamassassin

Pour déboguer Spamassassin, vous pouvez filtrer un courrier directement avec spamassassin -D < courrier. Pour vous assurer que ses en-têtes restent intacts, vous pouvez le déplacer depuis une autre machine avec IMAP.

Note : Si vous devez faire du débogage, vous devez permettre que l'utilisateur amavis puisse se connecter en changeant le shell de connexion dans /etc/passwd pour mettre /bin/bash.

Si vous le souhaitez, vous pouvez obtenir les mêmes informations, et même plus, en utilisant la commande amavisd debug-sa.

Obtenir de l'aide

Si vous avez besoin d'aide, vous pouvez utiliser la liste de diffusion amavis-user. Avant d'y envoyer une question, essayez de chercher une solution dans les archives de la liste de diffusion amavis-user. Si vous ne trouvez pas de réponse à votre question, vous pouvez vous inscrire à la liste de diffusion amavis-user.

Si votre question est spécifique à SpamAssassin, DCC, Razor ou Postfix, référez-vous à leurs pages web respectives, indiquées plus bas.

12.  Ressources

Pour plus d'informations

Ressources générales

Autres guides



Imprimer

Dernière mise à jour le 2 août 2007

La version originale de cette traduction n'est plus maintenue

Résumé : Ce guide explique pas à pas l'installation d'un système de filtrage anti-spam pour Postfix, en utilisant notamment Amavisd-new couplé à Spamassassin et ClamAV, un système de listes grises et SPF.

Sune Kloppenborg Jeppesen
Auteur

Jens Hilligsøe
Contributeur

Joshua Saddler
Correcteur

Clément Varaldi
Traducteur

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.