Debian Squeeze : installation de Postfix/Dovecot/Spamassassin

Le but est d'installer sur une machine sous Squeeze le serveur IMAP Dovecot avec livraison via postfix et vérification antispam par Spamassassin, le tout pour des utilisateurs locaux (pas des utilisateurs virtuels). De plus nous utilisons le SASL fourni avec Dovecot pour authentifier les connexions SMTP.

Configuration de Dovecot

Configuration de SpamAssassin

Définir l'agent de livraison pour dovecot

La livraison des mails s'effectue au travers du script /usr/local/sbin/deliver.run (téléchargeable ici). Le principe est de vérifier la présence du répertoire ~/.spamassassin, et si ce dernier existe envoyer le courrier pour traitement au client spamc. Une fois l'éventuel traitement par spamc terminé, le courrier sera livré à Dovecot. Le script est question est le suivant :

#!/bin/sh

EX_TEMPFAIL=75

# Tools
DELIVER="/usr/lib/dovecot/deliver"
SPAMC=/usr/bin/spamc

log_and_quit() {
	/usr/bin/logger -s -p mail.warning -t deliver "$*"
	exit $EX_TEMPFAIL
}

[ -x $DELIVER ] || log_and_quit "Missing binary: $DELIVER"

#
# If spamassassin client is available, pipe mail through it
#
if [ -x $SPAMC -a -d $HOME/.spamassassin ] ; then
	umask 077

	OUTPUT="`mktemp /tmp/mailfilter.XXXXXXXXXX`"
	if [ "$?" != 0 ]; then
    		log_and_quit "Unable to create temporary file"
	fi

	# Clean up when done or when aborting.
	trap "rm -f $OUTPUT" EXIT TERM

	# calls spamc
	$SPAMC > $OUTPUT
	return="$?"
	if [ "$return" != 0 ]; then
    		log_and_quit "Temporary SpamAssassin failure (spamc return $return)"
	fi

	$DELIVER < $OUTPUT

#
# If spamassassin client is not available, deliver directly
#
else
	$DELIVER
fi

exit $?

Configuration de Postfix

La configuration de postfix s'effectue avec le /etc/postfix/main.cf. Voici l'extrait correspondant à la livraison locale:

#
# delivery
#
alias_maps = hash:/etc/aliases
local_recipient_maps = hash:/etc/postfix/local_recipients, $alias_maps

mailbox_command = /usr/local/sbin/deliver.run
mailbox_size_limit = 0
local_destination_recipient_limit = 1

Quelques indications:

Concernant l'authentification SASL, il faut définir les services nécessaires (smtp standard, smtps et submission) dans /etc/postfix/master.cf :

smtp      inet  n       -       n       -       -       smtpd
smtps     inet  n       -       n       -       -       smtpd
        -o smtpd_tls_wrappermode=yes
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject
submission inet  n       -       n       -       -       smtpd
        -o smtpd_tls_security_level=encrypt
        -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Toujours pour l'authentification, nous activons le support SSL et les différents réglages nécessaires dans /etc/postfix/main.cf ; on y retouve en particulier l'indication d'utiliser le SASL de dovecot (paramètres smtpd_sasl_type et smtpd_sasl_path), ainsi que l'autorisation des clients authentifiés dans smtpd_recipient_restrictions :

#
# smtpd server
#

# get ready for tls
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_tls_key_file = /etc/postfix/ssl/petole.demisel.net.key.pem
smtpd_tls_cert_file = /etc/postfix/ssl/petole.demisel.net.crt.pem
smtpd_tls_session_cache_timeout = 3600s

# Enforce the use of helo/ehlo, used in restrictions below
smtpd_helo_required = yes

# auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain = $myhostname
smtpd_tls_auth_only = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes

# restrictions at smtp time. order is important
# - accept everything from localnetwork
# - reject mail to unknown recipients (local or relayed)
# - reject badly formatted messages
# - reject unknown sources (dns)
# - reject clients blacklisted by SpamHaus
# - accept the rest

smtpd_recipient_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_destination
        reject_non_fqdn_sender
        reject_non_fqdn_recipient
        reject_invalid_helo_hostname
        reject_unlisted_recipient
        reject_unlisted_sender
        reject_non_fqdn_helo_hostname
        check_client_access hash:/etc/postfix/access
        reject_rbl_client zen.spamhaus.org
        reject_rbl_client bl.spamcop.net

Filtrage sieve

Le plugin sieve intégré à l'outil deliver (si activé dans la configuration globale) permet de ranger automatiquement les courriels entrants dans les boites. Pour ceci, il suffit que l'utilisateur écrive son fichier de règles ~/.dovecot.sieve, dont voici un exemple (téléchargeable ici) fonctionnel pour notre configuration, en particulier pour le filtrage des spams au début :

# -*- mode: sieve -*-

require [ "fileinto", "regex" ];


#
# Catch Junk mail, stop processing
#
if header :regex "X-Spam-Status" "^YES"
{
    fileinto "Junk";
    stop;
}


#
# Mailing-lists
# Deliveries are not terminal, to handle crossposts
#

if anyof (header :contains "List-Id" "httpd.apache.org",
          header :contains [ "To", "Cc" ] "httpd.apache.org")
{
        fileinto "list.apache";
}

if header :contains "List-Id" "debian-user-french.lists.debian.org"
{
    fileinto "list.debian-french";
}

if header :contains "List-Id" [
    "debian-announce.lists.debian.org",
    "debian-news.lists.debian.org",
    "debian-security-announce.lists.debian.org",
    "debian-volatile-announce.lists.debian.org",
    "debian-user.lists.debian.org"
    ]
{
    fileinto "list.debian";
}

if header :contains "List-Id" "dovecot"
{
    fileinto "list.dovecot";
}

if header :contains "List-Post" "mutt"
{
    fileinto "list.mutt";
}

if header :contains "List-Post" "postfix-users@postfix.org"
{
    fileinto "list.postfix";
}

if header :contains "List-Id" "spamassassin.apache.org"
{
    fileinto "list.spamassassin";
}


Entrainement de Spamassassin avec mutt

Mutt permet facilement d'entrainer la base bayésienne de Spamassassin, via la définition de macros. L'exemple ci-dessous permet d'indiquer à mutt de 


Dernière modification : Friday October 12, 2012, Nicolas KOWALSKI


Valid HTML 4.0! Valid CSS!