2008/05/15

Solution antispam perso

Comment gérer ses mails sur son propre serveur freebsd et ainsi pouvoir y accéder comme on veut, filtrer ses spam, passer un coup d'antivirus etc. C'est un sujet largement abordé partout, mais voila j'ai quand même envie de vous présenter ma solution.

Les technologies :

Installation des différents composants

installation de postfix

#make -C /usr/ports/mail/postfix config

Dans mon cas j'ai choisit les options suivantes :

puis :

#make -C /usr/ports/mail/postfix install clean

Accepter l'activation de postfix dans mailer.conf pour que postfix soit le mta par défaut en lieu et place du sendmail embarqué par défaut dans FreeBSD

installation de dovecot

#make -C /usr/ports/mail/dovecot config

J'ai choisit les options suivantes :

puis :

#make -C /usr/ports/mail/dovecot install clean

installation de dovecot-sieve

#make -C /usr/ports/mail/dovecot-sieve install clean

Installation de postgresql

#make -C /usr/ports/databases/postgresql82-server config

J'ai choisit les options suivantes :

puis :

#make -C /usr/ports/databases/postgresql82-server install clean

Installation de clamav

#make -C /usr/ports/security/clamav config

Je n'ai personnellement mis aucunes options.

#make -C /usr/ports/security/clamav install clean

installation de dspam

#make -C /usr/ports/mail/dspam config

J'ai choisit les options suivantes :

CGI et LIGHTTPD serveur a l'utilisation de l'interface web que je ne décrirais pas dans ce post.

#make -C /usr/ports/mail/dspam install clean

Installation de dovecot-antispam

#make -C /usr/ports/mail/dovecot-antispam config

J'ai choisit les options suivantes :

puis :

#make -C /usr/ports/mail/dovecot-antispam install clean

Installation de fdm

#make -C /usr/ports/mail/fdm install clean

Configuration des différents composants

Configuration de postfix

Relay des mails en fonction du sender

Ici nous allons dire à postfix de relayer les mails en fonction de l'adresse mail du sender de manière a envoyer les mails gmail via le smtp de gmail, free via le smtp de free et ainsi de suite, bien entendu d'effectuer l'authentification si nécessaire Dans le main.cf rajouter ceci

sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/sender_relay
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps              = hash:/usr/local/etc/postfix/smtp_passwords
smtp_sasl_security_options           = noanonymous
smtp_sasl_tls_security_options       = noanonymous
smtp_sender_dependent_authentication = yes
smtp_tls_per_site = hash:/usr/local/etc/postfix/tls_per_site

Il faut donc créer /usr/local/etc/postfix/sender_relay dans lequel on retrouve la liste des serveur smtp vers lesquels relayé les mails envoyé depuis une adresse donnée :

user@free.fr smtp.free.fr
user@gmail.com smtp.gmail.com:587
...

Une fois le fichier renseigné :

#postmap /usr/local/etc/postfix/sender_relay

ensuite il faut créer le fichier suivant : /usr/local/etc/postfix/smtp_passwords qui va servir à l'authentification sur les serveur smtp décrit dans le fichier précédent

user@free.fr user:password
user@gmail.com user:password

de même

#postmap /usr/local/etc/postfix/smtp_passwords

Pour finir le fichier suivant doit aussi être créé : /usr/local/etc/postfix/tlspersite, il va servir à définir si le serveur nécessite l'utilisation du TLS. Seul les serveurs smtps doivent être listés dedans :

smtp.gmail.com MAY

et toujours

#postmap /usr/local/etc/postfix/smtp_passwords

Activation du relay lmtp vers dspam

Il existe plusieurs méthode pour relayé les mails reçu par postfix à dspam, mais le ltmp me semble la plus simple. Pour l'activer il suffit simplement de rajouter

mailbox_transport = lmtp:unix:/var/run/dspam.sock

Dans main.cf

Voila maintenant le MTA est configurer.

Je vous laisse le soin de configurer selon les méthode habituelle le reste des options de postfix : authentification, tls, etc.

Configuration de dspam

Préparation de la base PostgreSQL :

ici tout ce fait en user pgsql

#su - pgsql

création de la base dspam :

#createdb dspam

Il faut que la base support le language plpgsql donc :

#createlang plpgsql dspam

Ensuite il faut créé le contenu de la base dspam en utilisant le fichier /usr/local/share/examples/dspam/pgsql/pgsql_objects.sql Attention ce fichier m'a posé un problème : ligne 58 il faut ajouter */ à la fin puis

#psql dspam < /usr/local/share/examples/dspam/pgsql/pgsql_objects.sql

création de l'utilisateur dspam (sans mot de passe puisque la base n'est pas accessible depuis l'extérieur

#createuser --no-adduser --no-createdb dspam

enfin attribution des droits à l'utilisateur dspam

#psql dspam <<EOF
GRANT SELECT,INSERT,UPDATE,DELETE ON
  dspam_preferences,
  dspam_signature_data,
  dspam_stats,
  dspam_token_data
TO dspam;
EOF

Configuration de clamav

Editer le fichier de configuration du daemon clamav /usr/local/etc/clamd.conf qui est très clair et positionner les options qui vous intéressent.

Ajouter le rafraîchissement de la base de donnée clamav à dans la crontab de root :

#crontab -e

rajouter la ligne suivante :

0 0 * * 0 /usr/local/bin/freshclam --quiet

Configuration de dspam.conf

Dans le fichier /usr/local/etc/dspam.conf rajouter le chargement du driver postgresql et la configuration du serveur postgresql

StorageDriver /usr/local/lib/libpgsql_drv.so
PgSQLServer     127.0.0.1
PgSQLPort       5432
PgSQLUser       dspam
#PgSQLPass              dspam
PgSQLDb         dspam

Pas besoin du mot de passe puisque nous n'en avons pas mis pour l'utilisateur dspam

Configurer le LDA (celui de dovecot) pour la distribution des tous les mails reçu par dspam, que ce soient des spam ou pas :

TrustedDeliveryAgent  "/usr/local/libexec/dovecot/deliver -d bapt"
UnTrustedDeliveryAgent  "/usr/local/libexec/dovecot/deliver -d bapt"

je précise -d bapt car je n'ai qu'un seul utilisateur et que je souhaite que l'intégralité de mail qui passe par dspam soit délivré à cette utilisateur, quelque soit le destinataire. pour être plus générique, ce rapporter à la doc dspam.

Rajouter votre utilisateur en tant que utilisateur de confiance (pouvant utiliser le binaire dspam) afin que le plugin dovecot-antispam fonctionne correctement :

Trust bapt

Le plugin dovecot antispam peut fonctionner de deux manière : par l'utilisation du binaire dspam --client ou par l'envoie d'un mail à dspam, dans le second cas, il n'est pas nécessaire de rajouter l'utilisateur système.

Passer le mode d'entraînement de dspam à TEFT :

TrainingMode teft

Je n'aime pas avoir le mot SPAM qui apparaît dans le sujet du mail, je préfère que que ce soit dans les headers, donc :

Preference "signatureLocation=headers"
Preference "showFactors=on"
Preference "spamAction=deliver"
#Preference "spamSubject=SPAM"

Configurer l'utilisation de clamav :

ClamAVPort      3310
ClamAVHost      127.0.0.1
ClamAVResponse accept

passer en mode serveur automatique pour que le daemon choisisse le mode le plus approprié en fonction des appels qui lui sont fait :

ServerMode auto

Configurer les paramètre du serveur, cad les options qui aurait été passé au client en ligne de commande si on avait utilisé ce biais là plutôt que de passer par le LMTP

ServerParameters        "--deliver=innocent --user bapt -d %u"

Encore une fois je force le user bapt pour que tous les mails rentrant soit traité comme étant pour le user bapt et non que le nom de l'utilisateur soit autodéterminé. Pour être plus générique, se référer à la doc dspam.

la socket serveur ainsi que la socket client (qui sont la même dans notre cas):

ServerDomainSocketPath  "/var/run/dspam.sock"
ClientHost      /var/run/dspam.sock

Attention le chemin "/var/run/dspam.sock doit être identique au chemin que nous avons donné à postfix précédemment.

voila dspam est maintenant configurer.

Configuration de dovecot

Activation les protocoles IMAP et IMAPS : Dans /usr/local/etc/dovecot.conf, ajouter :

protocols = imap imaps

On désactive l'authentification plaintext pour tout ce qui n'est pas localhost :

disable_plaintext_auth = yes

On active le SSL :

ssl_disable = no
ssl_cert_file = /etc/ssl/dovecot-key.pem
ssl_key_file = /etc/ssl/dovecot-key.pem

On définit l'emplacement du maildir :

default_mail_env = maildir:%h/.maildir

On active le plugin antispam dans la section imap :

protocol imap {
   ...
   mail_plugins = antispam
   mail_plugin_dir = /usr/local/lib/dovecot/imap
   ...
}

On active dovecot-sieve dans la section lda

protocol lda {
   ...
   mail_plugins = cmusieve
   mail_plugin_dir = /usr/local/lib/dovecot/lda
   ...
}

On configure le plugin antispam

plugin {
   ...
   antispam_spam = spam
   antispam_dspam_binary = /usr/local/bin/dspam
   antispam_dspam_args = --user;%u
   ...
}

Ainsi quand un mail est placé dans le dossier spam dspam l'apprend comme étant un spam et inversement si le mail en déplacé du dossier spam vers un autre, dspam l'apprend comme ham.

Finition en tant qu'utilisateur

Configuration de fdm

Rappatriement des mails

Dans le fichier $HOME/.fdm.conf :

set unmatched-mail keep
action "monsmtp" smtp server "localhost" to "bapt"
account "free" pop3 server "pop.free.fr" user "user" pass "passwd"
account "gmail" imaps server "imap.gmail.com" user "user" pass "passwd" folder "INBOX" # ou account "gmail" pop3s server "imap.gmail.com" user "user" pass "passwd"
match accounts {"free" "gmail"} action "monsmtp"
Nettoyage des spam vieux de plus de 1 jours et idem pour la corbeille

Dans le fichier $HOME/.fdm.conf

account "spam" maildir "%h/.maildir/.spam"
account "Trash" maildir "%h/.maildir/.Trash"
match accounts {"spam" "Trash"} and age &gt; 1 days  action drop

(J'utilise la même méthode pour nettoyer les dossiers correspondant aux mailing lists mais je conserver les mails 7 jours) A partir de dovecot 1.1 cette méthode ne sera plus nécessaire car dovecot inclue un nouveau plugin permettant l'expiration des mails. fdm est capable de faire beaucoup plus mais dans notre cas, tout le reste du filtrage est effectué par dovecot-sieve

Configuration de sieve pour trier les spam

dans le fichier $HOME/.dovecot.sieve

require "fileinto";
...
if header :contains "X-DSPAM-Result" "Spam" {

    fileinto "spam";
    stop;
}
...

Il est possible de faire du filtrage très fin de mail via sieve, internet regorge de documentation là dessus.

Démarrer le tout

Rajouter dans /etc/rc.conf :

postfix_enable="YES"
dovecot_enable="YES"
postgresql_enable="YES"
clamav_clamd_enable="YES"
dspam_enable="YES"
postgresql_flags="-w -s -m fast"
postgresql_initdb_flags="--encoding=utf-8 --lc-collate=C"
postgresql_class="default"

puis

#/usr/local/etc/rc.d/postfix start
#/usr/local/etc/rc.d/dovecot start
#/usr/local/etc/rc.d/postgresql start
#/usr/local/etc/rc.d/clamav-clamd start
#/usr/local/etc/rc.d/dspam start

Attention postrgesql doit être démarrer pour la configuration du stockage de dspam sur postgresql

Il ne reste plus qu'à activer le rapatriement automatique des mails. Dans la crontab de l'utilisateur :

*/5 * * * * /usr/local/bin/fdm -l fetch

On ajoute enfin un nettoyage quotidien de dspam Dans la crontab de root :

0 0 * * 0 /usr/local/bin/dspam_clean
0 0 * * 0 psql -U dspam dspam < /usr/local/share/examples/dspam/pgsql/purge.sql > /dev/null

Il ne vous reste plus qu'à configurer vos MUA préférés pour l'utilisation de tout ça. pour moi mutt et horde/dimp (pour le web).

Name :
URL (optional) :
Write here: "ETOOMUCHSPAM"
Comments :