Serveur mail avec Postfix et Dovecot

Après plusieurs obstacles et prise de tête, j'ai enfin réussi à monter mon serveur mail.
J'écrit ce billet dans le but d'un mémo pour une future installation, et par la même occasion si cela peut servir à quelqu'un ...
Je ne suis pas un expert en informatique, ce qui veut dire que mon article comporte peut-être quelques inexactitudes et quelques fautes d'orthographe :) . Mais d'après mes logs, je ne vois rien de choquant.

Si vous avez des suggestions d'améliorations ou quelques rectifications, je suis preneur ...

Voici le fonctionnement de mon serveur mail.

J'utilise Postfix couplé à Dovecot pour émettre des mails depuis un réseau différent, grâce à une connexion SASL.
Le serveur imap et pop est fournie par dovecot pour la consultation des mails.
Les comptes sont ceux du serveur, connexion pam.
Lors de la réception d'un mail, Spamassassin est appelé pour la détection de spam, puis le mail est filtré par l'implémentation sieve de dovecot, pour être redirigé dans le bon dossier correspondant.
Le tous est sécurisé par un chiffrement TLS.

Mon Serveur est sous Debian Stable (Squeeze)
- Postfix 2.7.1
- Dovecot 2.0.16
- Spamassassin 3.3.1
- Pigeonhole 0.2.5 (sieve)

------------------------

Installation de Postfix

Sendmail sera remplacer par postfix donc:

?View Code BASH
mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
mv /usr/bin/newaliases /usr/bin/newaliases.OFF
mv /usr/bin/mailq /usr/bin/mailq.OFF
chmod 755 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF /usr/bin/mailq.OFF
#On supprime les fichiers de configuration ..
apt-get --purge remove sendmail-base sendmail-cf sendmail-doc

Voici les fichiers de configuration Postfix.

  • /etc/postfix/main.cf

#############################################################
#PARAMETRE GENERAUX
##########################
#Fichier de redirection des mails
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
#Bannière affichée lors de la connexion SMTP sur le port 25
smtpd_banner = $myhostname ESMTP $mail_name
#Notification en cas de réception de nouveaux e-mails dans la console
biff = no
#Traite de facon homogène les différentes formes de nom de la machine
append_dot_mydomain = no
#Determine le nom de domaine des mails envoyé
myhostname = malangot.fr
#indique le domaine qui apparaît dans le courrier envoyé à partir de cette machine
myorigin = $myhostname
#Determine les domaines que postfix acceptera en reception - Inutile car virtual_mailbox_domains
mydestination = malangot.fr, localhost
#Reseaux autorisé pour relayer le courrier sans connexion SASL
mynetworks = 127.0.0.0/8
#Séparateur entre le nom d'utilisateur et les extensions d'adresse
recipient_delimiter = +
#Liste les interfaces reseau à écouter
inet_interfaces = all
#Limite de la taille maximum d'un message
message_size_limit = 15000000
#Limite de taille pour les boîtes aux lettres
mailbox_size_limit = 50000000
#Activation de SASL dans Postfix
smtpd_sasl_auth_enable = yes
#Parametre pour les client M$ qui ont un comportement non-standard
broken_sasl_auth_clients = yes
#Ajoute le login SASL dans l'en-tête Received:
smtpd_sasl_authenticated_header = yes
#Autorise les connexions depuis le réseau sûr seulement
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, sleep 1, reject_unauth_pipelining
#Ne pas communiquer avec les systèmes qui ne connaissent pas leur propre nom de machine
smtpd_helo_restrictions = reject_invalid_helo_hostname
#Ne pas accepter de courrier des domaines qui n'existent pas
smtpd_sender_restrictions = reject_unlisted_sender, reject_unknown_sender_domain, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender
#les clients locaux peuvent indiquer n'importe quelle destination, pas les autres
smtpd_recipient_restrictions = reject_unlisted_recipient, reject_unknown_recipient_domain, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination
#indique quels protocoles Postfix doit utiliser pour établir ou accepter des connexions réseau
inet_protocols = ipv4
##############################################################
#INTEGRATION DE TLS
##########################
#clef et certificat pour TLS
smtpd_tls_key_file = /etc/postfix/mailserver.pem
smtpd_tls_cert_file = /etc/postfix/mailserver.pem
#N'oblige pas au client smtp d'envoyer les donner en TLS - Permet de pouvoir recevoir les mails qui ne sont pas envoyer en TLS :)
smtpd_tls_security_level = may
#Rajoute un header dans le mail pour indiquer que la session smtp c'est faite en TLS
smtpd_tls_received_header = yes
#Durée d'une session maximal TLS
smtpd_tls_session_cache_timeout = 3600s
#Utilise une source de nombres aleatoires pour generer les clef
tls_random_source = dev:/dev/urandom
#affiche les log des transaction TLS
smtp_tls_loglevel = 1
#Interdit les client de se connecter au compte smtp sans chiffrement TLS
smtpd_tls_auth_only = yes
################################################################
#INTEGRATION DE DOVECOT
########################
#Utilisation du LDA de Dovecot
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"
dovecot_destination_recipient_limit = 1
virtual_transport = dovecot
#Indication de quel type d'authentification nous utilisons
smtpd_sasl_type = dovecot
#Specifie le chemin du socket d'authentification
smtpd_sasl_path = private/auth

Création des clefs et certificats

?View Code BASH
openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/mailserver.pem -keyout /etc/postfix/mailserver.pem
chmod 600 /etc/postfix/mailserver.pem

------------------------

Installation de Spamassassin

?View Code BASH
apt-get install spamassassin spamc
groupadd spamd
useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
mkdir /var/log/spamassassin
chown spamd:spamd /var/log/spamassassin
  • /etc/default/spamassassin

ENABLED=1
OPTIONS="--create-prefs --max-children 5 --username spamd -H ${SAHOME} -s ${SAHOME}spamd.log"
SAHOME="/var/log/spamassassin/"
...

------------------------
En ce qui concerne Dovecot, j'ai choisi d'installer Dovecot 2.0 au lieu de conserver Dovecot 1.2 proposé par debian. Pour une raison simple, c'est que je n'est pas réussi à faire fonctionner la version 1.2.
Les clients mails n'arrivais pas à établir une connexion imap ou pop ...

Installation de Dovecot et Sieve

il faut au préalable avoir le paquet libpam0g pour compiler la gestion des connexion de type pam.

?View Code BASH
adduser --system --group --home /usr/lib/dovecot --gecos "Dovecot mail server" --disabled-password --quiet dovecot
adduser --system --home /nonexistent --gecos "Dovecot login user"  --disabled-password --quiet dove null
cd ~
mkdir dovecot
cd dovecot
wget http://www.dovecot.org/releases/2.0/dovecot-2.0.16.tar.gz
wget http://www.rename-it.nl/dovecot/2.0/dovecot-2.0-pigeonhole-0.2.5.tar.gz
tar xvzf dovecot-2.0.16.tar.gz
tar xvzf dovecot-2.0-pigeonhole-0.2.5.tar.gz
cd dovecot-2.0.16
./configure --prefix=/usr/ --sysconfdir=/etc/ --with-mysql --libexecdir=/usr/lib/ --localstatedir=/var --with-moduledir=/usr/lib/dovecot/modules --disable-rpath --disable-static --with-ssl=openssl
make
make install
cd ../dovecot-2.0-pigeonhole-0.2.5
./configure --with-dovecot=/usr/lib/dovecot/ --prefix=/usr/ --sysconfdir=/etc/ --libexecdir=/usr/lib/ --disable-static
make
make install
#Etablissement des fichiers de configuration
cp /usr/share/doc/dovecot/example-config/conf.d/* /etc/dovecot/conf.d/
  • /etc/dovecot/dovecot.conf

!include /etc/dovecot/conf.d/*.conf</pre>
protocols = imap pop
passdb {
driver = pam
args = dovecot
}

  • /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext

  • /etc/dovecot/10-master.conf

service auth {
unix_listener /var/spool/postfix/private/auth {
group = mail
mode = 0660
user = postfix
}
inet_listener {
port = 12345
}
}

  • /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert = ‹/etc/postfix/mailserver.pem
ssl_key = ‹/etc/postfix/mailserver.pem

  • /etc/dovecot/conf.d/15-lda.conf

lda_mailbox_autocreate = yes
mail_location = maildir:~/Maildir
protocol lda {
log_path =
info_log_path =
mail_plugins = sieve
}

  • /etc/dovecot/conf.d/90-sieve.conf

plugin {
sieve = ~/.dovecot.sieve
sieve_dir = ~/sieve

  • /etc/postfix/master.cf

smtp inet n - - - 5 smtpd
-o content_filter=spamassassin
#Pouvoir accéder au serveur sur un port autre que 25, bloqué par certain FAI
submission inet n - - - - smtp
-o content_filter=spamassassin
...

...
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}
...

...
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e
/usr/sbin/sendmail -oi -f ${sender} ${recipient}

Il nous reste l'édition du filtre sieve :)
Dans la configuration de dovecot, j'ai spécifié l'emplacement de ce fichier dans "~/.dovecot.sieve"
Donc je crée un filtre par utilisateur, que je placerai dans son dossier personnel.

Au lieu de dévoiler le contenu du fichier qui ne sera pas très utile. je vais vous présenter les commandes que j'utilise.
Cela pourrai se passer de commentaire ;)

require ["fileinto"];
#Si le mail est supérieur a 100k, le placer dans le dossier VOLUMINEUX
if size :o ver 100K {
fileinto "INBOX.VOLUMINEUX";
}
#Si l'object du mail contient "Score =", le placer dans le dossier SPAM
if header :contains "Subject" "Score =" {
fileinto "INBOX.SPAM";
}

------------------------

Et voilà, l'installation s'achève.

Liens :

Postfix : http://www.postfix.org/

Dovecot : http://dovecot.org/

Pigeonhole : http://pigeonhole.dovecot.org/

Spamassassin : http://spamassassin.apache.org/

Vus : 4783
Publié par Malangot : 14