Outils pour utilisateurs

Outils du site


user:pascal_cabaud:sysadmin:sendmail-smtps-auth

SMTP authentifié avec Sendmail : SMTP AUTH sur TLS

Quoi de plus pénible que de changer le serveur SMTP dans la configuration de son client de courrier à chaque changement de réseau quand on pourrait n'utiliser qu'un seul serveur sur tous les réseaux ?

On va configurer le serveur SMTP Sendmail de sorte qu'il accepte les messages de nos utilisateurs dûment authentifiés (par SMTP AUTH). Et pour authentifier en clair, on va chiffrer les communications en TLS.

Authentification SMTP

Pour commencer, il nous faut compiler Sendmail avec le support de SASL. SASL est une couche logicielle, un peu comme SSL/TLS, qui fournit l'authentification. Avant de se lancer, il nous faut la bibliothèque SASLv2 et le daemon d'authentification ; on les trouve ici et dans http://pkgsrc.se/security/cyrus-sasl et http://pkgsrc.se/security/cyrus-saslauthd. Quand c'est compilé et installé (avec le support de PAM ; pour pkgsrc, dans /etc/mk.conf ajouter PKG_OPTIONS.cyrus-saslauthd+=pam), il faut l'activer dans les sources de Sendmail : dans devtools/Site/site.config.m4, ajouter les lignes :

dnl SASL stuff
APPENDDEF(`confENVDEF', `-DSASL=2')
APPENDDEF(`conf_sendmail_LIBS', `-lsasl2')
dnl OpenSSL stuff
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS')
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')

Il faut éventuellement indiquer où se trouvent les bibliothèques :

APPENDDEF(`confINCDIRS', `-I/usr/local/include')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')

Pour pkgsrc, ajouter la ligne :

PKG_OPTIONS.sendmail+=sasl
PKG_OPTIONS.sendmail+=tls

dans /etc/mk.conf.

Configurer SASL

La bibliothèque attend un fichier dans le même répertoire que les fichiers binaires (/usr/pkg/lib/sasl2 pour moi), du nom du daemon (Sendmail.conf ici) et contenant :

pwcheck_method: saslauthd

Lancer le daemon saslauthd(8) :

# saslauthd -a getpwent -d

Ici on a fait le choix de se reposer sur les systèmes d'authentification fournis par le système (/etc/passwd, Kerberos, S/Key, LDAP, …). On aurait pu inverser et indiquer l'option -a pam pour appeler PAM plutôt.

On configure au passage /etc/pam.d/sendmail pour mémoire mais il sera inutilisé dans notre configuration :

# auth
auth            required        pam_nologin.so          no_warn
auth            include         system

Configurer Sendmail

Dans le fichier servant à construire le sendmail.cf, ajouter les lignes :

TRUST_AUTH_MECH(`EXTERNAL PLAIN LOGIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL PLAIN LOGIN')dnl
DAEMON_OPTIONS(`Port=25,Addr=127.0.0.1, Name=MTA')dnl
DAEMON_OPTIONS(`Port=587,Addr=127.0.0.1, Name=MSA')dnl
DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=sa')dnl

Chiffrement SMTP avec TLS

Toujours pour la création de sendmail.cf :

define(`confCACERT_PATH', `/etc/mail/certs')dnl
define(`confCACERT', `/etc/mail/certs/cacert.crt')dnl
define(`confSERVER_CERT', `/etc/mail/certs/host.crt')dnl
define(`confSERVER_KEY', `/etc/mail/certs/host.key')dnl

et dans /etc/mail/certs, ajouter :

  • le certificat host.crt,
  • la clef privéee host.key (attention aux droits sur le fichier),
  • la chaîne de certificats racine cacert.crt.

On touille !

Dans access (à mouliner en access.db), on gère ce qui doit être authentifié et/ou chiffré :

Srv_Features:localhost.localdomain      A L S
Srv_Features:localhost                  A L S
Srv_Features:127.0.0.1                  A L S
Srv_Features:host                       A L S
Srv_Features:                           a l s X B E p

Try_TLS:example.com                     NO
TLS_Ctl:                                ENCR:128

et le reste du fichier ne change pas (règles OK ou RELAY par exemple).

Dans cet exemple, de l'extérieur, seul le port tcp/465 est accessible. Lors de la connexion, tout passe sur TLS. Un nom d'utilisateur et un mot de passe sont demandés. La couche SASL les obtient via le système d'authentification du système.

Les drapeaux pour Srv_Features viennent avec SASL :

  • a propose une authentification, A reste silencieux,
  • l demande une authentification, L s'en passe,
  • s propose StartTLS, S reste silencieux.

Les drapeaux *TLS* viennent avec SSL/TLS : localement (dans example.com) pas besoin mais chiffrement nécessaire (au moins 128 bits) pour les connexions externes.

Voilà, vos utilisateurs peuvent maintenant passer systématiquement par votre serveur SMTP : les connexions entrantes depuis l'extérieur commencent systématiquement par une négociation TLS puis une authentification SMTP AUTH avant d'accepter un message.

user/pascal_cabaud/sysadmin/sendmail-smtps-auth.txt · Dernière modification: 2009/03/22 17:18 par Pascal Cabaud