Configure Postfix to use SASL authentication with TLS security

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Authentification SASL des clients SMTP, sous TLS
Paquet cyrus-sasl, cyrus-sasl-plain
Test SASL local testsaslauthd
Test SMTP Telnet sasl, openssl s_client -starttls smtp
Voir aussi Postfix auth TLS

Cette page décrit la mise en place complète de l'authentification SASL des clients SMTP, combinée à TLS pour ne jamais faire transiter d'identifiants en clair — le pendant pratique de Postfix auth TLS, qui couvre le chiffrement seul. Sans authentification, un serveur Postfix qui autoriserait le relais au-delà de son réseau local serait un relais ouvert immédiatement exploité par des spammeurs ; SASL permet d'ouvrir le relais aux utilisateurs légitimes identifiés, où qu'ils se trouvent sur le réseau.

Mise en place de SASL (côté système)

Vérifier la présence des paquets Cyrus SASL et redémarrer le démon d'authentification :

rpm -qa | grep sasl
# cyrus-sasl, cyrus-sasl-lib, cyrus-sasl-plain, cyrus-sasl-devel

service saslauthd restart
saslauthd -v
# authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap

Tester l'authentification d'un compte système via saslauthd avant de toucher à Postfix (isole les problèmes : si ce test échoue, le problème est dans PAM/saslauthd, pas dans la configuration Postfix) :

testsaslauthd -u utilisateur -p motdepasse -s smtp
# 0: OK "Success."

Certificat TLS

cd /etc/pki/tls/certs/
make smtpd.pem

Un certificat auto-signé (générique, généré localement) suffit pour établir le chiffrement — il ne certifie pas d'identité vérifiée par un tiers, mais protège la session contre l'écoute passive.

Configuration Postfix

Ajouter/modifier dans /etc/postfix/main.cf :

inet_interfaces = all
mynetworks = 127.0.0.0/8

smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtp_sasl_security_options = noanonymous

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/pki/tls/certs/smtpd.pem
smtpd_tls_cert_file = /etc/pki/tls/certs/smtpd.pem

smtpd_recipient_restrictions est la ligne clé : elle accepte le relais pour les clients authentifiés par SASL (permit_sasl_authenticated) ou situés dans mynetworks, et rejette explicitement toute autre tentative de livraison vers un domaine non local (reject_unauth_destination) — c'est ce qui ferme le relais ouvert.

service postfix restart

Vérification : sans TLS, l'authentification n'est pas proposée

En clair (port 25 sans STARTTLS), le serveur n'annonce pas AUTH — cohérent avec smtpd_tls_auth_only = yes, qui interdit l'authentification en dehors du canal chiffré :

$ telnet mail.exemple.tld 25
220 mail.exemple.tld ESMTP Postfix
EHLO client.exemple.tld
250-mail.exemple.tld
250-PIPELINING
250-SIZE 10240000
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 DSN

(Pas de ligne AUTH dans la réponse : la méthode n'est pas disponible tant que STARTTLS n'a pas été négocié.)

Vérification : session chiffrée, authentification proposée

openssl s_client -starttls smtp -connect mail.exemple.tld:25

Une fois le handshake TLS terminé (certificat auto-signé accepté malgré l'avertissement self signed certificate), un nouvel EHLO fait apparaître AUTH LOGIN PLAIN :

250 DSN
EHLO client.exemple.tld
250-mail.exemple.tld
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Sans authentification, le relais vers un domaine externe est refusé (le serveur reste utilisable pour du courrier local) :

MAIL FROM:root@client.exemple.tld
250 2.1.0 Ok
rcpt to:destinataire@gmail.com
554 5.7.1 <destinataire@gmail.com>: Relay access denied

Une adresse locale au serveur, en revanche, est acceptée sans authentification :

rcpt to:local@mail.exemple.tld
250 2.1.5 Ok

S'authentifier (AUTH PLAIN)

Le mécanisme PLAIN attend une chaîne encodée en base64, construite comme \0identifiant\0mot_de_passe (le premier champ, l'identité d'autorisation, est laissé vide) :

perl -MMIME::Base64 -e 'print encode_base64("\000utilisateur@exemple.tld\000motdepasse")'

Puis, dans la session TLS ouverte plus haut :

AUTH PLAIN <chaîne_base64>
235 2.0.0 Authentication successful

MAIL FROM:root@client.exemple.tld
250 2.1.0 Ok
rcpt to:destinataire@gmail.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Message de test relayé après authentification
.
250 2.0.0 Ok: queued as C9CC8178030
QUIT

Une fois authentifié, le relais vers un domaine externe (ici gmail.com) est accepté : c'est exactement le comportement attendu de permit_sasl_authenticated.

Voir aussi

  • Postfix auth TLS — détail des paramètres de chiffrement smtpd_tls_*
  • Telnet sasl — test manuel d'une session SMTP en clair
  • Postfix gmail — cas symétrique : Postfix en tant que client SASL vers un relais externe