rss logo

Configurer Postfix sous Debian comme relais SMTP vers Microsoft 365 avec OAuth2

Logo Souris Postfix dessinée portant du courrier, relayant des messages vers Microsoft 365 Exchange

Dans cet article, je vous montre comment configurer un serveur de messagerie Postfix sous Debian 12.

L’objectif est de configurer ce serveur Postfix comme un relais SMTP pour des applications ou des périphériques (comme des imprimantes multifonctions) qui ne prennent pas en charge l’authentification OAuth. Cette configuration leur permettra de continuer à envoyer des e-mails, même lorsque Microsoft désactivera définitivement l’authentification de base à partir du 1er mars 2026.

Pour cela, nous utiliserons le plugin SASL sasl-xoauth2, qui permet la prise en charge d’OAuth 2.0 côté client. Vous pouvez trouver plus d’informations sur la page GitHub officielle du projet.

Architecture

Comme mentionné précédemment, le serveur Postfix agira comme un relais pour les clients qui ne prennent en charge que l’authentification de base. Les autres clients compatibles avec l’authentification moderne continueront à utiliser directement OAuth.

Le schéma ci-dessous illustre le fonctionnement du relais d’e-mails entre les clients anciens (comme les imprimantes ou applications), le serveur relais Postfix et Microsoft 365 via OAuth2.

Schéma montrant le relais d’e-mails d’un serveur Debian Postfix vers Microsoft 365 Exchange avec authentification OAuth, impliquant utilisateur, imprimante et serveur

Configurer Microsoft Entra pour l’authentification OAuth2

Créer l’utilisateur M365 et activer le SMTP authentifié

Commencez par créer un compte utilisateur Microsoft 365 avec licence, qui sera utilisé pour l’envoi des e-mails. C’est ce compte qui demandera le jeton OAuth. Dans mon cas, j’ai créé un utilisateur nommé postfix@std.rocks.

Il est important d’activer le SMTP authentifié pour ce compte via le portail d’administration Microsoft 365. Sans cette option activée, l’authentification OAuth ne fonctionnera pas.

Capture du portail d’administration Microsoft 365 montrant l’option 'SMTP authentifié' activée dans les paramètres de messagerie d’un utilisateur.

Nous allons maintenant créer une application avec les autorisations nécessaires pour envoyer des e-mails. C’est cette application à laquelle le serveur Postfix se connectera pour obtenir le jeton OAuth.

Enregistrer une application dans Microsoft Entra

  • Dans la barre de recherche en haut du centre d’administration Microsoft Entra, tapez App registrations et sélectionnez le résultat correspondant :
Capture du centre d’administration Microsoft Entra montrant une recherche d’enregistrements d’applications et le résultat correspondant mis en évidence
  • Cliquez sur le bouton Nouvel enregistrement pour commencer à créer votre application :
Capture du centre d’administration Microsoft Entra avec le bouton Nouvel enregistrement mis en évidence dans la section App registrations
  • Donnez à l’application un nom qui identifie clairement son usage (par exemple OAuth-Postfix) :
Capture de la page d’enregistrement d’une application dans Microsoft Entra montrant le nom OAuth-Postfix, l’option locataire unique sélectionnée, et le bouton Enregistrer en surbrillance
  • Accédez au menu Autorisations d’API, puis cliquez sur Ajouter une autorisation :
Capture de Microsoft Entra montrant la section des autorisations API avec le bouton Ajouter une autorisation en surbrillance pour l’application OAuth-Postfix
  • Ajoutez l’autorisation SMTP.Send, puis cliquez sur Accorder le consentement d’administration pour l’approuver pour le locataire :
Série de captures de Microsoft Entra montrant comment sélectionner l’API Microsoft Graph, choisir les autorisations déléguées, rechercher SMTP.Send et accorder le consentement d’administration

Récupérer l’ID client et l’ID du locataire

Depuis le portail Microsoft Entra, vous devez également récupérer certaines informations clés pour la configuration à venir.

  • Allez dans l’onglet Vue d’ensemble de votre application enregistrée et copiez les valeurs suivantes :
    • ID client — également appelé ID d’application
    • ID du locataire — également appelé ID de l’annuaire
Capture de l’onglet Vue d’ensemble de l’application Microsoft Entra montrant l’ID client et l’ID du locataire pour l’application OAuth-Postfix

Installer Postfix et sasl-xoauth2 sous Debian

Sur votre serveur Debian 12 qui agira comme relais de messagerie, commencez par installer le plugin sasl-xoauth2, puis le serveur de messagerie Postfix.

Installer le plugin sasl-xoauth2

Le plugin sasl-xoauth2 n’est pas encore disponible en tant que paquet dans les dépôts officiels de Debian, nous allons donc le compiler depuis les sources.

  • Depuis un terminal root, installez les dépendances requises pour compiler le plugin :
root@host:~# apt update && apt install build-essential cmake debhelper libcurl4-openssl-dev libjsoncpp-dev libsasl2-dev pandoc pkg-config python3-argparse-manpage python3-msal python3-distutils pip
root@host:~# wget https://github.com/tarickb/sasl-xoauth2/archive/refs/tags/release-0.25.tar.gz
  • Extrayez l’archive .tar.gz téléchargée :
root@host:~# tar xzvf release-0.25.tar.gz
  • Compilez puis installez le plugin :
root@host:~# cd sasl-xoauth2-release-0.25/
root@host:~# mkdir build && cd build
root@host:~# cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc
root@host:~# make
root@host:~# make install
  • Vérifiez la configuration par défaut pour confirmer que le plugin fonctionne correctement :
root@host:~# sasl-xoauth2-tool test-config --config-file /etc/sasl-xoauth2.conf
Config check passed.

Installer et configurer Postfix

  • Installez Postfix (choisissez « Aucune configuration » lorsque cela est demandé) :
root@host:~# apt update && apt install postfix
  • Créez le fichier /etc/mailname pour définir le nom de domaine par défaut :
root@host:~# echo "std.rocks" > /etc/mailname
  • Modifiez le fichier /etc/postfix/main.cf pour configurer Postfix.
    Note : ajoutez les IPs de votre réseau local dans la directive mynetworks si vous prévoyez de relayer des mails depuis d'autres machines.

Voici un exemple de configuration permettant d’activer Postfix comme relais avec OAuth2 en utilisant le mécanisme sasl-xoauth2 :

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
# delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6

# TLS parameters
## SMTPD
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may

## SMTP
smtp_tls_CApath=/etc/ssl/certs
smtp_always_send_ehlo = yes
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = postfix.std.local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, localhost.std.local, localhost
relayhost = [smtp.office365.com]:587
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

#XOAUTH2
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =
smtp_sasl_mechanism_filter = xoauth2

Note : sous Debian, Postfix s’exécute par défaut dans un environnement chroot. Cela signifie que tout chemin comme /etc/tokens/ doit être accessible sous /var/spool/postfix.

  • Créez le dossier où sera stocké le jeton OAuth :
root@host:~# mkdir /var/spool/postfix/etc/tokens
  • Définissez les permissions pour que Postfix puisse lire le jeton :
root@host:~# chown -R postfix:postfix /var/spool/postfix/etc/tokens
  • Redémarrez le service Postfix :
root@host:~# systemctl restart postfix
  • Copiez les certificats CA dans l’environnement chroot (⚠️ ce fichier est effacé à chaque redémarrage de Postfix) :
root@host:~# cp /etc/ssl/certs/ca-certificates.crt /var/spool/postfix/etc/ssl/certs/ca-certificates.crt
  • Créez le fichier /etc/postfix/sasl_passwd et définissez les permissions :
[smtp.office365.com]:587 postfix@std.rocks:/etc/tokens/postfix@std.rocks
root@host:~# chmod 600 /etc/postfix/sasl_passwd
  • Générez la base de données de mots de passe SASL :
root@host:~# postmap /etc/postfix/sasl_passwd

Générer un jeton OAuth

  • Modifiez le fichier /etc/sasl-xoauth2.conf avec les paramètres suivants :
    • --client-id: ID de l’application (Client ID)
    • client_secret: laissez ce champ vide
    • --tenant: ID du locataire (Tenant ID)
    • log_full_trace_on_failure: (optionnel) activer la journalisation complète en cas d’échec
    • log_to_syslog_on_failure: (optionnel) journaliser les erreurs dans syslog

Voici un exemple de configuration pour /etc/sasl-xoauth2.conf utilisant vos identifiants d’application et de locataire :

{
  "client_id": "<CLIENT_ID>",
  "client_secret": "",
  "log_full_trace_on_failure": "no",
  "log_to_syslog_on_failure": "no",
  "token_endpoint": "https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token"
}
  • Générez le jeton OAuth avec la commande suivante :
    • postfix@std.rocks: compte Outlook 365
    • --client-id: ID de l’application
    • --tenant: ID du locataire
root@host:~# sasl-xoauth2-tool get-token outlook /var/spool/postfix/etc/tokens/postfix@std.rocks --client-id="<CLIENT_ID>" --use-device-flow --tenant="<TENANT_ID>"

La commande vous demandera de vous authentifier via un navigateur. Vous verrez un message similaire à celui-ci :

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXX to authenticate.
  • Suivez les instructions : ouvrez https://microsoft.com/devicelogin dans votre navigateur, entrez le code fourni, puis connectez-vous avec le compte Postfix. Un administrateur devra approuver la demande d’autorisation.
Séquence des étapes de connexion Microsoft montrant la saisie du code de l’appareil, la connexion de l’utilisateur avec l’e-mail postfix, et l’approbation des autorisations OAuth par l’administrateur
  • Si tout fonctionne correctement, l’outil renverra :
Acquired token.
  • Vous devriez alors voir un token créé dans le dossier configuré :
root@host:~# ls -lh /var/spool/postfix/etc/tokens/
total 4,0K
-rw-r--r-- 1 root root 3,5K 13 juil. 15:31 postfix@std.rocks

Tester et déboguer

Tester le relais d’e-mails avec sendmail

Votre relais devrait maintenant être opérationnel. Pour tester la configuration depuis l’hôte relais, vous pouvez utiliser la commande sendmail directement dans le terminal.

  • Créez un fichier de message de test :
From: postfix@std.rocks
To: administrator@std.rocks
Subject: Message de test

Est-ce que ça fonctionne ?
  • Envoyez l’e-mail avec sendmail :
root@host:~# cat /tmp/test.txt | sendmail -F postfix@std.rocks administrator@std.rocks

Activer le débogage pour OAuth et Postfix

  • Activez la journalisation détaillée dans /etc/sasl-xoauth2.conf :
{
  "client_id": "<CLIENT_ID>",
  "client_secret": "",
  "log_full_trace_on_failure": "yes",
  "log_to_syslog_on_failure": "yes",
  "token_endpoint": "https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token"
}
  • Modifiez /etc/postfix/master.cf pour rendre le processus SMTP plus bavard en ajoutant -v à la ligne de service smtp :
[…]
smtp      unix  -       -       y       -       -       smtp -v
[…]
  • Redémarrez Postfix et recopiez les certificats CA dans l’environnement chroot :
root@host:~# systemctl restart postfix; cp /etc/ssl/certs/ca-certificates.crt /var/spool/postfix/etc/ssl/certs/ca-certificates.crt
  • Utilisez journalctl pour surveiller les journaux en temps réel :
root@host:~# journalctl -f

Ensuite, renvoyez votre e-mail de test et vérifiez les journaux pour identifier les erreurs ou confirmer la bonne livraison.