aurelien@aschnoebelen.fr:~/blog $

aurelien@aschnoebelen.fr: ~ $ cat ./articles/configurer-un-relais-smtp-avec-postfix-et-sasl-xoauth2/

· 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 :

Terminal bash
sudo apt install build-essential cmake debhelper libcurl4-openssl-dev libjsoncpp-dev libsasl2-dev pandoc pkg-config python3-argparse-manpage python3-msal python3-distutils-extra

Installez également Postfix et sasl :

Terminal bash
sudo apt install postfix libsasl2-2 sasl2-bin libsasl2-modules

Lorsque 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 :

Terminal bash
sudo hostnamectl hostname smtp.aschnoebelen.fr

Enfin, 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 :

Terminal bash
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 install

Testez le bon fonctionnement de l’application :

Terminal bash
sudo sasl-xoauth2-tool test-config --config-file /etc/sasl-xoauth2.conf

Si 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 :

Terminal bash
echo "smtp.aschnoebelen.fr" | sudo tee /etc/mailname

Éditez le fichier de configuration de Postfix(/etc/postfix/main.cf) et modifiez le tel que :

/etc/postfix/main.cf text
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 = xoauth2

Journaux Postfix verbeux

Éditez le fichier /etc/postfix/master.cf. Modifiez la ligne smtp unix - - y - - smtp tel que :

/etc/postfix/master.cf text
smtp      unix  -       -       y       -       -       smtp -v

Redémarrez le service Postfix :

Terminal bash
sudo systemctl restart postfix.service

Fichier /etc/aliases

Éditez le fichier /etc/aliases et complétez-le selon le modèle suivant (adaptez à vos besoins) :

/etc/aliases text
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) :

Terminal bash
sudo newaliases

Redémarrez postfix.

Terminal bash
sudo systemctl restart postfix.service

Certificat

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 !

Terminal bash
cp /etc/ssl/certs/ca-certificates.crt /var/spool/postfix/etc/ssl/certs/
systemctl restart postfix.service

Configuration 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 ».

Gérer les applications de courrier

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

Activer SMTP authentifié

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 ».

Nouvelle inscription d’application dans Entra ID

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

Ajouter une autorisation API

Choisissez Microsoft Graph :

Sélectionner Microsoft Graph

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

Ajouter l’autorisation SMTP.Send

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

Accorder le consentement d’administrateur

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

Autoriser les flux clients publics

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 :
Terminal bash
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 :
Terminal bash
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.conf et modifiez-le comme suit :
/etc/sasl-xoauth2.conf json
{
  "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 » :

Vue d’ensemble de l’application Entra ID

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

Informations d’identifiants client et tenant

Générez le token OAuth2 :

Terminal bash
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 :

Message de connexion device flow

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é.

Saisie du code device flow

Saisissez les identifiants du compte Postfix : Mires de connexion Microsoft 365 Mires de connexion Microsoft 365 Mires de connexion Microsoft 365 Mires de connexion Microsoft 365 Mires de connexion Microsoft 365 Mires de connexion Microsoft 365

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

Confirmation Acquired token

Configuration de l’authentification SMTP avec saslauthd

Créez le répertoire de saslauthd :

Terminal bash
mkdir -p /var/spool/postfix/var/run/saslauthd

Éditez le fichier /usr/lib/systemd/system/saslauthd.service. Remplacez la ligne PIDFile=[...] par :

/usr/lib/systemd/system/saslauthd.service ini
PIDFile=/var/spool/postfix/var/run/saslauthd/saslauthd.pid

Éditez le fichier /etc/default/saslauthd, et configurez les paramètres tels que :

/etc/default/saslauthd bash
#
# 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 :

/etc/postfix/sasl/smtpd.conf text
pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: DIGEST-MD5 SCRAM-SHA-256

Cette configuration permet de s’authentifier sur le relai smtp via la base de données de sasl (/etc/sasldb2).


Pour ajouter un utilisateur dans la base de données :

Terminal bash
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 :

Terminal bash
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 :

Test du serveur avec Send-MailKitMessage (PowerShell)

Installez le module PowerShell « Send-MailKitMessage » :

PowerShell powershell
Install-Module -Name "Send-MailKitMessage" -Scope AllUsers

Créez le fichier Send-TestEmail.ps1 :

Send-TestEmail.ps1 powershell
<#
.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 -UseSecureConnectionIfAvailable

Exécutez-le pour envoyer l’email de test.

Ressources