Postfix SMTPS authentication

Avoir un serveur SMTP qui envoie des mails est bien, le sécuriser c’est mieux.

La législation française impose d’enregistrer les méta-données de connexion aux serveurs, que ce soit vers l’Internet ou en interne. L’authentification est alors une étape primordiale dans la configuration de notre serveur d’envoi SMTP.

Afin de sécuriser nos échanges, nous ajouterons une couche de chiffrement SSL à Postfix, évitant à des attaquants d’intercepter des mails en clair sur le réseau.

Ce tutoriel a été réalisé et testé sur des infrastructures de production en FreeBSD 9.2 et OpenBSD 5.3

Prérequis

Vérifiez que votre version de postfix est compilée avec le support TLS/SSL et SASL2

Support SSL

Dans un premier temps nous allons créer nos certificats.

Je vous convie à regarder cet article afin de générer des certificats, valides ou non.

Installation de cyrus-sasl avec support LDAP

Nous allons utiliser cyrus-sasl afin d’authentifier nos utilisateurs sous Postfix.

Sous FreeBSD:

cd /usr/ports/security/cyrus-sasl2-saslauthd
make install clean

Cochez l’option OpenLDAP.

Sous OpenBSD:

pkg_add -i cyrus-sasl

Sélectionnez la version ldap.

Configuration de cyrus-sasl (saslauthd)

La configuration de cyrus-sasl se fait très rapidement. Ouvrez le fichier /usr/local/etc/saslauthd.conf (/etc/saslauthd.conf sur OpenBSD/Debian) et renseignez les champs nécessaires à l’authentification LDAP.

ldap_servers: ldaps://10.0.0.10/
ldap_search_base: dc=mydomain,dc=tld
ldap_filter: uid=%u
ldap_start_tls: no
ldap_use_sasl: no
ldap_version: 3
ldap_scope: sub
ldap_bind_dn: cn=rootldap,dc=mydomain,dc=tld
ldap_bind_pw: rootpw

Si vous autorisez la lecture de manière anonyme, vous pouvez retirer les deux dernières lignes.

On va maintenant activer et configurer le lancement du service:

Sous FreeBSD, fichier /etc/rc.conf:

saslauthd_enable="YES"
saslauthd_flags="-a ldap -m /var/spool/postfix/var/run/saslauthd"

Sous OpenBSD, fichier /etc/rc.conf.local:

saslauthd_flags="-a ldap -m /var/spool/postfix/var/sasl2"

Nous devons changer le chemin des pipes SASL afin que postfix puisse les utiliser, celui-ci étant chrooté par défaut. L’option -m est celle qui offre cette possibilité.

Créez ensuite le dossier précédemment cité, nécessaire dans une configuration de postfix chrootée, changez le propriétaire et lancez le service

Sur FreeBSD:

mkdir -p /var/spool/postfix/var/run/saslauthd
chown -R postfix:postfix /var/spool/postfix/var/run/saslauthd
service saslauthd star

Sur OpenBSD:

mkdir -p /var/spool/postfix/var/sasl2
chown -R _postfix:_postfix /var/spool/postfix/var/sasl2
chmod +x /etc/rc.d/saslauthd
/etc/rc.d/saslauthd start

Note: sur OpenBSD 5.3 il faut rajouter les droits d’exécution sur /etc/rc.d/saslauthd, autrement il n’est pas possible de lancer le service directement.

Test de cyrus-sasl

On va maintenant tester cyrus-sasl.

testsaslauthd -u <user> -p <password>

Si tout se passe bien vous aurez le résultat suivant:

0: OK "Success."

En cas d’erreur de mot de passe, vous aurez l’erreur suivante, dans ce cas corrigez le mot de passe:

0: NO "authentication failed"

Si vous ne parvenez pas à détecter pourquoi cela ne fonctionne pas, regardez le fichier /var/log/auth.log

saslauthd[39043]: do_auth         : auth failure: [user=myuser] [service=imap] [realm=] [mech=pam] [reason=PAM auth error]

Dans l’exemple précédent, vous avez omis d’activer l’option d’authentification LDAP au lancement du service, de ce fait saslauthd veut s’authentifier via le PAM.

Pour terminer on va ajouter les options d’authentification de SASL dans le fichier /usr/local/lib/sasl2/smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login

Configuration de postfix

On va maintenant configurer postfix. Ouvrez tout d’abord le fichier main.cf. Allez en fin de fichier et collez les lignes suivantes:

# SASL
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =

# SSL/TLS
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_key_file = /etc/postfix/postfix.key
smtpd_tls_cert_file = /etc/postfix/postfix.crt
smtpd_tls_CAfile = /etc/postfix/ca.crt
smtpd_tls_loglevel = 1
smtpd_recipient_limit = 200
smtpd_sender_restrictions = permit_sasl_authenticated,reject
smtpd_client_restrictions = permit_sasl_authenticated,reject

On relie ici postfix à l’authentification SASL. On n’autorise pas l’authentification anonyme (smtpd_sasl_security_options) et on rejette tout client non authentifié (smtpd_client_restrictions), ou dont le login est incorrect (reject final). Par ailleurs, on limite le nombre de destinataire d’un message à 200 personnes (smtpd_recipient_limit).

Ajustez les chemins vers vos certificats.

Pour finir ouvrez le fichier main.cf et décommentez les lignes suivantes:

smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

Cela aura pour effet d’activer l’écoute SMTPS (port 465), d’activer TLS et l’authentification SASL).

Attention: il se peut que sur FreeBSD les options du master.cf ne passent pas bien. Dans ce cas ajoutez les lignes suivantes dans le main.cf.

smtpd_sasl_auth_enable = yes
smtpd_tls_wrappermode = yes

Attention: après redémarrage de postfix, si la commande postconf retourne smtpd_sasl_type = dovecot, rajoutez la ligne suivante dans le fichier master.cf.

smtpd_sasl_type = cyrus

Conclusion

Voilà qui conclut cette partie chiffrement et authentification. Prenez bien le temps de vérifier que les authentifications fonctionnent correctement (mot de passe correct et pas d’anonymous), les variables ne sont pas évidentes à ajuster et dépendent des version de Postfix et de votre OS.