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.
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.
# aptitude install postfix postfix-pcre dspam libdspam7-drv-mysql clamav
Choisissez la configuration qui convient à votre cas…
La première chose à faire est de s'occuper de Postfix…
Deux possibilités différentes s'offrent à nous:
La configuration de Postfix se fait dans plusieurs fichiers (deux principalement).
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
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:
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.
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.
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.
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
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.
La configuration de DSPAM se fait principalement dans le fichier dspam.conf situé dans /etc/dspam/
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"
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
L'installation de base de ClamAV est presque déjà suffisante pour nous. Le fichier de configuration clamd.conf se situe dans /etc/clamav/.
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
Voici encore quelques petits bonus que l'on peut réaliser avec DSPAM.
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…
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.
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
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
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
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.
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