Mail – Configuration de Postfix en backend LDAP

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.

 

4 commentaires sur “Mail – Configuration de Postfix en backend LDAP

  1. 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'aime

    1. 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'aime

    2. 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'aime

  2. 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'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s