· 11 min de lecture · #debian #linux #mail #postfix #smtp · dir: Linux dir: Sysadmin
Configurer un relais SMTP avec Postfix et sasl-xoauth2
Guide pas à pas pour installer et configurer un relais SMTP Postfix avec l’authentification XOAUTH2 pour Microsoft 365 sur Debian.
Pré-requis
Installez les paquets nécessaires pour compiler sasl-xoauth2 :
sudo apt install build-essential cmake debhelper libcurl4-openssl-dev libjsoncpp-dev libsasl2-dev pandoc pkg-config python3-argparse-manpage python3-msal python3-distutils-extraInstallez également Postfix et sasl :
sudo apt install postfix libsasl2-2 sasl2-bin libsasl2-modulesLorsque l’utilitaire demande quel type d’installation effectuer pour postfix, choisissez « Pas de configuration », nous allons tout configurer à la main.
Nommez votre machine avec le fqdn complet que vous utiliserez pour contacter le relais SMTP. Par exemple :
sudo hostnamectl hostname smtp.aschnoebelen.frEnfin, attribuez une IP fixe à votre machine et configurez vos DNS pour que votre fqdn pointe sur votre machine.
Compilation de sasl-xoauth2
Téléchargez la dernière version sur https://github.com/tarickb/sasl-xoauth2/releases (choisissez les sources au format zip ou tar.gz comme vous préférez). Extrayez l’archive sur votre serveur et rendez-vous dans le répertoire dans lequel vous avez extrait l’archive. Compilez et installez sasl-xoauth2 :
tar xvzf sasl-xoauth2-release-0.25.tar.gz #Adaptez selon votre cas
cd sasl-xoauth2-release-0.25
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SYSCONFDIR=/etc
make
sudo make installTestez le bon fonctionnement de l’application :
sudo sasl-xoauth2-tool test-config --config-file /etc/sasl-xoauth2.confSi tout est correct, le message « Config check passed. » devrait apparaître.
Configuration de postfix
Fichier de configuration de postfix
Insérez le FQDN de votre serveur dans le fichier dans/etc/mailname. Exemple :
echo "smtp.aschnoebelen.fr" | sudo tee /etc/mailnameÉditez le fichier de configuration de Postfix(/etc/postfix/main.cf) et modifiez le tel que :
myorigin = /etc/mailname
myhostname = smtp.aschnoebelen.fr
mynetworks_style = subnet
mynetworks = localhost
mydestination = $myhostname, localhost.aschnoebelen.fr, localhost
smtpd_banner = $myhostname ESMTP $mail_name (Debian)
inet_protocols = all
compatibility_level = 3.10
alias_maps = $alias_database
alias_database = hash:/etc/aliases
biff = no
recipient_delimiter = +
cyrus_sasl_config_path = /etc/postfix/sasl
## SMTPD
smtpd_tls_cert_file=/etc/ssl/certs/aschnoebelen.fr.cer
smtpd_tls_key_file=/etc/ssl/private/aschnoebelen.fr.key
smtpd_tls_security_level=encrypt
smtpd_tls_received_header = no
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_recipient_limit = 100
smtpd_helo_required = yes
smtpd_helo_restrictions = reject_invalid_hostname
smtpd_sender_restrictions = reject_unknown_address
smtpd_relay_restrictions = permit_sasl_authenticated reject_unauth_destination reject_unknown_sender_domain reject_unknown_client reject_rbl_client zen.spamhaus.org reject_rbl_client bl.spamcop.net reject_rbl_client cbl.abuseat.org
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous noplaintext
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
## 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
relayhost = [smtp.office365.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noplaintext noanonymous
smtp_sasl_mechanism_filter = xoauth2myorigin = /etc/mailname: définit le domaine ajouté aux adresses locales sortantes.myhostname = smtp.aschnoebelen.fr: nom FQDN de la machine locale.mynetworks_style = subnet: définit automatiquement les réseaux de confiance à partir du sous-réseau auquel appartient l’hôte.subnet: autorise le sous-réseau local de la machine.host: n’autorise que la machine locale.class: autorise les réseaux de même classe IP que l’hôte local ; ce mode est habituellement déconseillé.mynetworks_styleest ignoré simynetworksest renseigné.
mynetworks = localhost: définit les réseaux autorisés.mydestination = $myhostname, localhost.aschnoebelen.fr, localhost: définit les domaines pour lesquels cette machine est la destination finale du courrier.smtpd_banner = $myhostname ESMTP$mail_name (Debian): bannière SMTP d’accueil.inet_protocols = all: spécifie les familles IP autorisées.compatibility_level = 3.10: active les comportements compatibles avec cette génération de Postfix.alias_maps = $alias_database: indique les tables d’alias utilisées pour la livraison locale.alias_database = hash:/etc/aliases: base d’alias mise à jour avecnewaliasesousendmail -bi.biff = no: désactive le service biff.recipient_delimiter = +: définit le séparateur d’extension d’adresse.cyrus_sasl_config_path = /etc/postfix/sasl: définit le répertoire contenant la configuration SASL.
Tous les paramètres commençant par smtpd_ concernent la connexion entre le client SMTP et le serveur Postfix.
smtpd_tls_cert_file = /etc/ssl/certs/aschnoebelen.fr.cer: chemin du certificat utilisé pour chiffrer la connexion entrante.smtpd_tls_key_file = /etc/ssl/private/aschnoebelen.fr.key: chemin de la clé privée associée au certificat.smtpd_tls_security_level = encrypt: impose le chiffrement TLS via STARTTLS.smtpd_tls_received_header = no: demande à Postfix de ne pas ajouter d’en-têteReceivedcontenant les détails TLS.smtpd_tls_session_cache_timeout = 3600s: durée de validité du cache de session TLS.tls_random_source = dev:/dev/urandom: source d’entropie utilisée par TLS.smtpd_recipient_limit = 100: nombre maximal de destinataires acceptés pour un seul message.smtpd_helo_required = yes: impose l’envoi d’une commande HELO/EHLO avant certaines opérations SMTP.smtpd_helo_restrictions = reject_invalid_hostname: rejette une requête HELO/EHLO dont le nom d’hôte est invalide.smtpd_sender_restrictions = reject_unknown_address: rejette les requêtes dont le domaine de l’expéditeur ne possède pas d’enregistrement DNS valide.smtpd_relay_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_unknown_sender_domain, reject_unknown_client, reject_rbl_client zen.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org: définit les règles autorisant le relais de messages.
Les paramètres suivants concernent l’authentification SASL côté serveur SMTP.
smtpd_sasl_local_domain = $myhostname: définit le domaine local utilisé par SASL.smtpd_sasl_auth_enable = yes: active l’authentification SASL.smtpd_sasl_security_options = noanonymous, noplaintext: interdit l’authentification anonyme et les mécanismes en clair.smtpd_sasl_authenticated_header = yes: ajoute l’identifiant de l’utilisateur authentifié dans les en-têtes.
Les paramètres suivants concernent la connexion entre Postfix et le serveur SMTP distant.
broken_sasl_auth_clients = yes: ajoute de la compatibilité avec certains clients SASL non conformes.smtp_tls_CApath = /etc/ssl/certs: répertoire contenant les autorités de certification.smtp_always_send_ehlo = yes: force l’envoi d’EHLO.smtp_tls_security_level = encrypt: impose TLS pour la connexion sortante.smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt: fichier contenant les certificats des autorités de certification.smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache: base de cache des sessions TLS sortantes.relayhost = [smtp.office365.com]:587: serveur relais distant, avec port explicite.smtp_sasl_auth_enable = yes: active l’authentification SASL vers le serveur distant.smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd: fichier de correspondance contenant les identifiants.smtp_sasl_security_options = noplaintext, noanonymous: interdit l’authentification anonyme et en clair.smtp_sasl_mechanism_filter = xoauth2: limite le mécanisme SASL utilisé à XOAUTH2.
Journaux Postfix verbeux
Éditez le fichier /etc/postfix/master.cf. Modifiez la ligne smtp unix - - y - - smtp tel que :
smtp unix - - y - - smtp -vRedémarrez le service Postfix :
sudo systemctl restart postfix.serviceFichier /etc/aliases
Éditez le fichier /etc/aliases et complétez-le selon le modèle suivant (adaptez à vos besoins) :
postmaster: root
root: app.postfix
<alias>: <valeur>Générez la base de données des alias /etc/aliases.db (à faire à chaque modification du fichier précédent) :
sudo newaliasesRedémarrez postfix.
sudo systemctl restart postfix.serviceCertificat
Pour générer un certificat autosigné, ou créer votre propre CA, vous pouvez suivre ce tuto complet et de qualité sur Openssl : Création d’une Autorité de Certification interne et de Certificats Clients - Wiki.
Le certificat et sa clé seront à placer dans /etc/ssl/certs, et les paramètres smtpd_tls_cert_file et smtpd_tls_key_file seront à adapter en fonction de leurs noms. Si vous créez une Autorité de Certification, pensez à ajouter son certificat à la base de donnée de Linux (copiez le fichier dans /usr/local/share/ca-certificates/ et lancez la commande sudo update-ca-certificates).
Copiez ensuite le fichier /etc/ssl/certs/ca-certificates.crt dans /var/spool/postfix/etc/ssl/certs/. Attention, il sera nécessaire de le copier à chaque fois que vous modifiez un CA !
cp /etc/ssl/certs/ca-certificates.crt /var/spool/postfix/etc/ssl/certs/
systemctl restart postfix.serviceConfiguration de M365
Configuration de la boîte mail
Rendez-vous sur Accueil - Microsoft 365 centre d’administration pour créer un utilisateur avec une licence contenant Exchange (par exemple Exchange Plan 1 ou équivalent/supérieur). Une fois l’utilisateur créé, ouvrez-le et rendez-vous dans l’onglet « Courrier », puis cliquez sur « Gérer les applications de courrier ».

Veillez à ce que « SMTP authentifié » soit bien coché. Gérez les autres options à votre convenance.

Enregistrement d’une application sur Entra ID et configuration
Rendez-vous sur Inscriptions d’applications - Centre d’administration Microsoft Entra, ou sur Entra ID ⇒ Inscription d’application.
Cliquez sur « Nouvelle inscription ». Nommez-la à votre convenance, et choisissez « Locataire unique seulement ». Puis validez en cliquant sur « S’inscrire ».

Une fois sur la page de l’application, sélectionnez « API autorisées » puis « Ajouter une autorisation » :

Choisissez Microsoft Graph :

Ensuite « Autorisations déléguées », cochez SMTP.Send, puis cliquez sur « Ajouter des autorisations » pour valider votre choix :

Cliquez enfin sur « Accorder un consentement d’administrateur » et confirmez :

Dans le menu de gauche, sélectionnez « Authentication (Preview) », cochez « Autoriser les flux clients publics » et enregistrez vos changements.

Configuration de sasl-oauth2
De retour sur le serveur postfix. Passez sur le compte root (sudo su -).
- Créez le répertoire de stockage des tokens OAuth, ajustez les permissions pour Postfix et redémarrez le service :
mkdir -p /var/spool/postfix/etc/tokens
chown -R postfix:postfix /var/spool/postfix/etc/tokens
systemctl restart postfix.service- Éditez (ou créez) le fichier
/etc/postfix/sasl_passwd, ajustez les permissions et générez le fichier hashé correspondant :
echo "[smtp.office365.com]:587 <adresse-email>:/etc/tokens/<adresse-email>" > /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
systemctl restart postfix.service- Éditez ou créez le fichier
/etc/sasl-xoauth2.confet modifiez-le comme suit :
{
"client_id": "<application-id>",
"client_secret": "",
"log_full_trace_on_failure": "yes",
"log_to_syslog_on_failure": "yes",
"token_endpoint": "[https://login.microsoftonline.com/](https://login.microsoftonline.com/)<tenant-id>/oauth2/v2.0/token"
}Les valeurs application-id et tenant-id sont à récupérer sur Entra ID. Retournez sur l’application que vous avez enregistrée précédemment, sur la page « Vue d’ensemble » :

Copiez « ID d'application (client) » à la place de « application-id » et « ID de l'annuaire (locataire) » à la place de « tenant-id » :

Générez le token OAuth2 :
sasl-xoauth2-tool get-token outlook /var/spool/postfix/etc/tokens/<adresse-email> --client-id="<application-id>" --use-device-flow --tenant="<tenant-id>"Le message suivant apparaît :

Ouvrez votre navigateur web en navigation privée ou en session invitée (afin d’éviter qu’il se connecte automatiquement à votre compte Microsoft personnel), et entrez l’adresse qui vous est proposée dans le message. Saisissez le code indiqué.

Saisissez les identifiants du compte Postfix :

Si tout est bon, vous devriez avoir un message « Acquired token. » dans le terminal.

Configuration de l’authentification SMTP avec saslauthd
Créez le répertoire de saslauthd :
mkdir -p /var/spool/postfix/var/run/saslauthdÉditez le fichier /usr/lib/systemd/system/saslauthd.service. Remplacez la ligne PIDFile=[...] par :
PIDFile=/var/spool/postfix/var/run/saslauthd/saslauthd.pidÉditez le fichier /etc/default/saslauthd, et configurez les paramètres tels que :
#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian.gz for details.
#
# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"
# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"
# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam -- use PAM
# rimap -- use a remote IMAP server
# shadow -- use the local shadow password file
# sasldb -- use the local sasldb database file
# ldap -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"
# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""
# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5
# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# WARNING: DO NOT SPECIFY THE -d OPTION.
# The -d option will cause saslauthd to run in the foreground instead of as
# a daemon. This will PREVENT YOUR SYSTEM FROM BOOTING PROPERLY. If you wish
# to run saslauthd in debug mode, please run it by hand to be safe.
#
# See the saslauthd man page and the output of 'saslauthd -h' for general
# information about these options.
#
# Example for chroot Postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
# Example for non-chroot Postfix users: "-c -m /var/run/saslauthd"
#
# To know if your Postfix is running chroot, check /etc/postfix/master.cf.
# If it has the line "smtp inet n - y - - smtpd" or "smtp inet n - - - - smtpd"
# then your Postfix is running in a chroot.
# If it has the line "smtp inet n - n - - smtpd" then your Postfix is NOT
# running in a chroot.
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"Créez ou éditez ensuite le fichier /etc/postfix/sasl/smtpd.conf et configurez-le tel que :
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: DIGEST-MD5 SCRAM-SHA-256Cette configuration permet de s’authentifier sur le relai smtp via la base de données de sasl (/etc/sasldb2).
Si vous utilisez des applications qui ont besoin de se connecter en utilisant les méthodes Login ou Plain (comme Vaultwarden), renseigner mech_list tel que :
mech_list: PLAIN LOGIN DIGEST-MD5 SCRAM-SHA-256Éditez également le fichier de configuration de Postfix /etc/postfix/main.cf et au paramètre smtpd_sasl_security_options, supprimez la mention noplaintext.
Pour ajouter un utilisateur dans la base de données :
saslpasswd2 -c -u '<FQDN-serveur>' <utilisateur>Puis copiez le fichier /etc/sasldb2 dans /var/spool/postfix/etc/, adaptez les droits, activez saslauthd et redémarrez les services :
cp /etc/sasldb2 /var/spool/postfix/etc/
chown postfix:postfix /var/spool/postfix/etc/sasldb2
systemctl enable saslauthd.service
systemctl restart postfix.service saslauthd.serviceÀ chaque modification de la base de données, il faudra relancer ces commandes.
Configuration DKIM
Je vous invite à consulter les ressources suivantes :
- https://net-security.fr/securite/postfix-secure/#configuration-de-dkim
- https://fr-wiki.ikoula.com/fr/Installer_DKIM_sur_Postfix_sous_Debian
Test du serveur avec Send-MailKitMessage (PowerShell)
Installez le module PowerShell « Send-MailKitMessage » :
Install-Module -Name "Send-MailKitMessage" -Scope AllUsersCréez le fichier Send-TestEmail.ps1 :
<#
.SYNOPSIS
Test the SMTP Relay with a dummy email.
.DESCRIPTION
Test the SMTP Relay with a dummy email.
.EXAMPLE
PS C:\> .\Send-TestEmail.ps1
.NOTES
Author: Aurélien Schnoebelen
Version: 1
Revision:
-> v1 (28/04/2026) : Script creation
#>
Import-Module Send-MailKitMessage
$SMTPServer = "<fqdn-du-relai-smtp>"
$SMTPPort = 25
$SMTPSender = [MimeKit.MailboxAddress]"<email-exchange>"
$SMTPRecipientList = [MimeKit.InternetAddressList]::new()
$SMTPRecipientList.Add([MimeKit.InternetAddress]"<destinataire1>")
$EmailSubject = "Test du relai SMTP"
$EmailBody = "Hello World ! "
$SMTPCreds = Get-Credential -UserName "<utilisateur-linux-du-serveur-relai>" -Message "Veuillez saisir le mot de Passe"
Send-MailKitMessage -SMTPServer $SMTPServer -Port $SMTPPort -From $SMTPSender -RecipientList $SMTPRecipientList -Subject $EmailSubject -HTMLBody $EmailBody -Credential $SMTPCreds -UseSecureConnectionIfAvailableExécutez-le pour envoyer l’email de test.
Ressources
- Postfix + OAuth2: Relay Emails to Microsoft 365 (Debian 13)
- Postfix, SMTP, SASL (SSL), TLS, POP3 et IMAP - Alsacreations
- Postfix SASL Howto
- Authentification SASL avec Postfix - Trucs et Astuces - debian-fr.org
- installer_postfix_en_local_pour_un_poste_de_travail [Wiki ubuntu-fr]
- Managing email aliases — CLUB1 documentation
- Postfix et authentification via la GSSAPI - LinuxFr.org
- postfix [Wiki ubuntu-fr]