Introduction
Ce document va expliquer la configuration d’un serveur Postfix avec un stockage des comptes dans un annuaire LDAP. Les utilisateurs seront virtuels et n’auront donc pas de compte réel sur le serveur.
Cette configuration sera multi-utilisateurs biensûr, mais aussi multi-domaines !
Cela s’applique aussi bien à une distribution Linux, testé sur Debian Sarge & Etch, que sur FreeBSD, testé en 6.2.
Dans ce document, les extraits de fichiers de configuration seront ceux de Debian.
Prérequis
Il faudra biensûr avoir un serveur LDAP fonctionnel. Pour cela, vous pouvez suivre le document suivant: Configuration SLAPD standard.
Sur Debian, il faudra installer les paquets: postfix et postfix-ldap. Alors que sur FreeBSD, nous devrons installer le port postfix avec au moins l’option OPENLDAP au moment de la configuration.
Nous allons devoir tricher un peu car nous allons utiliser pour Postfix le schéma que fournit Courier que nous utiliserons dans ce document: Configuration de Courier IMAP en backend LDAP. Il faudra donc avoir installé courier-authlib-ldap sur Debian ou le port courier avec au moins l’option AUTH_LDAP au moment de la configuration.
Création des répertoires et utilisateurs réels
Dans ce document, on crée un serveur de mail qui acceptent les mails pour des domaines et des utilisateurs virtuels… mais il sera quand même nécessaire de créer un utilisateur réel qui va être le propriétaire des boites mails ainsi qu’un répertoire pour les stocker.
L’utilisateur vmail et son groupe vmail
Il faudra s’assurer d’avoir un utilisateur vmail ainsi que son groupe vmail. Sinon, il faudra les créer avec les commandes adduser et addgroup. N’oubliez pas de repérer les UID et GID, ils seront nécessaires un peu plus loin dans ce document.
Le répertoire /srv/vmail
Nous allons maintenant créer le répertoire /srv/vmail. Pour cela, on utilise la commande mkdir. Utiliser chown pour qu’il appartienne à l’utilisateur vmail et au groupe vmail.
Le fichier slapd.conf
Il n’y aura que peu de modifications à faire à la configuration de slapd.
Voici un extrait du fichier de configuration:
[...] # Ce schéma vient de courier include /etc/ldap/schema/authldap.schema [...] # On ajoute un utilisateur spécial pour parcourir cette branche de l'arbre # mailadmin ACL access to dn.subtree="ou=mail,o=free-4ever,dc=net" by dn.regex="cn=mailadmin,ou=mail,o=free-4ever,dc=net" write by * auth
Il ne faut pas oublier de redémarrer son daemon slapd pour que cela soit pris en compte.
Les ajouts dans l’annuaire LDAP
Maintenant nous allons voir ce qu’il faut ajouter dans notre annuaire LDAP pour que notre serveur de mail fonctionne correctement.
Pour toutes les manipulations avec les commandes LDAP client, vous pouvez vous reporter au document suivant: Utilisation des outils client. Tous les fichiers LDIF sont à ajouter avec la commande ldapadd.
Un container pour toutes les configurations
Nous allons créer une branche dans l’arbre pour mettre toutes les configurations notre serveur de mail.
Le LDIF sera de la forme suivante:
dn: ou=mail,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit ou: mail
L’utilisateur mailadmin
Dans le fichier de configuration de slapd, nous avons ajouté un utilisateur mailadmin.
Voici son fichier ldif:
dn: cn=mailadmin,ou=mail,o=free-4ever,dc=net objectClass: top objectClass: person userPassword: {SSHA}J8+mJREWzYkFDmXnZCTalBbQhq17xUzj cn: mailadmin sn: mailadmin user
Le container pour le domaine free-4ever.net
Maintenant, nous allons créer le container pour toutes les informations du domaine free-4ever.net. Cela ne sera pas simplement un container, il sert aussi de configuration de Postfix pour déclarer un domaine virtuel.
Le fichier sera de la forme suivante:
dn: ou=free-4ever.net,ou=mail,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit # Un objectClass de plus pour configurer Postfix et Courier # Il correspond à la déclaration d'un domaine objectClass: CourierDomainAlias ou: free-4ever.net # Le nom de notre domaine virtuel # Postfix accepte les mails pour ce domaine virtualdomain: free-4ever.net # Le répertoire physique qui correspond au domaine # Il est relatif par rapport a un paramètre de la configuration de Postfix virtualdomainuser: free-4ever.net/
Le container pour les utilisateurs
Nous allons créer une branche dans l’arbre pour mettre toutes les comptes utilisateurs du domaine free-4ever.net.
Voici son fichier ldif:
dn: ou=utilisateurs,ou=free-4ever.net,ou=mail,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit ou: utilisateurs
Le container pour les alias
Nous allons créer une branche dans l’arbre pour mettre toutes les alias du domaine free-4ever.net.
Voici son fichier ldif:
dn: ou=aliases,ou=free-4ever.net,ou=mail,o=free-4ever,dc=net objectClass: top objectClass: organizationalUnit ou: aliases
Un utilisateur: silencer
Nous allons maintenant pouvoir ajouter notre premier compte utilisateur, son login sera silencer et son adresse email: silencer@free-4ever.net
Le LDIF sera de la forme suivante:
dn: cn=silencer,ou=utilisateurs,ou=free-4ever.net,ou=mail,o=free-4ever,dc=net objectClass: top objectClass: person objectClass: inetOrgPerson # Un objectClass de plus pour configurer Postfix et Courier # Il correspond à la déclaration d'un compte objectClass: CourierMailAccount # Le common name de ce compte # Il nous servira de login pour aller lire les mails avec Courier cn: silencer # Un nom un peu plus complet sn: Guillaume # L'UID de notre utilasateur vmail uidNumber: 107 # Le GID de notre utilisateur vmail gidNumber: 110 # l'adresse mail de ce compte mail: silencer@free-4ever.net # l'emplacement physique sur le disque de la mailbox # Il est relatif par rapport au homedir mailbox: free-4ever.net/silencer/ # c'est le homedir de notre utilisateur vmail. # Tous les mails sont dans des sous-répertoires homeDirectory: /srv/vmail/ # Le password hashé # Il n'est pas obligatoire de le mettre de suite # On peut le paramétrer après avec la commande ldappasswd userPassword: {SSHA}ato0Llo2GTK13m8jvvwPt48JzcI=
Un alias: webmaster
Nous allons maintenant pouvoir ajouter notre premier alias, cela sera webmaster@free-4ever.net et le compte sur lequel les mails seront renvoyés sera: silencer@free-4ever.net.
Le LDIF sera de la forme suivante:
dn: cn=webmaster,ou=aliases,o=free-4ever.net,ou=mail,dc=free-4ever,dc=net objectClass: top objectClass: inetOrgPerson # Un objectClass de plus pour configurer Postfix et Courier # Il correspond à la déclaration d'un alias objectClass: CourierMailAlias # le common name de cet alias cn: webmaster # un nom un peu plus complet sn: Le ou les webmasters du site # l'adresse mail de notre alias mail: webmaster@free-4ever.net # L'adresse réelle vers lequel les mails sont envoyés # On peut mettre plusieurs lignes maildrop pour gérer des mailing-lists # Il est aussi possible de mettre des adresses externes aux domaines du serveur maildrop: silencer@free-4ever.net
Configuration de Postfix
Nous allons maintenant voir comment configurer Postfix pour qu’il aille chercher les informations dans l’annuaire LDAP pour nos domaines et utilisateurs virtuels.
Je suis sur que votre distribution favorite possède un fichier recommandé pour Postfix. Donc je ne reviens pas sur les paramètres standards.
Le fichier main.cf
C’est le fichier de configuration principal de Postfix.
Il devra contenir ces paramètres au minimum pour notre configuration:
[...] # Les destinations pour lesquels il accepte les mails # On ne met pas notre domaine.... # Notre domaine sera configuré en domaine virtuel mydestination = orthosie.free-4ever.net, localhost.dedibox.fr, localhost # On remise les mails au format maildir et pas mailbox # Nécessaire pour l'IMAP home_mailbox = Maildir/ # Le fichier de config qui indique comment trouver les domaines virtuels virtual_mailbox_domains = ldap:/etc/postfix/ldap-domains.cf # Le fichier de config qui indique comment trouver les comptes virtuels virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf # Le fichier de config qui indique comment trouver les alias virtuels virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf # Les paramètres pour savoir qui est le propriétaire du répertoire /srv/vmail # On l'a aussi vu dans les fichiers LDIF des utilisateurs virtual_minimum_uid = 100 virtual_gid_maps = static:110 virtual_uid_maps = static:107 # le répertoire /srv/vmail stockera les boites mail des utilisateurs # On l'a vu aussi dans certains fichiers LDIF virtual_mailbox_base = /srv/vmail # La méthode pour délivrer les mails des utilisateurs virtuels # On utilise maildrop qui nous permettra de faire des filtres côté serveur. virtual_transport = maildrop
Le fichier ldap-domains.cf
Ce fichier nous permet de spécifier à Postfix comment trouver les domaines virtuels qu’il gère.
Il est de la forme suivante:
# Le nom DNS du serveur LDAP server_host = localhost # Le port pour lui parler server_port = 389 # La branche de l'annuaire qui contient les informations relatives au mail search_base = ou=mail,o=free-4ever, dc=net # La query que doit faire Posftix pour trouver les domaines virtuels # Ces objets sont de type: CourierDomainAlias # L'attribut qu'on cherche est: virtualdomain query_filter = (&(objectClass=CourierDomainAlias)(virtualdomain=%s)) # L'attribut résultat que l'on cherche # Il nous faut le nom du domaine à accepter result_attribute = virtualdomain # On doit s'identifier pour lire les informations bind = yes # L'utilisateur avec lequel on se connecte bind_dn = cn=mailadmin, ou=mail, o=free-4ever, dc=net # Le mot de passe en clair correspondant à l'utilistateur bind_pw = toto # La version du protocole pour se connecter au serveur LDAP version = 3
Le fichier ldap-accounts.cf
Ce fichier nous permet de spécifier à Postfix comment trouver les comptes utilisateurs virtuels qu’il gère.
Il est de la forme suivante:
# Le nom DNS du serveur LDAP server_host = localhost # Le port pour lui parler server_port = 389 # La branche de l'annuaire qui contient les informations relatives au mail search_base = ou=mail,o=free-4ever, dc=net # La query que doit faire Posftix pour trouver les domaines virtuels # Ces objets sont de type: CourierMailAccount # L'attribut qu'on cherche est: mail pour l'adresse email query_filter = (&(objectClass=CourierMailAccount)(mail=%s)) # L'attribut résultat que l'on cherche # Il nous faut le chemin de la mailbox de notre utilisateur result_attribute = mailbox # On doit s'identifier pour lire les informations bind = yes # L'utilisateur avec lequel on se connecte bind_dn = cn=mailadmin, ou=mail, o=free-4ever, dc=net # Le mot de passe en clair correspondant à l'utilistateur bind_pw = toto # La version du protocole pour se connecter au serveur LDAP version = 3
Le fichier ldap-aliases.cf
Ce fichier nous permet de spécifier à Postfix comment trouver les alias virtuels qu’il gère.
Il est de la forme suivante:
# Le nom DNS du serveur LDAP server_host = localhost # Le port pour lui parler server_port = 389 # La branche de l'annuaire qui contient les informations relatives au mail search_base = ou=mail,o=free-4ever, dc=net # La query que doit faire Posftix pour trouver les domaines virtuels # Ces objets sont de type: CourierMailAlias # L'attribut qu'on cherche est: mail pour l'adresse email query_filter = (&(objectClass=CourierMailAlias)(mail=%s)) # L'attribut résultat que l'on cherche # Il nous faut maildrop pour connaitre les adresses réelles pour envoyer les mails result_attribute = maildrop # On doit s'identifier pour lire les informations bind = yes # L'utilisateur avec lequel on se connecte bind_dn = cn=mailadmin, ou=mail, o=free-4ever, dc=net # Le mot de passe en clair correspondant à l'utilistateur bind_pw = toto # La version du protocole pour se connecter au serveur LDAP version = 3
Application des modifications
Il ne reste plus qu’à redémarrer Postfix. La commande est la suivante:
/etc/init.d/postfix restart
Généralisation
Pour ajouter un utilisateur, un alias ou même un domaine, il suffit d’ajouter un fichier LDIF correspondant au type d’informations que l’on veut ajouter.
Attention, les domaines sont indépendants… Dans cette configuration, si j’ajoute un domaine toto.net et je ne fais rien d’autre, il n’y aura pas les adresses silencer@toto.net, ni webmaster@toto.net comme cela serait le cas avec les domaines que l’on ajoute dans la directive mydestination de Postfix s’appuyant sur des utilisateurs réels.
Administration au quotidien
Pour faciliter l’administration de toutes ces entrées dans le LDAP, vous pouvez utiliser un logiciel du type phpLDAPadmin mais personnellement, je n’aime pas trop…
Dans un avenir plus ou moins proche, j’aurais surement ajouter ces fonctionnalités au projet LEMC mais pour l’instant, c’est pas prévu.
Sinon il reste les fichiers LDIF qui sont très bien aussi.
Mot de la fin
Voilà notre serveur Postfix configuré avec un stockage en LDAP pour des utilisateurs et domaines virtuels
Le gros avantage est qu’il n’y a pas d’utilisateur réel à gérer sur la machine. Tous les ajouts, suppressions et modifications sont prises à chaud que cela soit sur des comptes ou des domaines. Sinon comme toujours avec le LDAP, je suis sûr que l’on peut en trouver plein d’autres… Comme l’administration centralisée, etc…
Maintenant que nous avons ce serveur pour recevoir nos mails, nous allons pouvoir donner accès à ces mails en IMAP à nos utilisateurs. Pour cela, vous pouvez lire le document suivant: Configuration de Courier IMAP en backend LDAP.
Vous pourrez aussi suivre le document suivant: Configuration Maildrop pour faire des filtres côté serveur. C’est toujours pratique quand on a des plusieurs clients IMAP pour accéder à ses mails.
Il pourrait aussi être bien d’autoriser nos utilisateurs à envoyer des mails quelque soit l’endroit où il se trouve grâce à ce serveur. Pour cela nous utiliserons l’authentification SMTP. Vous pourrez lire le document suivant pour la configurer: Configuration de Postfix pour l’authentification en SMTP.
Pour finir, il ne restera plus qu’à configurer un anti-spam et anti-virus. Pour cela, vous pourrez lire le document suivant: Configuration de SpamAssassin et ClamAV.
Bonsoir,
Excellente pédagogie, ce qui est plutôt sur Internet. Je vous en remercie. J’aurais une demande à vous faire si vous le permettez. Avez vous publiez ou sous la même documentation mais au lieu de MAIL – CONFIGURATION DE POSTFIX EN BACKEND LDAP nous avons MAIL – CONFIGURATION DE POSTFIX EN BACKEND LDAP DE SAMBA4. Merci de votre réponse.
David
J'aimeJ'aime
Bonjour,
Merci, j’avais essayé de faire quelque chose de correct à l’époque.
Je ne suis pas certain de comprendre la question.
J’avais fait une doc pour la config Postfix en LDAP et une autre pour la config Samba en LDAP.
Guillaume
J'aimeJ'aime
Bonsoir Guillaume,
Je voulais dire au lieu de vous appuyer sur un backend LDAP de type implémentation Openldap on aurait un backend LDAP de type implémentation SAMBA4. Est-ce qu’il y aurait des différences de configurations des fichiers et notamment sur le fameux « query-filter » ? Actuellement Samba4 version 4.6.
Merci
David
J'aimeJ'aime
Bonjour,
Quand on utilise le LDAP d’un AD Samba ou Micro$oft d’ailleurs, il faut juste adapter les noms des champs.
Je ne suis pas expert la dedans, je ne touche plus trop à ce la ces derniers temps mais je serais tenté de dire que les champs de base sont les mêmes. A savoir givenName, sn, mail, etc… Par contre forcement, il n’y aura pas les champs « courier* », il faudra plutot chercher des entrées de type: SAMAccountName
Guillaume
J'aimeJ'aime