Postfix et SASL
J'ai passé du temps à comprendre comment mettre en place une authentification dans Postfix (c'est à dire, demander un nom/mot de passe pour avoir le droit d'envoyer du courriel) - et encore plus de temps à comprendre comment Postfix et SASL communiquent.
SASL (Simple Authentication Security Layer) est une bibliothèque qui regroupe un certain nombre de méthodes d'authentification, utilisables dans plusieurs applications.
Postfix fait appel à libsasl2, l'implémentation SASL de chez Cyrus, en tant que bibliothèque C intégrée au programme; le fichier de configuration est déterminé par:
- des constantes dans le code source de Postfix et/ou dans les patches Debian (/etc/postfix/sasl:/usr/lib/sasl2)
- le paramètre de configuration Postfix smtpd_sasl_application_name (par défaut, smtpd)
Donc, /etc/postfix/sasl/smtpd.conf
Ensuite, SASL peut déléguer l'authentification proprement dite à plusieurs outils:
- pwcheck_method: saslauthd : démon de Cyrus qui gère entre autres LDAP et PAM
- pwcheck_method: authdaemond: un démon qui vient avec le server "Courier" et qui gère MySQL
- pwcheck_method: auxprop: des plug-ins, dont le plug-in SQL qui gère SQL, mais uniquement si les mots de passes des utilisateurs sont en clair dans la base! - à moins d'y appliquer (une rustine) un patch.
On note que PAM gère aussi SQL - MAIS, on ne pourra gérer que les mécanismes d'authentification 'PLAIN' ou 'Login', PAM ne permet pas des méthodes plus sophistiquées à base de secret partagé telles que DIGEST-MD5. L'intérêt de ces méthodes est que le mot de passe n'est jamais transmis.
Rajoutez 2 type de contraintes:
- essayer de gérer un maximum de méthodes d'authentification SASL (au moins LOGIN et DIGEST-MD5)
- ne pas commencer à patcher des paquets Debian qui relèvent directement de la sécurité du système
Note: quand on patche des paquets Debian, le coût de maintenance augmente considérablement (vérifier les correctifs de sécurité, repatcher et recompiler l'application si cela arrive, faire attention à ne pas écraser le paquet patché par le paquet d'origine...) à moins de mettre en place une solution automatisée sur laquelle vous serez bien évidemment fous de joie d'apprendre que je suis en train de travailler (depuis plusieurs mois donc ne soyez pas pressés).
Bref, pour que Postfix puisse vérifier un mot de passe dans ma base de données en passant par SASL, j'ai trouvé 4 chemins possibles:
postfix -> paquet libsasl2 -> pwcheck_method: saslauthd -> PAM -> mysql postfix -> paquet libsasl2 --> --> "pwcheck_method: auxprop" + "auxprop_plugin: sql" -> mysql avec mots de passe EN CLAIR postfix -> paquet libsasl2 -> pwcheck_method: auxprop + auxprop_plugin: sql + patch -> mysql postfix -> paquet libsasl2 patché -> courier.authdaemond -> mysql
Maintenant il reste à déterminer s'il y en a une qui correspond à mes 2 contraintes évoquées ci-dessus.
En attendant je vais, dans un premier temps, mettre en plain PLAIN + TLS - faisons simple et tirez-en les conclusions qui s'imposent ;)
Autre chose: Cyrus SASL n'est pas la seule bibliothèque SASL libre. Il y a notamment la bibliothèque gsasl (GNU SASL) de Simon Josefsson. Par contre elle ne semble fournir que la structure SASL; il n'y a donc notamment pas de quoi attaquer une base MySQL a priori. A voir...
Configurations libsasl
Pour /etc/postfix/sasl/smtpd.conf
:
saslauthd
pwcheck_method: saslauthd mech_list: PLAIN LOGIN minimum_layer: 0
Puis dans /etc/pam.d/smtp:
auth required pam_nologin.so auth required pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 #auth required pam_unix.so auth required pam_env.so # [1] account sufficient pam_mysql.so user=postfix passwd=postfix host=localhost db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 account required pam_unix.so
plug-in sql
pwcheck_method: auxprop mech_list: PLAIN LOGIN minimum_layer: 0 auxprop_plugin: sql sql_engine: mysql sql_hostnames: localhost sql_user: postfix sql_database: postfix sql_passwd: postfix sql_select: select password from mailbox where username = '%u@%r'
Liens
- http://asg.web.cmu.edu/cyrus/download/sasl/: documentation de Cyrus libsasl
- http://www.gnu.org/software/gsasl/: GNU SASL
- http://wispdirect.com/docs/sasl-howto.html: patch pour le plug-in SQL de cyrus sasl
- how are 'sasl_minimum_layer' & TLS related/dependent?: thread qui permet de comprendre un minimum à quoi sert le paramètre SASL 'minimum_layer', qui n'est pas documenté chez Cyrus: il s'agit d'un indicateur de sécurité (SSF - security strength factor), qui augmente avec l'utilisation de TLS et autres mécanismes, avec une valeur arbitraire.
sasl_minimum_layer
force l'utilisation d'un niveau minimum de sécurité au moment de l'authentification. - Postfix SASL Howto: discuté également d'autres implémentations SASL (Dovecot...) gérées par Postfix 2.3.