# vim: set syntax=asyd:

Cette documentation a pour but de d'aider a la mise en place d'un système de
mail complet basé sur LDAP.

- iPlanet Directory Server 5.2 (OpenLDAP est utilisable sans problème)
- Postfix 2.1.4.5
- Debian Sarge / 2.4.27
- Courier 0.47
- OpenSSL 0.9.7e-2

Prérequis :

- Des connaissances LDAP
- Des connaissances SSL

Objectif :

- Système virtuel (les utilisateurs mails n'ont pas besoin de compte unix)
- Accès POP3
- Accès IMAP avec possibilité d'utiliser des répertoires partagées
- Accès authentifié SMTP (pour servir de relai)
- Stockage au format maildir
- Gestion centralisé des informations via un annuaire de type LDAP

-------------- Configuration Postfix -------------------------------------------

Créer un utilisateur standard nommé mailuser (groupe mailuser). Il sera utilisé
pour délivrer/stocker les messages.

$ groupadd mailuser
$ useradd -g mailuser mailuser

(ici uid/gid 1000/1000)

/etc/postfix/main.cf
--8<--
smtpd_helo_required = yes

smtpd_helo_restrictions = reject_unknown_hostname
                          reject_non_fqdn_hostname
                          reject_invalid_hostname

smtpd_sender_restrictions = reject_unknown_sender_domain

smtpd_recipient_restrictions = permit_mynetworks
                               permit_sasl_authenticated
                               reject_unauth_destination

# On définis le mapping LDAP pour les comptes.
# La recherche s'effectue sur le champ mail (ex: bonfils@debian-fr.org)
# La table retourne le champ uid, puis rajoute la partie /Maildir/
# Le / final indique un stockage sous la forme maildir

accounts_server_host = ldap.domain
accounts_search_base = ou=People,'suffix'
accounts_query_filter = (mail=%s)
accounts_result_attribute = uid
accounts_result_filter = %s/Maildir/
accounts_bind = no

# On utilise le MDA virtual intégré a postfix qui délivre au format maildir
# On utilise un seul UID/GID pour l'ensemble des boites, d'ou l'utilisation
# de la ligne static:1000

# Le répertoire final de distribution est calculé de la facon suivante :
# /home/mailuser + resultat de la recherche ldap:accounts
# Soit par exemple : /home/mailuser/bonfilbr/Maildir/

virtual_transport = virtual
virtual_mailbox_base = /home/mailuser
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
virtual_mailbox_maps = ldap:accounts
virtual_mailbox_domains = debian-fr.org

# Gestion des certificats
smtpd_tls_key_file = /etc/ssl/postfix.key
smtpd_tls_cert_file = /etc/ssl/postfix.pem
smtpd_tls_CAfile = /etc/ssl/cacert.pem
smtpd_use_tls = yes

# On active l'authentification SMTP via SASL
smtpd_sasl_auth_enable = yes
--8<--

/etc/postfix/sasl/smtpd.conf

--8<--
pwcheck_method: saslauthd
--8<--

-------------- Configuration Courier -------------------------------------------

$ apt-get install courier-authdaemon courier-ldap courier-pop courier-imap

/etc/courier/authdaemonrc
--8<-- 
# On dit d'utiliser le module LDAP
authmodulelist="authldap"
authmodulelistorig="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
# Nombre de daemon
daemons=5
version=""
authdaemonvar=/var/run/courier/authdaemon
--8<--

/etc/courier/authldaprc

--8<--
LDAP_SERVER             ldap.
LDAP_PORT               389
LDAP_PROTOCOL_VERSION   3
LDAP_BASEDN             ou=People,<suffix>
LDAP_BINDDN             cn=postfix,ou=Security,<suffix>
LDAP_BINDPW             secret
LDAP_TIMEOUT            5
LDAP_AUTHBIND           1
LDAP_MAIL               mail
# Ne pas utiliser le champ UID/GID de l'entrée
LDAP_GLOB_UID           mailuser
LDAP_GLOB_GID           mailuser
# Utilise pour construire le chemin de distribution
LDAP_HOMEDIR            uid
LDAP_MAILROOT           /home/mailuser
LDAP_DEFAULTDELIVERY    defaultDelivery
LDAP_FULLNAME           cn
LDAP_CLEARPW            clearPassword
LDAP_CRYPTPW            userPassword
LDAP_DEREF              never
LDAP_TLS                0
--8<--

-------------- Configuration SASL ----------------------------------------------

$ apt-get install libsasl2 sasl2-bin libsasl2-modules

/etc/saslauthd.conf

--8<--
ldap_servers: ldap://ldap.domain/
ldap_bind_dn: cn=sasl,ou=Security,'suffix'
ldap_search_base: ou=People,'suffix'
ldap_password: secret
ldap_filter: mail=%u@%d
--8<--

/etc/default/saslauthd

--8<--
START=yes
PARAMS="-m /var/spool/postfix/var/run/saslauthd"
MECHANISMS="ldap"
--8<--

Il faut également modifier le fichier /etc/init.d/saslauthd :

--8<--
[..]
PIDFILE=/var/spool/postfix/var/run/saslauthd/saslauthd.pid
[..]
--8<--

Quelques explications :

Par défaut, le daemon saslauthd ouvre la socket Unix /var/run/saslauthd/mux.
Cependant, comme le processus smtpd de postfix est chrooté dans le répertoire,
il faut modifier le chemin de la socket ouvert par saslauthd. Cependant, le
script d'init.d de saslauthd n'est prévu pour cela. C'est pourquoi il faut
modifier la variable PIDFILE.

-------------- LDAP ------------------------------------------------------------

Exemple d'une entrée utiliateur (au format LDIF) :

--8<--
dn: cn=Bruno Bonfils,ou=infra,ou=people,<suffix>
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: account
uid: bonfilbr
cn: Bruno Bonfils
sn: Bonfils
homeDirectory: /home/bonfilbr
uidNumber: 10095
gidNumber: 10007
givenName: Bruno
mail: asyd@debian-fr.org
mail: asyd@asyd.net
mail: asyd@zshwiki.org
mail: bbonfils@debian-fr.org
loginShell: /bin/bash
userPassword: {CRYPT}wEz0jE0plDfzY
--8<--

Comme vous pouvez le constater, la seule contraite est que l'uid soit unique
pour toutes les entrées. Il ne doit cependant pas être difficile de modifier ce
comportement (pour par exemple utilisée une OU par domaine mail à gérer).