Configuration Postfix + Dovecot en serveur SMTP sortant (seulement)

Comment sécuriser un serveur SMTP sortant

Dans certains cas, il peut être utile de configurer un serveur de messagerie sortant non ouvert – c'est-à-dire avec une authentification afin d'éviter que n'importe qui puisse s'y connecter et envoyer n'importe quoi – tout en laissant la partie de réception sur un autre serveur. C'est le cas notamment lorsqu'on veut disposer d'une adresse de façade – pour une entreprise par exemple – tout en redirigeant les messages vers les vrais destinataires – par redirection – et sans la problématique de gérer les messages localement. La gestion du stockage est laissée au serveur de réception.

Il y a donc deux paramétrages distincts sur deux serveurs distincts. L'un pour la réception, l'autre pour l'envoi.

schéma de principe

Principe de fonctionnement

Un serveur SMTP tel que Postfix gère les messages de la façon suivante :

Un message part de l'application cliente et passe au serveur SMTP émetteur à destination du serveur destinataire qui stocke alors le message dans le répertoire du destinataire.

Par défaut, un serveur SMTP envoie tous les messages qu'on lui demande d'envoyer. Il est ouvert. Il ne gère pas les accès sécurisés – en fait, il peut, mais c'est un peu plus compliqué, et ça ne gère qu'un type d'accès à chaque fois. Pour restreindre l'envoi – et éventuellement la réception – aux seuls utilisateurs authentifiés, il convient d'utiliser une surcouche pour gérer les accès. Dovecot est une solution qui s'occupe de gérer l'authentification SMTP, IMAP et POP3.

Il convient de noter que lors de l'envoi, le message est envoyé au serveur par SMTP. Ce protocole ne fait pas de copie locale dans le répertoire d'envoi de l'émetteur. C'est l'application cliente qui s'en charge, en se connectant une seconde fois – par exemple en IMAP – et enregistre le message dans Envois. L'envoi du message n'induit donc pas de gestion de stockage sur le serveur d'envoi. La présence dans la boîte d'envoi n'est qu'artificielle pour assurer un suivi.

Il est donc tout à fait possible de configurer un serveur SMTP juste pour les envois, et utiliser un autre serveur pour la réception, soit en paramétrant une adresse de réponse, soit par du transfert automatique au niveau du serveur SMTP, ce qui évite d'avoir à gérer les quotas à ce niveau puisque aucun message n'est enregistré localement sur le serveur SMTP – c'est le protocole IMAP qui s'en charge.

Pré-requis

Vous disposez déjà configuré un serveur de courriel avec Postfix qui fonctionne normalement, sans authentification particulière.

Ce serveur de messagerie utilise l'infrastructure suivante :

  • Postfix + PostgreSQL

  • Linux (ici Ubuntu 16.04)

Mise en place

Installer dovecot-core et dovecot-pgsql :

apt-get install dovecot-core dovecot-pgsql

L'installation peut suggérer d'autres paquets à installer comme ntp, dovecot-gssapi, dovecot-sieve, dovecot-mysql, dovecot-sqlite, dovecot-ldap, dovecot-imapd, dovecot-pop3d, dovecot-lmtpd, dovecot-managesieved, dovecot-solr, ufw, mais ceux-ci ne sont pas nécessaires dans notre cas.

La configuration de Dovecot se trouve dans /etc/dovecot/ et /etc/dovecot/conf.d/.

Connexion à la base de données

L'accès à la base de données PostgreSQL est configurée dans /etc/dovecot/dovecot-sql.conf. Copier la configuration par défaut :

cp dovecot-sql.conf.ext dovecot-sql.conf

Puis éditer ce fichier :

vi dovecot-sql.conf

Activer/compléter les lignes suivantes :

driver = pgsql
connect = host=127.0.0.1 port=5432 dbname=mydbname user=myusername password=mypassword
default_pass_scheme = SHA512

Ce schema SHA512 est calculé au niveau de PostgreSQL par la transformation SQL suivante (qui nécessite l'installation de pgcrypto sur le serveur PostgreSQL) :

'{SHA512}'||translate(encode(digest('pharse de passe','sha512'),'base64'), CHR(10), '')

et qui vous permettra de générer des mots de passe chiffrés en base de données compatibles avec Dovecot.

Requête de vérification des mots de passe

Pour l'authentification, il faut définir un peu plus loin dans le fichier /etc/dovecot/dovecot-sql.conf la requête password_query. Par exemple :

password_query = SELECT address as user, passphrase as password FROM mail.dovecot_password_query WHERE address = '%u'

où %u est l'identifiant de l'utilisateur au format utilisateur@domaine. Vous pouvez aussi utiliser utilisateur (%n) et domaine (%d) séparément. Le principe de cette requête est de renvoyer l'utilisateur et son mot de passe – chiffré en SHA512 – qui sera ensuite comparé à celui transmis par le client de messagerie au moment de la connexion.

Comme nous ne cherchons pas à enregistrer les messages en local (qui se font par IMAP, donc sur un autre serveur) nous n'avons pas besoin des autres requêtes.

Connexion à la base de données

Dovecot possède plein de méthodes de vérification des mots de passe. Il faut donc lui indiquer d'utiliser celle que nous venons de définir.

Pour cela copier le fichier d'exemple :

cp auth-sql.conf.ext auth-sql.conf

et paramétrer correctement la partie :

passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf
}

qui utilise la requête que nous venons de définir.

Définition des droits d'authentification pour Postfix

On a besoin aussi de définir les droits utilisés par Postfix pour effectuer son travail et ne pas se trouver bloqué par un problème d'accès.

Pour cela, ouvrir le fichier /etc/dovecot/conf.d/10-master.conf et ajouter :

# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

Redémarrer le service :

service dovecot restart

Mise en place de l'authentification SMTP

Une fois que Dovecot est configuré, il faut indiquer au serveur SMTP qu'il doit authentifier les utilisateurs en l'utilisant.

Pour cela, il faut modifier la configuration Postfix.

Création d'un service

Il faut créer un nouveau service dans master.cf de Postfix, en ajoutant cette partie :

# Dovecot
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_login_maps=pgsql:/etc/postfix/pgsql_virtual_mailboxes_maps.cf
-o smtpd_sender_restrictions=reject_sender_login_mismatch
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_sasl_authenticated, reject

Le fichier /etc/postfix/pgsql_virtual_mailboxes_maps.cf en question contient :

user = myusername
password = mypassword
hosts = 127.0.0.1
dbname = mydbname
query = SELECT mail.virtual_mailbox('%s')

avec une requête qui teste l'existance de l'adresse de messagerie en retournant l'adresse %s si elle existe. Le résultat de la requête pour %s est la valeur de %s, si elle existe.

Une fois le nouveau service créé, il faut l'appeler dans main.cf en ajoutant ces lignes :

# Connexion authentifiée SASL à dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous

# Paramètres pour une connexion chiffrée TLS
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_ciphers=high
smtp_tls_ciphers=high
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Rafraîchir la configuration Postfix

service postfix reload

Tests

Créer un nouveau serveur sortant SMTP dans la client de messagerie, avec les paramètres suivants :

  • Serveur : nom du serveur (normalement domaine)

  • Port : 25

  • sécurisation de la connexion : STARTTLS

  • Méthode d'authentification : Mot de passe normal

  • Utilisateur : utilisateur@domaine (qui doit être défini dans la base de données)

  • mot de passe : le mot de passe défini dans la base de données PostgreSQL

et l'utiliser pour envoyer un message…

En cas de problème

En cas de problème, pour debogger, ouvrir le fichier /etc/dovecot/conf.d/10-logging.conf et activer les lignes nécessaires. Les opérations choisies apparaîtront alors dans les logs.

Pensez à désactiver les logs une fois le problème résolu.

Vous pouvez aussi visualiser la configuration de l'ensemble par la commande :

doveconf -n