Tag Archive for 'postfix'

Postfix et Kerberos howto

Après moult jours de tripatouillage, je suis parvenu à faire fonctionner l’authentification Kerberos avec Postfix. En effet, on trouve dans les howtos un nombre impressionnant de façon d’y arriver (avec comme toujours certaines configurations dont on peut se demander comment elles fonctionnent). Installons d’abord les paquets :

$ apt-get install postfix
$ apt-get install libsasl2-modules-gssapi-mit

Le daemon saslauthd est inutile. Passons maintenant à l’enregistrement du service SMTP dans le KDC en créeant un ticket pour le service (smtp/fqdn).

$ kadmin.local
kadmin: addprinc -randkey smtp/mailtest.mondomaine
kadmin: ktadd -k /etc/smtp.keytab smtp/mailtest.mondomaine

Il faut ensuite recopier le /etc/smtp.keytab depuis le KDC vers le serveur de mail (mailtest). Sur mailtest ce fichier doit être installé dans le chroot de Postfix car par défaut le processus smtpd acceptant les connexions authentifiées pour l’envoi de messages est chrooté dans /var/spool/postfix. Tant que l’on est à parler du chroot, il faut aussi recopier le répertoire temporaire /var/tmp dans /var/spool/postfix/var car il est utilisé par le processus krb5.login. Il nous faut aussi le /etc/krb5.conf dans /var/spool/postfix/etc. Dernière note sur le chroot, on peut aller voir dans le script de démarrage (/etc/init.d/postfix) les fichiers copiés automatiquement dans le chroot au démarrage du service.

Une fois le chroot configuré, passons au master.cf pour activer un smtpd en SSL sur le port 465 :

smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

Occupons nous aussi du main.cf :

import_environment = KRB5_KTNAME=/etc/smtp.keytab
 
[...]
 
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = cyrus
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
 
smtpd_recipient_restrictions = permit_sasl_authenticated,
                                permit_mynetworks,
                                reject_unauth_destination

Le import_environment est super important car il permet de positionner l’emplacement d fichier keytab utilisé par le service smtp kerberisé. On redémarre un coup Postfix et on test les méthodes d’authentification présentées aux clients avec la classqiue commande “ehlo” :

$ openssl s_client -connect mailtest.univ-orleans.fr:465

Nous renvoie la sortie suivante :

220 mailtest.mondomaine ESMTP Postfix (Debian/GNU)
ehlo mailtest.mondomaine
250-mailtest.mondomaine
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH GSSAPI DIGEST-MD5 NTLM CRAM-MD5 PLAIN LOGIN
250-AUTH=GSSAPI DIGEST-MD5 NTLM CRAM-MD5 PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

La GSSAPI est bien notre mécanisme d’authentification par défaut. Testons maintenant avec un Thunderbird. Pour le configurer, allez dans les propriétés du compte puis “serveur sortant smtp”. Ajoutez en un avec comme nom de serveur mailtest.mondomaine, port 465, selectionnez “Utiliser un nom d’utilisateur et un mot de passe” et enfin choisissez “Utiliser un connexion sécurisée SSL”. Vous devriez maintenant pouvoir envoyer tous vos messages authentifié via Kerberos. Sus au spam interne !

Le debugging est assez complexe, surtout avec le chroot de Postfix. Pour vous aider, vous pouvez utiliser à mort strace en l’attachant au processus “master” de Postfix en suivant tout les types de fork (option -fF) et en sélectionnant certains appels systèmes (-e).

Authentification Dovecot sous Postfix

Suite de l’histoire de Dovecot. Je reçois mes mails sur ma kimsufi. Je suis un homme un peu plus heureux. Le bonheur serait un peu plus complet si je pouvais émettre des mails de n’importe où grâce à un relai authentifié et chiffré. J’ai trouvé un début de solution sur le wiki de Dovecot mais il a fallu quand même d’autres étapes pour que ça marche. Tout d’abord, installation de Postfix (toujours sous FreeBi) avec les options de compilation suivantes :

# This file is auto-generated by 'make config'.
# No user-servicable parts inside!
# Options for postfix-2.6.3,1
_OPTIONS_READ=postfix-2.6.3,1
WITH_PCRE=true
WITH_SASL2=true
WITH_DOVECOT=true
WITHOUT_SASLKRB=true
WITHOUT_SASLKRB5=true
WITHOUT_SASLKMIT=true
WITH_TLS=true
WITHOUT_BDB=true
WITHOUT_MYSQL=true
WITHOUT_PGSQL=true
WITHOUT_OPENLDAP=true
WITHOUT_CDB=true
WITHOUT_NIS=true
WITHOUT_VDA=true
WITHOUT_TEST=true

Une fois cette installation effectuée, un petit coup de postfix_enable=”YES” dans le rc.conf et ça démarre. Attention quand même, il faut bien penser à désactiver Sendmail :

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
 
postfix_enable="YES"

Je souhaite une configuration en “full” SSL (c’est à dire pas de START_TLS) sur le port 445 avec authentification. Pour avoir une instance chiffrée de Postfix sur le port 445, il faut ajouter ce service dans le main.cf.

smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,
                           permit_my_networks,
                           reject_unauth_destination

Le paramètres “smtpd_tls_wrappermode=yes” lie l’instance de smtpd invoquée au port 445 et surtout active le SSL (en mode enforcé). Si on veut forcer à tout prix le chiffrement SSL même sur le port 25 (par exemple depuis un réseau interne), il faut regarder du côté de la variable “smtpd_tls_security_level” qui propose trois niveaux : none (pas de chiffrement), may (si le client veut, on chiffre) et encrypt (quoiqu’il arrive, on chiffre). Le paramètre “smtpd_sasl_auth_enable=yes” active une authentification via la SASL (par défaut Postfix ne le fait pas). Cette primitive permet surtout de profiter de la cible “permit_sasl_authenticated” pour relayer les clients dument authentifiés. Au niveau de la configuration de Postfix, tout le reste se passe dans le main.cf. Il faut commencer par lui indiquer où trouver les certificats :

smtpd_tls_key_file = /usr/local/etc/ssl/smtps/server.key
smtpd_tls_cert_file = /usr/local/etc/ssl/smtps/server.crt

Ensuite on lui fixe quelques variables nécessaires au bon fonctionnement du service de messagerie :

mynetworks_style = host
myhostname = silky.garnett.fr
mydomain = garnett.fr 
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
unknown_local_recipient_reject_code = 550
mynetworks_style = host
mynetworks = 127.0.0.0/8
relayhost = [fqdn.demon.relai]

On notera juste que je fais relayer mon courrier par la machine fqdn.demon.relai, mon MTA n’est donc pas en frontal du net pour l’envoi de messages SMTP. Je ne connaissais pas non plus le “mynetworks_style = host” qui est bien pratique pour du vite fait bien fait. On doit ensuite activer la SASL de Dovecot :

smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,
                             permit_mynetworks,
                             reject_unauth_destination

Le paramètre “smtpd_sasl_type” donne le nom de la couche SASL à utiliser (ici dovecot, évidemment ;-) ). Le “smtpd_sasl_path” donne le chemin du fichier qui va permettre à Dovecot et Postfix de parler ensemble. Ce fichier doit absolument n’être utilisable que par l’utilisateur système postfix :

srw-rw----  1 postfix  postfix  0 Sep  2 08:19 /var/spool/postfix/private/auth

Pour éviter les connexions anonymes, il faut positionner “smtpd_sasl_security_options = noanonymous”. Enfin “broken_sasl_auth_clients = yes” permet de supporter les MUA de merde comme Outlook. Côté Postfix, on est paré ! Passons à Dovecot.

Pour Dovecot, la seule chose à faire est de préparer le socket de discussion entre Dovecot et Postfix (pour l’authentification). Dans le dovecot.conf :

socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0600
    }
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
}

Redémarrage de Dovecot et Postfix et il n y a plus qu’a dérouler ! Pour debugguer, un petit telnet en local sur le port 25 de votre machine devrait vous renvoyer les informations suivante (après avoir été poli et fait le ehlo) :

Trying 192.168.0.1...
Connected to silky.
Escape character is '^]'.
220 silky.garnett.fr ESMTP Postfix
ehlo silky.garnett.fr
250-silky.garnett.fr
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH CRAM-MD5
250-AUTH=CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Voila, on notera que Postfix supporte bien évidemment la SASL standard et que donc toutes les fantaisies sont permises (par exemple avec Kerberos … en SSO … MMmmm … mon caleçon en est tout taché !). Bon courage and may the force be with you :-) !