Dovecot, Postfix, OpenLDAP on FreeBSD

Pendant ces derniers jours j’ai décidé de basculer mon serveur de mails vers un système FreeBSD, authentifié sur un OpenLDAP, étant auparavant en authentification PAM. Afin de bénéficier d’une flexibilité importante et de réplication de données, nous verrons comment utiliser ZFS et NFS comme systèmes de fichiers pour les mails.

Ce tutoriel s’appuie sur un annuaire OpenLDAP existant, contenant le schéma InetOrgPerson. Le système FreeBSD 9.0 est également utilisé.

Installation des services

Dans un premier temps nous allons installer les services nécessaires à notre infrastructure, postfix et dovecot2.

Installation de postfix

cd /usr/ports/mail/postfix
make install clean

Sélectionnez ici l’authentification LDAP (pour l’envoi de mail authentifié), SSL (pour le SMTPS, l’authentification dovecot2 et PCRE. Gardez les options par défaut pour les services suivants.

Installation de dovecot2

>cd /usr/ports/mail/dovecot2
 make install clean

Ici on active les options SSL et LDAP en plus des options par défaut (docs, exemples et kqueue)

Configuration du système de fichiers

Notre machine dispose de 3 disques. Le premier disque contient le système de fichiers (ada0) et deux disques de 50go (ada1 et ada2).

Nous allons utiliser ZFS pour la réplication des données en mode miroir sur les disques physiques ada1 et ada2. On créé tout d’abord un pool ZFS:

mkdir /var/mail/virtual/
zpool create -m /var/mail/virtual/ zmail /dev/ada1 /dev/ada2

Vérifions maintenant que le pool fonctionne (zpool status) et qu’il correspond bien à un miroir.

Et maintenant on active le service ZFS, ouvrez le fichier /etc/rc.conf

zfs_enable="YES"

et on l’allume

service zfs start

Alternative: système de fichiers NFS

Une alternative intéressante à un stockage local en ZFS peut être l’utilisation d’une baie de disques, ou d’un serveur NFS redondé, comme par exemple DragonFlyBSD et le système de fichiers Hammer, qui offre d’excellentes performances avec NFSv3.

Récemment j’ai décidé de basculer de ZFS vers NFS+Hammer. Pour cette manipulation vous devez au préalable avoir un serveur NFSv3 en votre posession, servant de base à vos fichiers mails.

Dans un premier temps on créée le répertoire nécessaire:

mkdir /var/mail/virtual/

Ensuite on édite le FSTab afin d’intégrer le montage NFS.

nfsserver:/nfs/mail  /var/mail/virtual  nfs rw,nfsv3,tcp,nolockd  0  0

Les options suivantes sont essentielles pour veiller au bon fonctionnement

  • nfsv3: force le montage en NFSv3, aucune négociation ne sera faîte
  • tcp: force NFS à utiliser TCP, améliore les performances
  • nolockd: obligatoire pour garantir la stabilité des lectures et écritures de fichiers de la part de dovecot. Si vous ne l’activez pas, il se peut que vous ne puissiez pas lire certains fichiers distants (j’en ai fait l’expérience pendant 2 jours, en ajoutant cette option le problème à été résolu).

Maintenant montez le répertoire

mount /var/mail/virtual

Pour finir nous allons configurer dovecot pour offrir de bonnes performances avec NFS. Ouvrez /usr/local/etc/dovecot/conf.d/10-mail.conf et décommentez/spécifiez les valeurs suivantes

mmap_disable = no
dotlock_use_excl = yes
mail_nfs_storage = yes
mail_nfs_index = no

Attention, cette configuration permet des performances maximales si un seul serveur se connecte sur le partage NFS. Dans le cas d’accès concurrents, je vous invite à regarder l’article suivant du wiki dovecot.

Configuration des services

Configuration de Dovecot

Configurons maintenant le service IMAP Dovecot.

La configuration de dovecot s’articule autour d’un fichier principal (dovecot.conf) appelant différents modules dans le répertoire conf.d. Chaque module peut ensuite appeler des extensions, comme le module d’authentification, et est annoncé par une priorité (le chiffre au début du nom du fichier).

Ouvrez maintenant le fichier /usr/local/etc/dovecot/dovecot.conf. On ne va laisser actif que le protocole IMAP, POP ne représentant plus d’intérêt, et LMTP étant trop peu utilisé.

protocols = imap

On va configurer tout de suite le module d’authentification LDAP, qui sera activé ensuite. Ouvrez le fichier /usr/local/etc/dovecot/dovecot-ldap.conf.ext. Dans un premier temps on va configurer l’URI du serveur OpenLDAP (ici on a deux serveurs en miroir) et les identifiants de bind:

uris = ldaps://10.45.0.25/ ldaps://10.45.0.26/
dn = cn=ldap-readuser,ou=special-users,dc=unixperience,dc=it
dnpass = R3@dp@swd

Si vous utilisez TLS, configurez le paragraphe associé (ici nous sommes en SSL). On configure maintenant le mécanisme de vérification de l’authentification:

auth_bind = yes
auth_bind_userdn = uid=%u,ou=users,dc=unixperience,dc=it
base = dc=unixperience,dc=it
scope = subtree
user_filter = (&(objectClass=posixAccount)(uid=%n))

Il est très important d’utiliser uid=%n comme filtre LDAP, car il servira au mécanisme LDAP pour trouver un utilisateur dans l’annuaire (auquel cas il utilisera l’adresse mail, ne fonctionnant donc pas).

Passons maintenant à la configuration des modules. Ouvrez /usr/local/etc/dovecot/conf.d/10-auth.conf. On va tout d’abord activer l’authentification plaintext, car nous utilisons SSL, et c’est la plus simple à mettre en oeuvre.

disable_plaintext_auth = no
auth_mechanisms = plain

Ensuite activez l’authentification LDAP en décommentant la ligne suivante en fin de fichier:

!include auth-ldap.conf.ext

Terminons la configuration de l’authentification LDAP en éditant le fichier /usr/local/etc/dovecot/conf.d/auth-ldap.conf.ext

passdb {
  driver = ldap
  args = /usr/local/etc/dovecot/dovecot-ldap.conf.ext
}
userdb {
  driver = ldap
  args = /usr/local/etc/dovecot/dovecot-ldap.conf.ext
}

Configurons maintenant les boîtes mails, ouvrez /usr/local/etc/dovecot/conf.d/10-mail.conf. Si vous ne cherchez pas une configuration exotique avec des boîtes mail partagées, il ne faudra éditer que le chemin des mailbox.

mail_location = maildir:/var/mail/virtual/%n

Si votre serveur doit contenir plusieurs domaines qu’il faut segmenter, il peut être intéressant d’utiliser le mail plutôt que le nom d’utilisateur, ou une arborescence suivant le domaine:

mail_location = maildir:/var/mail/virtual/%u
mail_location = maildir:/var/mail/virtual/%d/%n

Il est également possible de ne pas utiliser le type de boîte maildir, mais mbox qui ordonne les fichiers différement en remplacant le préfixe maildir par mbox.

Notez qu’il y a un espace de nom nommé inbox. La seconde partie de la configuration des boîtes mails se situe dans /usr/local/etc/dovecot/conf.d/15-mailboxes.conf dont voici le fichier de configuration:

namespace inbox {
  # These mailboxes are widely used and could perhaps be created automatically:
  mailbox Drafts {
    special_use = Drafts
  }
  mailbox Junk {
    special_use = Junk
  }
  mailbox Trash {
    special_use = Trash
  }

  # For Sent mailboxes there are two widely used names. We'll mark both of
  # them as Sent. User typically deletes one of them if duplicates are created.
  mailbox Sent {
    special_use = Sent
  }
  mailbox "Sent Messages" {
    special_use = Sent
  }
}

Vous ne devriez pas avoir à l’éditer, sauf si vous souhaitez rajouter des boîtes mail. Dans ce cas, utilisez le template suivant:

mailbox "name" {
    auto = no
    special_use =
  }

Le paramètre auto peut être mis à create pour créer automatiquement la boîte, ou à subscribe pour la créer et abonner l’utilisateur. Le champ special_use est réservé aux boîtes spéciales, spécifiées dans la RFC 6154.

Maintenant on va éditer la configuration générale des modules, ouvrez /usr/local/etc/dovecot/conf.d/10-master.conf

Si vous avez beaucoup de clients, augmentez les limites de dovecot

default_process_limit = 500
default_client_limit = 5000

Dovecot supportera sans problème 2000 connexions simultanées avec un système de fichiers rapide, un processeur quad core et suffisament de DDR3 (4Go minimum).

On va maintenant éditer la gestion du protocole IMAP, en commençant par le login IMAP.

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }

  # Number of processes to always keep waiting for more connections.
  process_min_avail = 20
}

Pour des raisons de sécurité, vous pouvez changer le numéro de port IMAP(S). On a également choisi d’améliorer les performances, au vu du nombre de clients simultanés, en ajoutant 20 processus qui vont attendre de nouvelles connexions.

service imap {
  # Max. number of IMAP processes (connections)
  process_limit = 2000
}

La section “service imap” nous permet de limiter le nombre de connexions simultanées. Ce paramètre remplace le paramètre par défaut que nous avons configuré au dessus.

Maintenant on va configurer le service d’authentification, en permettant l’interaction avec postfix:

service auth {
  unix_listener auth-userdb {
    mode = 0666
    user = dovecot
    group = mail
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
}

Le fichier /usr/local/etc/dovecot/conf.d/15-ssl.conf va nous permettre de définir le chemin du certificat et de la clé SSL de dovecot. Crééons tous d’abord ceux-ci

openssl req -x509 -new -out /usr/local/etc/dovecot/dovecot_cert.pem -keyout /usr/local/etc/dovecot/dovecot_key.pem -days 3650 -nodes

Maintenant on modifie le fichier de configuration:

ssl = yes
ssl_cert = </usr/local/etc/dovecot/dovecot_cert.pem
ssl_key = </usr/local/etc/dovecot/dovecot_key.pem

On passe à la configuration du LDA, qui sera chargé d’envoyer les mails d’erreurs comme “utilisateur inconnu” (erreur 550). Ouvrez le fichier /usr/local/etc/dovecot/conf.d/15-lda.conf, et configurez l’adresse du postmaster et le nom d’hôte principal.

# Address to use when sending rejection mails.
# Default is postmaster@<your domain>.
postmaster_address = mailer-daemon@unix-experience.fr
hostname = unix-experience.fr

Votre service Dovecot est désormais prêt à être utilisé. Passons à la partie SMTP.

Configuration de Postfix

Postfix est le service SMTP le plus utilisé du monde libre et des intégrateurs. On le retrouve par exemple dans des solutions comme Zimbra de VMWare. Ouvrez le fichier /usr/local/etc/postfix/main.cf. On va commencer en configurant les différents noms et les paramètres d’écoute.

inet_interfaces = all
myhostname = smtp.unix-experience.fr
mydomain = unix-experience.fr
myorigin = $myhostname
mydestination = $myhostname, localhost
smtpd_banner = $myhostname ESMTP $mail_name

Le domaine correspond au noms de domaines SMTP que le serveur mail va gérer. Pour la sécurité vous pouvez modifier la bannière SMTP pour faire tromper l’ennemi.

Nous allons configurer maintenant le lien avec dovecot et OpenLDAP.

dovecot_destination_recipient_limit = 1
virtual_mailbox_domains = unix-experience.fr
virtual_transport = dovecot
virtual_alias_maps    = ldap:/usr/local/etc/postfix/ldap-aliases.cf
virtual_mailbox_maps  = ldap:/usr/local/etc/postfix/ldap-account.cf

Les virtual_maps permettent de définir les liens avec l’annuaire, et mettez le contenu suivant dans les fichiers /usr/local/etc/postfix/ldap-aliases.cf et /usr/local/etc/postfix/ldap-account.cf

bind = yes
bind_dn = cn=ldap-readuser,ou=special-users,dc=unixperience,dc=it
bind_pw = ld@ppwd
version = 3
timeout = 20
start_tls = no
tls_require_cert = no
server_host = ldap://10.45.0.25
scope = sub
search_base = dc=unixperience,dc=it
query_filter = mail=%s
result_attribute = mail

Certains fournisseurs d’accès à internet imposent leur SMTP, il faut donc configurer un ou plusieurs relayhosts:

relayhost = [smtp.orange.fr:25]

Pour finir, on va établir le lien entre Postfix et dovecot, ouvrez le fichier /usr/local/etc/postfix/master.cf et ajoutez la ligne suiante:

dovecot    unix  -      n       n       -       -       pipe
        flags=DRhu user=dovecot:mail argv=/usr/local/bin/sudo /usr/local/libexec/dovecot/dovecot-lda -f $(sender) -d $(recipient)

Sudo est utilisé pour que dovecot-lda puisse écrire les mails, car ceux-ci utilisent l’uid et le gid provenant d’OpenLDAP. Il faut donc configurer sudo pour notre binaire. Ouvrez /usr/local/etc/sudoers et ajoutez les lignes suivantes:

Defaults:dovelda !syslog
dovecot          ALL=NOPASSWD:/usr/local/libexec/dovecot/dovecot-lda

et maintenant mettons les bons droits sur /var/mail/

chown -R :mail /var/mail
chmod 775 /var/mail

Voilà, vous pouvez désormais lancer les services.

service dovecot start
service postfix start

Gestion des Alias et redirections

Voyons maintenant comment gérer des alias et/ou redirections mail avec notre serveur LDAP. Tout se joue dans le fichier /usr/local/etc/postfix/ldap-aliases.cf

bind = yes
bind_dn = cn=ldap-readuser,ou=special-users,dc=unixperience,dc=it
bind_pw = ld@ppwd
version = 3
timeout = 20
start_tls = no
tls_require_cert = no
server_host = ldap://10.45.0.25
scope = sub
search_base = dc=unixperience,dc=it
query_filter = gecos=%s
result_attribute = mail

Modifiez la requête afin de changer l’attribut de résultat de votre utilisateur. Grâce à l’attribut gecos, les mails qui ont pour adresse celle indiquée dans le gecos seront redirigée sur l’adresse mail du champ LDAP mail.

Exemple:

dn: uid=tata,ou=people,dc=unixperience,dc=it
gecos: toto@test.com
gecos: titi@test.com
mail: tata@unix-experience.fr

Dans ce cas, les mails arrivant avec l’adresse toto@test.com ou titi@test.com seront redirigés vers tata@unix-experience.fr. Il est possible de spécifier plusieurs mails dans le champ LDAP mail afin que le mail soit envoyé à plusieurs destinataires.