Filtres côté serveur

Un article de Casys (Canadian Sysadmins).

Sommaire

Introduction

De nos jours l'utilisation du courriel n'est plus cantonné à un seul client : on les lit au bureau sur un client lourd, en voyage via un webmail et dans le train sur son Blackberry.

Dans ce contexte les filtres mail côté client sont devenus une aberration.

Dans cet article nous allons expliquer comment mettre en place les filtres mails côté serveur grâce à la technologie Sieve.

Technologies utilisées

  • Serveur de courriel Dovecot
  • Filtres Sieve
  • Serveur managesieve PySieved
  • Webmail squirrelmail
  • Plugin Avelsieve

Paramètrage de Dovecot

Je ne m'attarderais pas ici sur l'installation de Dovecot qui est assez triviale (apt-get install dovecot) et bien expliquée ailleurs.

Il est important de noter une chose avant de commencer : les filtres sieve ne marcheront que si vous utilisez Dovecot comme LDA (Local Delivery Agent). C'est à dire que si vous utilisez Postfix (par exemple) pour délivrer les courriels, ceux-ci ne seront pas filtrés.

Tout d'abord nous allons activer sieve dans Dovecot. Pour se faire il faut modifier le configuration de la partie LDA de Dovecot.

Dans la section

 protocol lda {
 }

Ajouter la ligne suivant :

 mail_plugins = cmusieve

Afin que notre démon managesieve (Pysieved) puisse communiquer avec notre dovecot il nous faut activer les socket master et client de la facon suivante :

Dans la section

 auth default {
 }

Décommentez et ajustez les parties suivantes :

 socket listen {
   master {
     # Master socket is typically used to give Dovecot's local delivery
     # agent access to userdb so it can find mailbox locations. It can
     # however also be used to disturb regular user authentications.
     # WARNING: Giving untrusted users access to master socket may be a 
     # security risk, don't give too wide permissions to it!
     path = /var/run/dovecot/auth-master
     mode = 0600
     # Default user/group is the one who started dovecot-auth (root)
     #user = 
     #group = 
   }
   client {
     # The client socket is generally safe to export to everyone. Typical use
     # is to export it to your SMTP server so it can do SMTP AUTH lookups
     # using it.
     # Ici j'utilise cette socket pour authentifier mes user virtuels dans postfix
     # Ceci explique l'emplacement et les droits sur cette socket. Vous pouvez
     # le mettre ailleurs.
     path = /var/spool/postfix/private/auth
     mode = 0660
     user = postfix
     group = postfix
   }
 }

Vous pouvez maintenant redémarrer Dovecot et vérifier qu'il fonctionne correctement. Si ce n'est pas le cas vérifiez que les permisions sont correctes pour que dovecot écrive ses socket.

Installation et paramétrage de pysieved

Installation et paramètrage

La première chose à faire est de récupérer pySieved ici puisqu'il n'est malheureusement pas packagé.

Ensuite il faut le décompresser et nous allons le mettre dans /opt/pysieved.

Enfin nous allons éditer sa configuration pour l'ajuster à notre environnement. Ouvrez donc le fichier pysieved.ini

Ajustez d'abord les paramètres suivants :

 # Authentication back-end to use
 auth    = Dovecot
 # User DB back-end to use
 userdb  = Dovecot
 # Storage back-end to use
 storage = Dovecot

On souhaite utiliser Dovecot dans les trois cas.

Ensuite rendez-vous à la section [Dovecot] puisque c'est la seule que nous allons utiliser. Modifiez les paramètre pour obtenir ce qui suit :

[Dovecot]
# Path to Dovecot's auth socket (do not set unless you're using Dovecot auth)
mux = /var/spool/postfix/private/auth

# Path to Dovecot's master socket (if using Dovecot userdb lookup)
master = /var/run/dovecot/auth-master

# Path to sievec
sievec = /usr/libexec/dovecot/sievec

# Where in user directory to store scripts
scripts = .pysieved

# Filename used for the active SIEVE filter (see README.Dovecot)
active = .dovecot.sieve

# What user/group owns the mail storage (-1 to never setuid/setgid)
uid = -1
gid = -1

mux et master sont les deux socket que nous avons définies précedemment. Sievec est l'emplacement du binaire sievec de Dovecot (ceci peut varier suivant la distribution) active est le nom du fichier où Dovecot va chercher les règles sieve pour chaque utilisateur (ceci est relatif au mail_home de l'utilisateur)

Il peut être intéressant de faire tourner pysieved en tant qu'usager restreint (comme postfix par exemple) cependant il faut garder à l'esprit qu'il faut qu'il puisse accéder à l'ensemble des mail_home des utilisateurs.

Au moment où vous voudrez tester pysieved je vous conseille de le lancer avec la commade suivant pour pouvoir débugger :

 ./pysieved -c pysieved.ini -d

Script d'init

Pysieved ne vient pas avec un script d'init. Nous allons donc en créer un :

Ouvrez /etc/init.d/pysieved et collez-y ceci :

#!/bin/bash
# Antoine Reversat, 2008-10-20
# Script to stop and start pySieved managesieve server

PIDFILE=/var/run/pysieved.pid
PYS_HOME=/opt/pysieved

if [ $# -ne 1 ]
then
        echo "usage : pysieved stop|start|restart"
        exit 1
fi

case $1 in
        "start")
                echo -n "Starting ManageSieve server pysieved... "
                python ${PYS_HOME}/pysieved.py -c ${PYS_HOME}/pysieved.ini
                if [ $? -eq 0 ]
                then
                        echo "[OK]"
                else
                        echo "[Failed]"
                fi
                ;;
        "stop")
                echo -n "Stopping ManageSieve server pysieved..."
                kill `cat $PIDFILE`
                ps -p `cat /var/run/pysieved.pid` | grep -v PID | grep python
                if [ $? -ne 0 ]
                then
                  echo "[OK]"
                else
                  echo "[Failed]"
                fi
                ;;
        "restart")
                $0 stop
                sleep 1
                $0 start
                ;;
        "*")
                echo "Usage : pysieved stop|start|restart"
                exit 1
                ;;
esac

Installation et paramètrage de avelsieve

Afin de permettre à nos utilisateurs de gérer leurs filtres nous allons installer le plugin avelsieve pour Squirrelmail. Il existe d'autre plugins pour les autres Webmail (Ingo pour IMP/Horde par exemple).

Tout d'abord récupérez le plugin avelsieve ici

Ensuite décompressez le et déplacez le dans le répertoire de plugins de squirrelmail (sous-répertoire plugins dans la racine de squirrelmail)

Allez dans le sou-répertoire config d'avelsieve.

Copiez config_sample.php en config.php. Ce fichier est correct tel quel, il n'y a pas besoin de l'éditer.

Rendez-vous dans le sous répertoire config de la racine de squirrelmail. Lancez-y la commande conf.pl

 perl conf.pl

Choisissez

 8. Plugins

Puis tapez le numéro du plugin avelsieve dans les "available plugins"

Enfin tapez S pour sauvegarder puis Q pour quitter.

Maintenant dans les options de squirrelmail vous avez un lien filtre côté serveur. Vous pouvez-vous y rendre en ayant pySieved démarré en mode debug pour voir si tout fonctionne. Si c'est le cas vous n'avez plus qu'à démmarer pySieved avec /etc/init.d/pysieved start

Vous avez maintenant un système de script côté serveur fonctionnel.

Remarques

Je recherche toujours un client lourd supportant correctement managesieve et les scripts sieve. Evolution n'a rien, Kmail à un embryon de truc mais il faut écrire son script à la main et les autres je ne les connais pas (mais je ne crois pas que Thunderbird ait quoi que ce soit). Si vous en connaissez n'hésitez pas à m'en parler : a.reversat@gmail.com

EDIT: il y a un plugin Sieve pour Thunderbird lien
EDIT: Kmail 1.9.9 : correction du bug TLS

Il est possible avec Dovecot de combiner filtres globaux (appliqués à tous les comptes) et filtres locaux (par compte).

Pour activer un filtre global voici ce qu'il faut faire :

Dans la section

 protocol lda {
 }

Ajoutez la ligne :

 sieve_global_path = /var/sieve/global

Où /var/sieve/global est le script global (et non un répertoire contenant le script).

Par exemple pour mettre les mails tagués comme spam dams le sous-répertoire spam de l'utilisateur, votre script /var/sieve/global doit contenir :

 require "fileinto";
 if header :contains ["X-Spam-Flag"] ["YES"] {
   fileinto "INBOX.SPAM";
 }