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é.
Dans un premier temps nous allons installer les services nécessaires à notre infrastructure, postfix et dovecot2.
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.
>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)
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
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
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.
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.
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
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.