Différences entre les pages « Serveur de courriel » et « Postfix et SASL »

De Cliss XXI
(Différence entre les pages)
Sauter à la navigation Sauter à la recherche
 
 
Ligne 1 : Ligne 1 :
Le but de l'article est de mettre en place un serveur de courriel relativement simple, de la manière la plus automatisée possible.
+
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.
  
Scripts à venir.
+
SASL (Simple Authentication Security Layer) est une bibliothèque qui regroupe un certain nombre de méthodes d'authentification, utilisables dans plusieurs applications.
  
On se basera sur Postfixadmin (la version SVN, sous GNU GPL, pas la dernière stable), ainsi que sur l'excellent [http://high5.net/howto/ HOWTO] associé, qui n'a pour défaut que d'être un peu fouillis (gère Debian et FreeBSD suivant plusieurs variantes de configuration), et surtout de ne pas être automatisé! :)
+
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
  
* [[Postfix]]
+
Ensuite, SASL peut déléguer l'authentification proprement dite à plusieurs outils:
* [[Postfix et SASL]]: tentative de compréhension
+
* pwcheck_method: saslauthd : démon de Cyrus qui gère entre autres LDAP et PAM
* [[Postfix et sécurité]]: autre tentative de compréhension
+
* pwcheck_method: authdaemond: un démon qui vient avec le server "Courier" et qui gère MySQL
* [[SPAM]]
+
* 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.
* [[Cyrus]]: administration manuelle des BALs
 
  
==Liens==
+
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==
  
* http://genco.gen.tc/postfix_sasl_courier_mysql_virtual_maildrop_squirrelmail_quota.php: un autre HOWTO
+
Pour <code>/etc/postfix/sasl/smtpd.conf</code>:
* http://www.littleboboy.net/?2005/04/15/54-postfix-courier-imap: un autre HOWTO en français cette fois
 
* http://www.i-boot.net/mailserver/ : installation à base de LDAP liée avec EGroupWare, licence pas claire
 
  
== Supprimer les comptes inactifs postfixadmin ==
+
===saslauthd===
  
Il y a un script dans <code>ADDITIONS/</code> mais il nécessite une configuration.
+
pwcheck_method: saslauthd
  cd /var/mail/virtual && ls | while read email; do \
+
  mech_list: PLAIN LOGIN
  if [ $(mysql postfix -N -B -e "SELECT count(*) FROM mailbox WHERE username='$email';") = 0 ]; then \
+
minimum_layer: 0
    echo $email; fi; done
 
Faites un <code>rm -rf</code> plutôt qu'un <code>echo</code> quand vous avez vérifié :)
 
  
== Partager le courriel en interne ==
+
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
  
* Installer courier-imap sur un poste (serveur)
+
===plug-in sql===
* Utiliser un même compte sur chacun des postes clients
 
* Dans /etc/courier/imapd : IMAP_ENHANCEDIDLE=1 , pour synchroniser les différents clients immédiatement après chaque opération (ajout, suppression...).
 
  
== Test/debug d'une configuration ==
+
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'
  
* Exim (résultat sur la sortie standard; génial!):
+
==Liens==
sendmail -bt adresse # -bt == 'back-trace'
 
sendmail -bt -d adresse # -d == 'debug', more verbose
 
* Postfix
 
** Tester l'envoi sur une adresse, résultat par mail [http://www.postfix.org/DEBUG_README.html#trace_mail], nettement moins pratique qu'Exim:
 
sendmail -bv adresse # sans envoi réel
 
sendmail -v adresse # avec envoi réel
 
** Couper l'envoi des e-mails sur une configuration de test:
 
echo "/.*/ DISCARD" > /etc/postfix/access-regexp
 
echo "smtpd_client_restrictions = check_recipient_access regexp:/etc/postfix/access-regexp" >> /etc/postfix/main.cf
 
** Couper les e-mails en sortie sur une configuration de test (sauf relay_domains), dans <code>main.cf</code>:
 
default_transport = discard:
 
* Courier, ajouter dans <code>/etc/courier/imapd</code>:
 
IMAPDEBUGFILE=imapdebug.txt
 
  
En cas de test d'un programme qui envoie des courriels, pour éviter tout débordement, on peut ignorer silencieusement tout les courriels externes. Sous Postfix:
+
* http://asg.web.cmu.edu/cyrus/download/sasl/: documentation de Cyrus libsasl
default_transport = discard:
+
* http://www.gnu.org/software/gsasl/: GNU SASL
À compléter éventuellement avec un mouchard qui récupère tous les courriels émis:
+
* http://wispdirect.com/docs/sasl-howto.html: patch pour le plug-in SQL de cyrus sasl
always_bcc = postfix-trace
+
* [http://lists.andrew.cmu.edu/pipermail/info-cyrus/2005-October/019873.html 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. <code>sasl_minimum_layer</code> force l'utilisation d'un niveau minimum de sécurité au moment de l'authentification.

Version du 31 juillet 2006 à 11:37

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:

  1. des constantes dans le code source de Postfix et/ou dans les patches Debian (/etc/postfix/sasl:/usr/lib/sasl2)
  2. 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