Dernière mise-à-jour : 18 mars 2006

Objectif

L'objectif de ce document est de présenter en détail l'installation et la configuration d'un serveur de messagerie avec le support LDAP sous Debian GNU/Linux. Le serveur de messagerie communiquera avec un annuaire LDAP dans lequel seront stockées les informations sur les utilisateurs du système ainsi que sur les domaines à prendre en charge. Nous verrons donc l'installation et la configuration de l'annuaire LDAP, du serveur SMTP, du serveur POP3/IMAP et du webmail.

Prérequis

Le document décrit la marche à suivre sur un système Debian GNU/Linux Sarge. Nous supposerons donc qu'un système Debian Sarge est installé et fonctionnel. De plus, pour l'installation des logiciels, le logiciel APT doit être fonctionnel. Concernant les noms de domaines, ils devront exister et être correctement configurés sur le serveur DNS.

Sommaire

  1. Présentation des logiciels choisis
  2. OpenLDAP
  3. Postfix
  4. Courier
  5. Squirrelmail

Présentation des logiciels choisis

L'installation de logiciel sous Debian GNU/Linux se fait très facilement grâce à l'outil APT. Dans le cadre de ce document, nous n'utiliserons que des logiciels libres disponibles via APT.

OpenLDAP

Pour l'annuaire, nous utiliserons OpenLDAP. OpenLDAP est un serveur LDAP (Lightweight Directory Access Protocol) Opensource qui implémente le protocole LDAP v3 (rfc 3377) et la gestion des fichiers LDIF (rfc 2849).

Postfix

Postfix est le serveur SMTP que nous utiliserons. Facile à configurer, il intègre aussi un connecteur vers LDAP.

Courier

Nous utiliserons les logiciels Courier pour les services POP3 et IMAP. Comme Postfix, Courier propose un connecteur LDAP en standard.

Squirrelmail

Le webmail sera Squirrelmail. Squirrelmail est un webmail simple et efficace, il supporte les protocoles IMAP et SMTP. Entièrement en PHP4, il génère des pages html sans aucune fioriture pour une plus grande compatibilité avec les navigateurs.

Versions

Voici la liste des packages utilisés et leur version :

  • courier-authdaemon/0.47-4sarge4
  • courier-base/0.47-4sarge4
  • courier-imap/3.0.8-4sarge4
  • courier-ldap/0.47-4sarge4
  • courier-pop/0.47-4sarge4
  • fam/2.7.0-6sarge1
  • ldap-utils/2.2.23-8
  • phpldapadmin/0.9.5-3sarge2
  • postfix/2.1.5-9
  • postfix-ldap/2.1.5-9
  • postfix-pcre/2.1.5-9
  • slapd/2.2.23-8
  • squirrelmail/1.4.4-8
  • squirrelmail-locales/1.4.4-20050308

La prochaine étape sera l'installation de l'annuaire, source d'informations pour les serveurs SMTP/POP3/IMAP.

OpenLDAP

Pour installer OpenLDAP, utilisez la commande suivante:

# apt-get install slapd

Pour terminer l'installation, il suffit de répondre aux questions posées par le système.

slapd1
Dans le cadre de ce document, nous utiliserons le suffixe dc=masociete, dc=com pour l'annuaire.

slapd2
Il nous faut ensuite saisir un nom d'organisation; celui-ci ne servira pas. Mettez ce que vous voulez.

slapd3
Lorsque vous y êtes invité, saisissez le mot de passe pour l'administrateur de l'annuaire.

slapd4
Confirmez le mot de passe.

slapd5
Nous choisirons, pour terminer, de ne pas autoriser le protocole LDAPv2.

Pour démarrer, arrêter ou redémarrer le serveur LDAP, utilisez la commande suivante :

# /etc/init.d/slapd start|stop|restart

Pour pouvoir manipuler l'annuaire et les fichiers LDIF dans la console, nous allons installer ldap-utils. Pour cela, utilisez la commande suivante :

# apt-get install ldap-utils

La configuration de OpenLDAP se fait ensuite grâce au fichier /etc/ldap/slapd.conf. Pour répondre à nos besoins, nous allons devoir apporter deux modifications à ce fichier. Premièrement, pour augmenter le niveau de sécurité, nous allons interdire l'accès anonyme à l'annuaire. Pour ce faire, il faut remplacer la directive suivante :

access to *
       by dn="cn=admin,dc=masociete,dc=com" write
       by * read

par :

access to *
       by dn="cn=admin,dc=masociete,dc=com" write
       by * none

Ensuite, nous allons indiquer à OpenLDAP le chemin du schéma que nous souhaitons utiliser. En effet, il est possible de définir notre propre schéma mais, dans un souci de simplicité et de portabilité, nous utiliserons le schéma proposé par courier. Pour cela, il nous faut installer courier-ldap grâce à la commande suivante :

# apt-get install courier-ldap

courier1

Une fois courier-ldap installé, nous trouvons dans le répertoire /usr/share/doc/courier-ldap/ un fichier nommé authldap.schema. Nous allons ensuite modifier la configuration d'OpenLDAP pour qu'il utilise ce schéma. Pour cela, nous allons copier authldap.schema dans le répertoire des schémas d'OpenLDAP :

# cp /usr/share/doc/courier-ldap/authldap.schema /etc/ldap/schema/

puis modifier le fichier slapd.conf en lui ajoutant cette ligne :

include /etc/ldap/schema/authldap.schema

Votre annuaire est désormais prêt. Il ne vous reste plus qu'à redémarrer le serveur slapd. Pour cela, tapez la commande suivante :

# /etc/init.d/slapd restart

Si une erreur se produit, vérifiez bien la configuration du fichier slapd.conf et allez voir dans les fichiers de log s'il n'y a pas une information concernant la source de l'erreur.

Votre annuaire s'est lancé correctement, nous allons maintenant y entrer les informations concernant les comptes et les domaines à gérer. Dans le cadre de ce document, nous utiliserons la structure suivante :

SCHEMA

Notre serveur sera donc capable de gérer le courrier pour les domaines fr.masaciete.com et us.masociete.com. Pour ajouter des données à l'annuaire, nous allons utiliser un fichier au format LDIF.

exemple.ldif

dn:o=france,dc=masociete,dc=com
o: france
objectClass: top
objectClass: organization
objectClass: CourierDomainAlias
virtualdomain: fr.masociete.com
virtualdomainuser: fr.masociete.com/

dn:cn=infos,o=france,dc=masociete,dc=com
cn: infos
mail: infos@fr.masociete.com
maildrop: infos@masociete.com
sn: Informations
objectClass: top
objectClass: inetOrgPerson
objectClass: CourierMailAlias

dn:cn=nicolas,o=france,dc=masociete,dc=com
cn: nicolas
gidNumber: 0
mail: nicolas@fr.masociete.com
sn: Nicolas
uidNumber: 0
mailbox: fr.masociete.com/nicolas/
objectClass: top
objectClass: inetOrgPerson
objectClass: CourierMailAccount
userPassword: {CRYPT}g0RdfmDF654PCJcc
homeDirectory: /home/vmail/

dn:cn=support,o=france,dc=masociete,dc=com
cn: support
gidNumber: 0
mail: support@fr.masociete.com
sn: Support
uidNumber: 0
mailbox: fr.masociete.com/support/
objectClass: top
objectClass: inetOrgPerson
objectClass: CourierMailAccount
userPassword: {CRYPT}ggU25mfmDFaz2c58
homeDirectory: /home/vmail/

Note 1: Pour définir un catchall, ajoutez un utilisateur dont l'adresse email est de la forme @domaine.tld. Ainsi, tout le courrier à destination d'une adresse inexistante ira sur cette boîte.
A utiliser avec précaution, cette boîte peut devenir très volumineuse très rapidement.

Note 2: Les noms de domaines que vous souhaitez prendre en charge doivent être configurés correctement, c'est à dire que votre serveur doit être désigné comme étant le MX primaire pour chaque domaine sur les serveurs DNS autoritaires. Plus d'informations sur le site CommentCaMarche.

Une fois le fichier créé, utilisez la commande ldapadd pour insérer vos données :

# ldapadd -x -f exemple.ldif -D "cn=admin,dc=masociete,dc=com" -w <pass_admin>

Pour cet exemple, j'ai choisi les classes inetOrgPerson, CourierDomainAlias, CourierMailAlias et CourierMailAccount. Vous êtes libre d'utiliser d'autres classes, l'important est d'avoir à disposition les informations suivantes :

  • nom canonique,
  • adresse email,
  • chemin de la boîte aux lettres et du répertoire d'accueil pour les comptes,
  • adresse email de destination pour les redirections,
  • mot de passe,
  • nom du domaine.

Le schéma proposé par Courier permet d'utiliser bien d'autres attributs. Je me suis limité aux attributs obligatoires.

Voici la structure des classes proposées par Courier. On peut voir quels sont les attributs obligatoires (MUST) et optionnels (MAY).

objectclass ( 1.3.6.1.4.1.10018.1.2.1 NAME 'CourierMailAccount' SUP top AUXILIARY
	DESC 'Mail account object as used by the Courier mail server'
	MUST ( mail $ homeDirectory $ uidNumber $ gidNumber )
        MAY ( mailbox $ uid $ cn $ gecos $ description $ loginShell $ quota $ userPassword $ clearPassword $ defaultdelivery) )

objectclass ( 1.3.6.1.4.1.10018.1.2.2 NAME 'CourierMailAlias' SUP top AUXILIARY
	DESC 'Mail aliasing/forwarding entry'
	MUST ( mail $ maildrop )
        MAY ( mailsource $ description ) )

objectclass ( 1.3.6.1.4.1.10018.1.2.3 NAME 'CourierDomainAlias' SUP top AUXILIARY
	DESC 'Domain mail aliasing/forwarding entry'
	MUST ( virtualdomain $ virtualdomainuser )
        MAY ( mailsource $ description ) )

La classe inetOrgPerson permet aussi de nombreux attributs supplémentaires, pour plus d'informations, vous pouvez consulter les fichiers, qui définissent le schéma, dans /etc/ldap/schema/ ou aller sur le site LDAP Schema Viewer.

Si vous avez un serveur web configuré sur votre serveur, je vous conseille d'utiliser phpldapadmin. Phpldapadmin est une interface d'administration en PHP qui vous permettra de manipuler facilement votre annuaire (ajout/suppression/modification/import/export/recherche/...). Pour l'installer, tapez la commande suivante :

# apt-get install phpldapadmin

Il ne vous reste plus qu'à créer un lien à la racine de votre site :

# ln -s /usr/share/phpldapadmin/ /var/www/ldap

Une fois le serveur d'annuaire en place, nous allons pouvoir nous lancer dans l'installation et la configuration du serveur SMTP Postfix.

Postfix

L'installation de Postfix sous Debian GNU/Linux est d'une simplicité enfantine. Il suffit de taper la commande suivante :

# apt-get install postfix postfix-ldap postfix-pcre

postfix1

postfix2

postfix3

postfix4

postfix5

Vous avez désormais un serveur SMTP fonctionnel sans avoir quoi que ce soit à modifier. Facile, isn't it ?

Pour configurer le serveur correctement, nous suivrons entre autres les recommandations du VIRTUAL_README, du LDAP_README et de LDAP_TABLE(5). Une partie de la documentation traduite en français est disponible sur le site de Xavier Guimard.

Avant d'aller plus loin, nous devons créer l'utilisateur, le groupe et le répertoire qui seront utilisés par Postfix pour manipuler les messages.

# groupadd -g 5000 vmail
# useradd -u 5000 -g 5000 -d /home/vmail -s /bin/false -m vmail

La configuration de Postfix se fera uniquement dans le fichier main.cf, situé dans /etc/postfix/. Avec l'éditeur de votre choix, modifier le fichier main.cf comme présenté ci-dessous :

main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

myhostname = debian.masociete.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = debian.masociete.com, localhost.masociete.com, localhost
relayhost = 
mynetworks = 127.0.0.0/8 192.168.0.0/24
mailbox_command =
home_mailbox = Maildir/
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
luser_relay =

#la directive suivante correspond à la liste des domaines pris en charge.
virtual_mailbox_domains = ldap:/etc/postfix/ldap-domains.cf
# le répertoire /home/vmail stockera les boites mail des utilisateurs
virtual_mailbox_base = /home/vmail
#la directive suivante correspond à la liste des utilisateurs déclarés.
virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf
virtual_minimum_uid = 100
virtual_gid_maps = static:5000
virtual_uid_maps = static:5000
#la directive suivante correspond à la liste des alias (redirections).
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
unknown_local_recipient_reject_code = 450

Il nous reste à créer les fichiers ldap-domains.cf, ldap-accounts.cf et ldap-aliases.cf qui définissent les paramètres pour accéder à l'annuaire. Comme vous le constatez dans le fichier main.cf, ces fichiers seront créés dans le répertoire /etc/postfix/. Avec votre éditeur favori, créez les fichiers suivants :

ldap-domains.cf

server_host = localhost
server_port = 389
search_base = dc=masociete, dc=com
query_filter = (&(objectClass=CourierDomainAlias)(virtualdomain=%s))
result_attribute = virtualdomain
bind = yes
bind_dn = cn=admin, dc=masociete, dc=com
bind_pw = <pass_admin>
version = 3

ldap-accounts.cf

server_host = localhost
server_port = 389
search_base = dc=masociete, dc=com
query_filter = (& (objectClass=CourierMailAccount)(mail=%s))
result_attribute = mailbox
bind = yes
bind_dn = cn=admin, dc=masociete, dc=com
bind_pw = <pass_admin>
version = 3

ldap-aliases.cf

server_host = localhost
search_base = dc=masociete, dc=com
query_filter = (&(objectClass=CourierMailAlias) (mail=%s))
result_attribute = maildrop
bind = yes
bind_dn = cn=admin, dc=masociete, dc=com
bind_pw = <pass_admin>
version = 3

Note : Pour des raisons de sécurité, assurez-vous que les fichiers contenant le mot de passe de l'administrateur LDAP ont des droits suffisamment restrictifs.

Pour vérifier qu'il n'y a aucune erreur de syntaxe dans les fichiers de configuration de Postfix, utilisez la commande postfix :

# postfix check

Elle ne doit renvoyer aucun message.

De plus, n'oubliez pas de recharger Postfix après chaque modification de sa configuration. Pour cela, utilisez la commande postfix :

# postfix reload

Pour vérifier que Postfix communique bien avec le serveur OpenLDAP, utilisez l'utilitaire postmap.

Exemple :
# postmap -q nicolas@fr.masociete.com ldap:/etc/postfix/ldap-account.cf
fr.masociete.com/nicolas/

Votre serveur est désormais configuré pour envoyer et recevoir les emails. Pour tester son bon fonctionnement, envoyez vous des emails vers les alias et les comptes. Le test est concluant si des fichiers se créent dans le répertoire /home/vmail/. Nous allons pouvoir passer à la configuration de Courier.

Courier

L'installation de Courier se fait encore une fois par le biais de APT :

# apt-get install courier-base courier-authdaemon courier-imap courier-pop courier-ldap fam

Note : courier-base, courier-ldap et courier-authdaemon ont normalement été installés lors de l'installation/configuration de OpenLDAP.

La configuration de Courier se limite à la configuration de Courier-authdaemon. Nous allons donc modifier les fichiers /etc/courier/authldaprc et /etc/courier/authdaemonrc. Le contenu du fichier authldaprc est simple et commenté. Morceaux choisis :

LDAP_SERVER		localhost
LDAP_PORT		389

LDAP_PROTOCOL_VERSION	3

LDAP_BASEDN		dc=masociete, dc=com

LDAP_BINDDN		cn=admin, dc=masociete, dc=com
LDAP_BINDPW		<pass_admin>

LDAP_MAIL		mail

##NAME: LDAP_FILTER:0
#
# This LDAP filter will be ANDed with the query for the field defined above
# in LDAP_MAIL.  So if you are querying for mail, and you have LDAP_FILTER
# defined to be "(objectClass=CourierMailAccount)" the query that is performed
# will be "(&(objectClass=CourierMailAccount)(mail=<someAccount>))"
#
LDAP_FILTER           (objectClass=CourierMailAccount)

LDAP_GLOB_UID		vmail
LDAP_GLOB_GID		vmail

#LDAP_HOMEDIR est OBLIGATOIRE.
LDAP_HOMEDIR		homeDirectory

LDAP_MAILDIR		mailbox

LDAP_DEFAULTDELIVERY	defaultDelivery

LDAP_FULLNAME		cn

#LDAP_CLEARPW		userPassword
LDAP_CRYPTPW		userPassword

Note : Attention aux espaces dans le fichier authldaprc. Une variable précédée d'un espace ne sera pas prise en compte.

Dans le fichier /etc/courier/authdaemonrc, nous allons remplacer :

authmodulelist="authpam"

par :

authmodulelist="authldap"

Une fois la configuration de Courier-authdaemon terminée, n'oubliez pas de le redémarrer.

# /etc/init.d/courier-authdaemon restart

Pour vérifier le bon fonctionnement de Courier-authdaemon, utilisez l'outil courierauthtest :

# courierauthtest nicolas@fr.masociete.com
Trying authdaemon...
Authenticated: module authdaemon
Home directory: /home/vmail
UID/GID: 5000/5000
Maildir: fr.masociete.com/nicolas/
AUTHADDR=nicolas@fr.masociete.com
AUTHFULLNAME=nicolas
OPTIONS=<none>

Une fois Courier-authdaemon configuré, les serveurs POP3 et IMAP sont opérationnels. Il ne vous reste plus qu'à installer le webmail.

Squirrelmail

Pour installer Squirrelmail, utilisez la commande suivante :

# apt-get install squirrelmail

Ensuite, créez un lien vers Squirrelmail à la racine de votre site web :

# ln -s /usr/share/squirrelmail/ /var/www/webmail

Squirrelmail ne nécessite aucune configuration particulière pour fonctionner. Néanmoins, vous pouvez paramétrer Squirrelmail en modifiant le fichier /etc/squirrelmail/config.php ou en utilisant la commande squirrelmail-configure.

squirrelmail-configure

SquirrelMail Configuration : Read: config.php (1.4.0)
-
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >>

Conclusion

Votre serveur est maintenant terminé. Il fait office de serveur SMTP pour tous les domaines que vous souhaitez. Il permet de lire les emails grâce aux protocoles POP3 et IMAP. Il offre même la possibilité de consulter les emails depuis un webmail. Il ne vous reste plus qu'à vous pencher dans les man, les documentations officielles et Google pour parfaire vos connaissances et optimiser votre serveur à outrance. ;-)

Ressources supplémentaires

Vous avez le droit de copier, distribuer et/ou modifier ce document selon les termes de la GNU Free Documentation License , version 1.2 ou ultérieure, publiée par la Free Software Foundation. Le texte de la licence.