logo rss

Le serveur de mails Courier-mta

Préambule

Ce présent document décris l'installation d'un serveur de mail (MTA) courier avec un connecteur IMAP le tout sécurisé avec SSL sur un système d'exploitation de type Debian en version wheezy.

Environnement

  • OS : debian wheezy 7.1
  • courier-mta : 0.68
  • courier-imap : 4.10

Installation

Installation des paquets

root@host:~# apt-get install gamin courier-mta-ssl courier-imap-ssl courier-mta

Note : Gamin est utile pour l'activation de IDLE

Paramétrage

authentification

On spécifie le type d'authentification dans le fichier /etc/courier/authdaemonrc :

authmodulelist="authuserdb"

Ici les informations d'identification seront stockés dans un fichier ".dat" de type BerkeleyDB.

Création de l'utilisateur vmail

Afin d'éviter de créer un compte utilisateur pour chaque compte mail on utilisera un compte générique vmail qui sera « propriétaire » de l'ensemble des comptes mails des utilisateurs. Cela évitera de peupler inutilement le fichier /etc/passwd d'utilisateurs n'ayant pas d'autres vocations que d'utiliser les fonctionnalités mails du serveur.

root@host:~# useradd -u 7200 -m -s /bin/bash vmail
root@host:~# passwd vmail

Ou :

root@host:~# useradd -u 7200 --system -s /bin/bash vmail

On va maintenant créer un dossier dans lequel seront stockés les informations d'identifications de chaque utilisateur pour notre/nos domaine(s).

root@host:~# mkdir /etc/courier/userdb ; chmod 700 /etc/courier/userdb

Création de l'utilisateurs user1

root@host:~# userdb -f /etc/courier/userdb/domain1 user1@domain1 \
  set home=/home/vmail/domain1/user1 uid=7200 gid=7200

Paramétrage du mot de passe

root@host:~# userdbpw -md5 | userdb -f /etc/courier/userdb/domain1 user1@domain1 set systempw
root@host:~# userdbpw -hmac-sha1 | \
  userdb -f /etc/courier/userdb/domain1 user1@domain1 set hmac-sha1pw

Création de notre Maildir

Maintenant nous devons créer le répertoires Maildir de notre utilisateur.
Exemple dans notre partition /data/vmail.

root@host:~# chown vmail:vmail /data/vmail/

Droits sur les dossiers /data/vmail/domain :

  • data : root:root : 755
  • vmail : vmail:vmail : 750
  • domain : vmail:vmail : 755

On se logue en tant qu’utilisateur vmail et on crée le Maildir de notre utilisateur :

root@host:~# su -s /bin/bash – vmail
$ mkdir -p /data/vmail/domain/user1 && maildirmake /data/vmail/domain1/user1/Maildir

Création de la base de données utilisateurs

En premier lieu on s'assure que seul root aura accès au fichier :

root@host:~# chmod 700 /etc/courier/userdb && chmod 600 /etc/courier/userdb/*
root@host:~# makeuserdb

On pourra faire un test d'authentification :

root@host:~# /etc/init.d/courier-authdaemon restart
root@host:~# authtest user1@domain

Les Alias

On peut spécifier des alias en éditant le fichier /etc/courier/aliases/domaine et en le complétant de la sorte :

adresse_initiale@domaine:      adresse_de_redirection@domaine

Une fois modifié on valide la configuration via la commande :

root@host:~# makealiases

Ou :

root@host:~# makealiases -chk

Pour vérifier que tout est ok. /!\ cette commande ne génère pas les aliases

Pour voir les alias actifs :

root@host:~# makealiases -dump

Paramétrage du localdomain et hosteddomains

root@host:~# echo localhost > /etc/courier/locals
root@host:~# echo mon.serveur.domain.com >> /etc/courier/locals

root@host:~# mkdir /etc/courier/hosteddomains
root@host:~# touch /etc/courier/hosteddomains/domain.com
root@host:~# echo domain.com > /etc/courier/hosteddomains/domain.com
root@host:~# makehosteddomains

root@host:~# mkdir /etc/courier/esmtpacceptmailfor.dir/
root@host:~# echo domain.com > /etc/courier/esmtpacceptmailfor.dir/domain.com
root@host:~# makeacceptmailfor

Paramétrage d’une passerelle/relay SMTP

Si l'envoi des mails doit passer par un relay smtp (de son FAI par exemple) on pourra le faire en suivant les instructions suivantes.

/etc/courier/esmtproutes

: smtp.domaine.com

Si le port du relay est différent de TCP:25 :

: smtp.domaine.com,445

Si besoin une authentification est nécessaire on éditera le fichier /etc/courier/esmtpauthclient :

smtp.domaine.com username mdp

Paramétrage du serveur SMTP SSL

/etc/courier/esmtpd

PATH=/usr/bin:/bin:/usr/bin:/usr/local/bin 
SHELL=/bin/bash 
ULIMIT=32768 
BOFHCHECKDNS=1 
BOFHNOEXPN=1 
BOFHNOVRFY=1 
TARPIT=1 
NOADDMSGID=1 
NOADDDATE=0 
ESMTP_LOG_DIALOG=0 
AUTH_REQUIRED=0 
COURIERTLS=/usr/bin/couriertls 
TLS_KX_LIST=ALL 
TLS_COMPRESSION=ALL 
TLS_CERTS=X509 
TLS_CERTFILE=/etc/courier/esmtpd.pem 
TLS_TRUSTCERTS=/etc/ssl/certs 
TLS_VERIFYPEER=NONE 
AILUSER=daemon 
AILGROUP=daemon 
PORT=smtp 
BLACKLISTS="" 
ACCESSFILE=${sysconfdir}/smtpaccess 
AXDAEMONS=100 
AXPERC=10 
AXPERIP=10 
PIDFILE=/var/run/courier/esmtpd.pid 
TCPDOPTS="-noidentlookup -stderrlogger=/usr/sbin/courierlogger" 
ESMTPAUTH="PLAIN LOGIN CRAM-MD5" 
ESMTPAUTH_WEBADMIN="LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256" 
ESMTPAUTH_TLS="PLAIN LOGIN CRAM-MD5" 
ESMTPAUTH_TLS_WEBADMIN="PLAIN LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256" 
ESMTPDSTART=YES

Passer en mode TLSv1

TLS_PROTOCOL="TLS1"
TLS_CIPHER_LIST="TLSv1:HIGH:!LOW:!MEDIUM:!EXP:!NULL:!aNULL@STRENGTH"

Activer l'authentification SMTP

Dans /etc/courier/esmtpd

ESMTPAUTH="LOGIN"

IDLE

source

L'IDLE permet d'avoir l'état en temps réel du dossier mail dans lequel on travaille. Il permet ainsi d'être averti de tout changement (ex réception d'un nouveau mail) de façon instantané (pour peut que l'on dispose d'un client de messagerie compatible).

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
IMAP_USELOCKS=1
IMAP_ENHANCEDIDLE=1

Taille limite des pièces jointes

On créer un fichier /etc/courier/sizelimit et on insère le champ suivant (pour 50M) :

echo "52428800" > /etc/courier/sizelimit

Catch-all

Le catch-all est une adresse qui reçois tous les mails d'un domaine dont le destinataire n'a pas été créé. Par exemple, un mail adressé à inconnu@domaine.com sera reçu dans la boite de réception du catch-all.
Sous courier-mta, le catch-all est l'adresse alias@.

root@host:~# sudo su -s /bin/sh - vmail
root@host:~# echo "./Maildir" >  domain/alias/.courier-default 

imap ssl

Le paramétrage de IMAP SSL se fait dans le fichier /etc/courier/imapd-ssl :

SSLPORT=993 
SSLADDRESS=0 
SSLPIDFILE=/var/run/courier/imapd-ssl.pid 
SSLLOGGEROPTS="-name=imapd-ssl" 
IMAPDSSLSTART=YES 
IMAPDSTARTTLS=YES 
IMAP_TLS_REQUIRED=0 
COURIERTLS=/usr/bin/couriertls 
TLS_KX_LIST=ALL 
TLS_COMPRESSION=ALL 
TLS_CERTS=X509 
TLS_CERTFILE=/etc/courier/imapd.pem 
TLS_TRUSTCERTS=/etc/ssl/certs 
TLS_VERIFYPEER=NONE 
TLS_CACHEFILE=/var/lib/courier/couriersslcache 
TLS_CACHESIZE=524288 
AILDIRPATH=Maildir

Passer en mode TLSv1

TLS_PROTOCOL="TLS1"
TLS_CIPHER_LIST="TLSv1:HIGH:!LOW:!MEDIUM:!EXP:!NULL:!aNULL@STRENGTH"

Créer son propre certificat

openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650  -in server.csr -signkey server.key -out server.crt
openssl dhparam -out dh.param 4096
cat server.key server.crt dh.param > esmtpd.pem
cp esmtpd.pem /etc/courier/
cp esmtpd.pem /etc/courier/imapd.pem
cp server.crt /etc/ssl/certs/
cp server.key /etc/ssl/private/

Utiliser un certificat Let's Encrypt

cat privkey.pem cert.pem chain.pem > /etc/courier/esmtpd.pem
cat privkey.pem cert.pem chain.pem > /etc/courier/imapd.pem

Debug

Test d'envoi de mails en ligne de commande

root@host:~# echo -e "To: user2@domain2\nFrom: user1@domain1" | /usr/sbin/sendmail

Test d'authentification depuis le serveur :

root@host:~# authtest -s imap utilisateur mdp

Tests d'authentification en ligne de commande

POP3

root@host:~# telnet x.x.x.x 110
user USERNAME
pass PASSWORD
stat
quit

IMAP

root@host:~# telnet x.x.x.x 143
a login USERNAME PASSWORD
a examine inbox
a logout

POP3 over SSL

root@host:~# openssl s_client -connect x.x.x.x:995
user USERNAME
pass PASSWORD
stat
quit

IMAP over SSL

root@host:~# openssl s_client -connect x.x.x.x:993
a login USERNAME PASSWORD
a examine inbox
a logout

Tests smtp

Avec S: pour les réponses du serveur et C: pour les commandes client.

Pour tester l'authentification on utilisera l'instruction : auth login et on fournira son login + le mdp encodés en base64.

Test sans authentification

root@host:~# telnet x.x.x.x 25
S: 220 domaine.com SMTP Ready  
C: EHLO domaine.com
S: 250 domaine.com
C: MAIL FROM:<test@domaine.com>

S: 250 OK  
C: RCPT TO:<user1@domaine.com>
C: DATA
S: 354 OK
C: From: <test@domaine.com>
C: To: <test@domaine.com>
C: Subject: Test
C: 
C: Test  
C: .  

S: 250 OK  
C: QUIT  
R: 221 domaine.com closing transmission

Avec authentification

Pour tester SMTP avec authentificaiton on utilisera la commande : auth login lors de l'échange avec le serveur, puis nous donnerons le login et mot de passe au format base64.

root@host:~# echo user@shebangthedolphins.net | base64
dXNlckBzaGViYW5ndGhlZG9scGhpbnMubmV0Cg==
root@host:~# echo P@ssw0rd | base64
UEBzc3cwcmQK
root@host:~# telnet x.x.x.x 25
S: 220 domaine.com SMTP Ready  
C: EHLO domaine.com
S: 250 domaine.com

C: AUTH LOGIN
S: 334 VXNlcm5hbWU6
C: dXNlckBzaGViYW5ndGhlZG9scGhpbnMubmV0Cg==

S: 334 UGFzc3dvcmQ6
C: UEBzc3cwcmQK

S: 235 2.7.0 

C: MAIL FROM:<test@domaine.com>

S: 250 OK  
C: RCPT TO:<user1@domaine.com>

C: DATA

C: Subject: Test
C: Test  
C: .  

S: 250 OK  
C: QUIT  
R: 221 domaine.com closing transmission

Note : Si besoin on pourra sortir du telnet avec la combinaison Ctrl + ], puit taper quit.

Autoriser le relaying de mails

Il est possible d'autoriser le relais de mails, pour se faire il faudra créer un fichier dans (noter le tab très important):

cat /etc/courier/smtpaccess/domaine
IP_autorisé<tab>allow,RELAYCLIENT

On lancera la commande pour intégrer la configuration du relais :

root@host:~# makesmtpaccess
root@host:~# /etc/init.d/courier-mta restart
root@host:~# /etc/init.d/courier-mta-ssl restart

Erreurs rencontrées

Corrupted message

CORRUPTED MESSAGE                                                                                                                   

This is the Courier Mail Server 0.68 on mailserver.

I received the following message for delivery to your address.  This message
contains several internal formatting errors.  This is often caused by
viruses that attempt to infect remote systems.  Instead of blocking
this message, I converted it to a safe, text-only attachment that can be
safely read with a text editor.

This sometimes also happens when the sender's mail software has a bug
that creates improperly-formatted messages.  Although these kinds of
formatting errors may often be ignored by other mail servers, this
server detects and intercepts improperly-coded messages in order to
prevent viruses from taking advantage of bugs in E-mail programs:

-----------------------------------------------------------------------------
This message contains improperly-formatted binary content, or attachment.

See <URL:ftp://ftp.isi.edu/in-notes/rfc2045.txt> for more information.
-----------------------------------------------------------------------------

Résolution : On créer le fichier /etc/courier/bofh et on entre :

opt BOFHBADMIME=accept

Accepter les adresses mails en majuscules :

touch /etc/courier/locallowercase

Utilisateurs bloqués

Si une boîte mail n'est pas correctement paramétrée (dossier Maildir inexistant, mauvais uid/gid, erreur dans maildrop, etc), courier décide de ne plus tenter de livrer les mails pendant un certain temps. L'adresse est blacklisted for backscatter (cf : man courier)
Des messages d'erreur  "456 Address temporarily unavailable" et "502 ESMTP command error" sont renvoyés au SMTP et sont visibles dans les logs.

Pour lister les adresse bloquées :

root@host:~# courier show all

Pour débloquer une adresse :

root@host:~# courier clear user@domain.com

Pour débloquer toutes les adresses :

root@host:~# courier clear all

No route to host

courieresmtp: id=00000000008002CF.0000000050C99F63.00003ECE,from=<>,addr=<adresse@domaine> No route to host

Cela vient du fait que la passerelle par défaut refuse de router le trafic smtp. Il faut dans ce cas préciser manuellement le serveur smtp dans le fichier /etc/courier/esmtproutes, exemple avec orange :

: smtp.orange.fr

Et on redémarre courier :

root@host:~# /etc/init.d/courier-mta restart

Maximum connection limit reached for ::ffff:192.168.X.X

Dans /etc/courier/imapd

MAXDAEMONS=300
AXPERIP=60

513 Relaying denied

root@host:~# mkdir /etc/courier/esmtpacceptmailfor.dir/
root@host:~# echo domain1 > /etc/courier/esmtpacceptmailfor.dir/domain1
root@host:~# makeacceptmailfor

Pourquoi les mails mettent du temps à s'envoyer

source

On modifie la ligne suivante dans /etc/courier/esmtpd

TCPDOPTS="-nodnslookup -noidentlookup"

Commandes utiles

  • Voir les mails en cours d'envoi
root@host:~# mailq
  • Voir le spool des mails
root@host:~# ls -Rhl /var/lib/courier/msgs/
  • Supprimer un mail du spool :
root@host:~# cancelmsg msgid
  • Supprimer tous les mails de la spool :
root@host:~# cancelmsg $(mailq | grep 00 | tr -s " " | awk '{ print $2 }')

Références

  • Wiki Arch Linux :
https://wiki.archlinux.org/index.php/Courier_MTA
  • Autre :
http://library.isr.ist.utl.pt/docs/courier/courier.html
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :

adresse mail de contact