Traductions de cette page:

Postfix + DSPAM + ClamAV

Voici un petit howto qui devrait vous permettre de réaliser un serveur mail Postfix avec filtrage des SPAM grâce à DSPAM et filtrage des virus grâce à ClamAV.

Pré-requis

Pour ce tutoriel, nous utiliserons une Debian Lenny. Cependant cela fonctionne de manière identique avec une Etch.
Nous n'utiliserons que des paquets standard de la Debian.

Installation des paquets

# aptitude install postfix postfix-pcre dspam libdspam7-drv-mysql clamav

Choisissez la configuration qui convient à votre cas…

Postfix

La première chose à faire est de s'occuper de Postfix…
Deux possibilités différentes s'offrent à nous:

  1. Filtrer tout les mails (entrant, sortant, tous !)
  2. Filtrer que pour les domaines hébergés

Configuration commune

La configuration de Postfix se fait dans plusieurs fichiers (deux principalement).

main.cf

Ce fichier est situé dans /etc/postfix/
On va préciser à Postfix que l'on veut utiliser un filtre de contenu pour tous les mails qui arrivent sur le serveur. Voici le fichier de configuration commun au deux configurations possibles:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
 
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
 
# appending .domain is the MUA's job.
append_dot_mydomain = no
 
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
 
readme_directory = no
 
myhostname = postfix.linux.efrei.fr
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = postfix.linux.efrei.fr, localhost.linux.efrei.fr, , localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
 
virtual_alias_maps = regexp:/etc/postfix/dspam_aliases

master.cf

On doit maintenant définir le service smtp-dspam que l'on utilise dans le fichier main.cf.
On rajoute donc ceci au fichier:

smtp-dspam unix -       -       n       -       10      lmtp
  -o smtp_send_xforward_command=yes
  -o disable_mime_output_conversion=yes
  -o smtp_generic_maps=

Les mails seront passés à la commande “lmtp” via un socket unix.
La première option permet de conserver les infos du clients qui se connecte au serveur plutôt que de retrouver du “localhost” dans les logs.
La troisième option évite la réécriture des adresses qui est inutile à cet endroit.

Maintenant il faut faire en sorte que le serveur DSPAM puisse réinjecter les mails dans Postfix pour qu'il les délivre aux destinataires.

Et pour ça, on va demander à Postfix d'écouter sur un port non standard qui ne servira que à DSPAM.

localhost:25001 inet    n       -       -       -       -       smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Cette fois ci, on utilise un démon “smtpd” sur une connexion réseau sur le port 25001 de l'interface local.
Ainsi que quelques options:

  • La première pour éviter que les mails qui viennent de DSPAM ne soit réinjectés dans le filtre de contenu (DSPAM).
  • “no_unknown_recipient_checks,no_header_body_checks” sont à préciser lorsque l'on utilise un filtre de contenu externe.
  • Les trois options suivntes désactive toutes les restrictions concernant le client (DSPAM).
  • Puis on autorise uniquement des client locaux (la machine elle même)
  • Et enfin on autorise les clients locaux à propager les informations du serveur précédent.

virtual_aliases

On va ici définir des expressions régulières afin de ne pas avoir à ajouter des alias spam- et notspam- pour chaque utilisateur.
Nous avons choisi d'utiliser le fichier dspam_aliases dans lequel on retrouve ceci:

/^spam-(.*)$/   ${1}
/^notspam-(.*)$/ ${1}

Ici on réécrit toutes les adresses commançant par spam- et notspam- de sorte à ce qu'elles correspondent à l'utilisateur (par exemple spam-user ⇒ user). Si l'utilisateur n'éxiste pas Postfix refusera le mail avant même de le récupérer.

Configuration n°1

Dans le cas où nous souhaitons tous filtrer il faut rajouter la ligne suivante au fichier de configuration main.cf:

content_filter = smtp-dspam:[127.0.0.1]:25000

De cette manière ous les mails qui transite par Postfix passeront par DSPAM.

Configuration n°2

Dans ce deuxième cas un peu plus complexe. Il va falloir créer des règles pour envoyer les mails concernés vers DSPAM. Pour cela on va ajouter les lignes suivantes au fichier de configuration main.cf:

smtpd_recipient_restrictions = 
  permit_mynetworks
  reject_unauth_destination
  check_recipient_access regexp:/etc/postfix/dspam_filter

Ici on indique à Postfix de vérifier dans une table les règles qui s'appliquent aux informations de destination.

  1. On autorise tous les mails qui proviennent d'un host listé dans “my_networks” et donc tous les mails provenant du serveur quelque soit sa destination.
  2. On rejète tout ce qui n'est pas reconnu comme destination valable.
  3. On demande à Postfix de checker les règles dans le fichier ”/etc/postfix/dspam_filter”.

On doit maintenant créer le fichier de règles dspam_filter:

/^.*@postfix.linux.efrei.fr$/      FILTER smtp-dspam:[127.0.0.1]:25000

Une petite commande pour construire le fichier Berkley correspondant:

# postmap /etc/postfix/dspam_filter

On fait passer par DSPAM tout mail à destination du domaine postfix.linux.efrei.fr.

Et voila pour Postfix… Il ne reste plus qu'a le relancer:

# /etc/init.d/postfix restart

DSPAM

Passons maintenant à notre filtre anti-spam. DSPAM est un filtre Baysiens comme celui intégré à ThunderBird écris en C et conçu pour un fonctionnement en mode serveur.

Configuration

La configuration de DSPAM se fait principalement dans le fichier dspam.conf situé dans /etc/dspam/

dspam.conf

La première chose à modifier est le driver utilisé pour le stockage des informations. Nous allons utiliser une base MySQL:

StorageDriver /usr/lib/dspam/libmysql_drv.so

Comme nous avons décidé d'utiliser une connexion smtp à Postfix pour délivrer les messages il est nécessaire de commenter toutes les lignes contenant “TrustedDeliveryAgent”.
On ajoutera ensuite les lignes suivantes pour spécifier à DSPAM de délivrer les mails via SMTP à Postfix sur le port que l'on a défini plus tôt:

DeliveryHost        127.0.0.1
DeliveryPort        25001
DeliveryIdent       localhost
DeliveryProto       SMTP

Il faudra ensuite ajouter celles-ci, afin que DSPAM utilise les mails envoyer aux adresses commençant par spam- et notspam- pour apprendre:

ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse full

Attention cependant, si vous envoyez les mails spam- et notspam- depuis le serveur mail lui même, il est possible que ce dernier n'utilise pas le protocole SMTP et donc que les mails ne soit pas passés à DSPAM. Dans ce cas vous devriez considérer l'apprentissage par la ligne de commande dspam.

Ajoutons l'option qui définie que tout les mails seront scannés par DSPAM par défaut:

Opt out

Ainsi que les suivantes, afin de passer les mails par ClamAV (Anti-virus)

ClamAVPort      3310
ClamAVHost      127.0.0.1
ClamAVResponse  reject

Puis quelques options qui définissent entre autres sur quel port le serveur DSPAM écoute:

ServerPort             25000
ServerQueueSize        32
ServerPID              /var/run/dspam/dspam.pid
ServerMode             standard
ServerParameters        "--deliver=innocent -d %u"
ServerIdent             "localhost.localdomain"

Préférences

On va maintenant définir les préférences par défaut qui s'appliqueront à tous les utilisateurs sans préférences.

# dspam_admin ch pref default enableBNR on
# dspam_admin ch pref default enableWithelist on
# dspam_admin ch pref default showFactors off
# dspam_admin ch pref default signatureLocation headers
# dspam_admin ch pref default spamAction deliver
# dspam_admin ch pref default trainingMode teft

La configuration de DSPAM étant terminée, on peu maintenant relancer le démon:

# /etc/init.d/dspam restart

ClamAV

L'installation de base de ClamAV est presque déjà suffisante pour nous. Le fichier de configuration clamd.conf se situe dans /etc/clamav/.

clamd.conf

Nous allons configurer ClamAV de sorte à ce qu'il accepte les connexions TCP afin que DSPAM puisse l'utiliser pour les mails.

TCPSocket 3310
TCPAddr 127.0.0.1

C'est terminé, il ne reste plus qu'a le redémarrer:

# /etc/init.d/clamav-daemon restart

Les bonus

Voici encore quelques petits bonus que l'on peut réaliser avec DSPAM.

L'apprentissage

C'est bien beau d'avoir mis en place un filtre anti-spam, faut il encore qu'il sache ce qu'il faut filtrer.
C'est pourquoi il faut lui apprendre ! Pour ça on a lui soumettre une suite de messages de type HAM et de type SPAM.
Pour ce faire récupérons les copus de mail à l'adresse http://spamassassin.apache.org/publiccorpus/. On les décompresses, ce qui nous donne normalement deux dossiers appelés ham et spam.
On va maintenant créer le dictionnaire d'un utilisateur (si vous avez défini un utilisateur global, c'est avec lui qu'il faut le faire).

# dspam_train globaluser spam ham

Et voila, maintenant DSPAM devrait commencer à filtrer les mails…

Les groupes

En effet avec DSPAM il est possible de créer des groupes d'utilisateurs. Et ces groupes proposent différentes fonctionnalités.
La configuration des groupes se fait dans le fichier /var/spool/dspam/group (pour Debian). Il est prit en compte au démarrage du service DSPAM.

SHARED

Dans ce cas tous les utilisateurs du groupe partage le même dictionnaire et le même alias d'apprentissage de spam/ham.
Cela peut être pratique dans le cas où ces utilisateurs on un comportement similaire du point de vue des spams.

group1:shared:user1,user2,user3

INOCULATION

Cette fois ci les utilisateurs ont tous chacun leur propre dictionnaire et alias. Cependant lorsqu'un utilisateur rapporte un spam sur son alias, il est automatiquement soumis aux dictionnaires des membres du groupe. Ce qui permet d'entretenir les dicos.

group2:inoculation:user4,user5,user6

CLASSIFICATION

Ce groupe permet aux membres de partager leurs dictionnaires personnels entre eux. Si DSPAM n'est pas sur de lui pour la classification d'un mail il va le soumettre aux dictionnaires des autre membres et si l'un d'eux le classe SPAM il est alors considéré comme tel.

group2:classification:user4,user5,user6

GLOBAL

Il est dérivé du précèdent. Sauf que la on ne consulte que le dictionnaire d'un seul et unique utilisateur virtuel (qui doit être entraîné). Le dictionnaire est consulté tant que l'utilisateur concerné n'a pas atteind le stade des 1000 ham ou des 250 spam.

groupname:classification:*globaluser

“groupname” est le nom de l'utilisateur virtuel.

MERGED

Encore une fois proche du précèdent. Dans ce cas le dictionnaire de l'utilisateur virutel et de l'utilisateur réel sont considérés comme un seul dico. DSPAM utilise donc un dico de référence + un dico spécifique à l'utilisateur.

groupname:merged:*
groupname:merged:user1,user2,userN
 
tutoriaux/postfix_dspam_clamav.txt · Dernière modification: 2009/06/02 23:11 (édition externe)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki