Configure Postfix to use SASL authentication with TLS security
| 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