Serveur de messagerie · 4 min read · Oct 13, 2025
Configurer un serveur de messagerie avec Exim4, Clamav, Dovecot, SpamAssassin et bien d'autres sur Debian Lenny
Configurer un serveur de messagerie avec Exim4, Clamav, Dovecot, SpamAssassin et bien d’autres sur Debian
Ce howto décrit une manière de construire une plateforme de messagerie évolutive, sécurisée et complète. Il offre un hébergement virtuel de boîtes aux lettres au format maildir avec support pour les quotas et le filtrage côté serveur, l’aliasing de domaine, l’aliasing d’adresse, le transfert d’adresse, et les adresses catchall. Le relais est sécurisé avec STARTTLS et SMTP-AUTH. Les mails entrants sont vérifiés pour les virus, le spam, et vérifiés contre la politique SPF et DNSBL.
Afin d’atteindre l’évolutivité, la configuration sera répartie sur 3 serveurs :
- 1 serveur MX, où se trouvent la plupart des fonctionnalités de sécurité (faramir.middle.earth)
- 1 relais SMTP, pour permettre aux utilisateurs d’envoyer des mails vers le monde extérieur (ectelion.middle.earth)
- 1 serveur Mailstore, où se trouve la boîte aux lettres (denetor.middle.earth)
Bien sûr, plus de MX peuvent être ajoutés en utilisant des enregistrements MX DNS à vos domaines, plus de serveurs relais peuvent être ajoutés en utilisant un round-robin DNS, et plus de magasins de mails peuvent être ajoutés en utilisant les mécanismes décrits dans ce howto. À l’opposé, vous pouvez facilement fusionner la partie MX et relais, ou la partie relais et mailstore. La fusion de MX et mailstore implique certaines modifications.
Remarque préliminaire
Dans ce howto, nous supposerons que vous avez un serveur Debian fonctionnel. De plus, sudo est supposé être installé sur les systèmes et vous devez être un sudoer.
Configuration de LDAP
Les informations des utilisateurs seront stockées dans un annuaire LDAP. Ici, nous allons l’installer sur le serveur relais.
Tout d’abord, installons les paquets nécessaires :
sudo apt-get install slapd ldap-utilsPour le tutoriel, nous utiliserons les paramètres LDAP suivants :
ldapBase: dc=middle,dc=earth
adminDn: cn=admin,dc=middle,dc=earth
adminPwd: thirdAge
De plus, nous utiliserons un schéma LDAP spécifique. La plupart des attributs et objets sont standards, sauf un ou deux. Attention : comme il y a beaucoup d’attributs standards, vous devrez vous assurer qu’aucun d’entre eux n’est défini deux fois.
Ajoutons donc le schéma dans openldap dans /etc/ldap/schema/mailMEO.schema :
attributetype ( 2.16.840.1.113730.3.1.13
NAME 'mailLocalAddress'
DESC 'Adresse email RFC822 de ce destinataire'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
attributetype ( 2.16.840.1.113730.3.1.16
NAME 'mailQuota'
DESC 'Quantité maximale d'espace disque pour une boîte aux lettres en kilooctets'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
attributetype ( 2.16.840.1.113730.3.1.18
NAME 'mailHost'
DESC 'FQDN du SMTP/MTA de ce destinataire'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
SINGLE-VALUE )
attributetype ( 2.16.840.1.113730.3.1.22
NAME 'mailCopyAddress'
DESC 'Adresse de copie d'ombre RFC822'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
attributetype ( 2.16.840.1.113730.3.1.47
NAME 'mailRoutingAddress'
DESC 'Adresse de routage RFC822 de ce destinataire'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
attributetype ( 2.16.840.1.113730.3.1.49
NAME 'spamassassinUserPrefs'
DESC 'Préférences utilisateur SpamAssassin'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
objectclass ( 2.16.840.1.113730.3.2.147
NAME 'inetLocalMailRecipient'
DESC 'Destinataire de mail local Internet'
SUP top AUXILIARY
MAY ( mailLocalAddress $ mailHost $ mailRoutingAddress $ mailCopyAddress $ mailQuota $ spamassassinUserPrefs ) )
objectclass ( 2.16.840.1.113730.3.2.148
NAME 'inetMailForwarder'
DESC 'Adresse de transfert de mail Internet'
SUP top AUXILIARY
MAY ( mailHost $ mailRoutingAddress ) )Ensuite, assurez-vous d’ajouter le schéma nécessaire dans /etc/ldap/slapd.conf :
...
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/mailMEO.schema
...… et vérifiez le suffixe (debconf devrait déjà l’avoir configuré lorsque vous avez installé slapd) :
suffix "dc=middle,dc=earth"Maintenant, ajoutons quelques ACL que les démons auront besoin de lier à LDAP.
Un accès en lecture seule à l’attribut userPassword pour dovecot :
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=middle,dc=earth" write
by dn="uid=dovecot,dc=middle,dc=earth" read
by anonymous auth
by self write
by * noneUn accès en lecture seule à d’autres attributs pour exim et dovecot :
access to *
by dn="cn=admin,dc=middle,dc=earth" write
by dn="uid=dovecot,dc=middle,dc=earth" read
by dn="uid=exim,dc=middle,dc=earth" read
by * read
by anonymous noneLa dernière ACL désactive les lectures anonymes mais permet la lecture (recherche) pour chaque utilisateur authentifié, ce que vous ne voudrez peut-être pas.
Nous pouvons maintenant redémarrer slapd pour que les changements prennent effet :
sudo /etc/init.d/slapd restartNous devons créer les utilisateurs des ACL précédentes. Pour ce faire, nous utiliserons le fichier user.ldif suivant :
dn: uid=exim,dc=middle,dc=earth
objectClass: account
objectClass: simpleSecurityObject
objectClass: top
uid: exim
userPassword:: e01ENX1hOElTeXAwV2hnVzFSVnhHd0hCNDF3PT0=
dn: uid=dovecot,dc=middle,dc=earth
objectClass: account
objectClass: simpleSecurityObject
objectClass: top
uid: dovecot
userPassword:: e01ENX1yZGp2Q1lPNmtDRm1scXAyVWQwa0xBPT0=Le user/pass sont :
dovecot/dovecotpopperexim4/eximmta Pour alimenter l’annuaire, tapez :
ldapadd -x -D cn=admin,dc=middle,dc=earth -W < users.ldifVoici un autre fichier ldif qui contient des données d’exemple (attention, cet exemple contient des adresses IP qui ne conviendront pas à votre configuration, changez-les manuellement) :
dn: ou=domains,dc=middle,dc=earth
objectClass: organizationalUnit
objectClass: top
ou: domains
dn: dc=middle.earth,ou=domains,dc=middle,dc=earth
dc: middle.earth
objectClass: dNSDomain
objectClass: top
objectClass: inetLocalMailRecipient
objectClass: domainRelatedObject
objectClass: posixAccount
mailLocalAddress: [email protected]
cn: catchall
gidNumber: 8
homeDirectory: /var/mail/middle.earth/c/catchall
uid: catchall
uidNumber: 8
userPassword:: e01ENX1EV3RteGErOFROanJKNUFXZWt1Z0tBPT0=
mailQuota: 102400
mailHost: denetor.middle.earth
associatedDomain: middle.earth
associatedDomain: lotr.middle.earth
dn: uid=sam,dc=middle.earth,ou=domains,dc=middle,dc=earth
cn: sam
displayName: Sam Gamji
gidNumber: 8
homeDirectory: /var/mail/middle.earth/s/sam
mail: [email protected]
mailHost: 172.16.16.23
mailQuota: 102400
objectClass: inetLocalMailRecipient
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
sn: Gamji
uidNumber: 8
uid: sam
userPassword:: e01ENX1NeVV5M1BxaHkvWWVLaVpyMXlOaExBPT0=
mailLocalAddress: [email protected]
mailLocalAddress: [email protected]
mailLocalAddress: [email protected]
dn: uid=frodo,dc=middle.earth,ou=domains,dc=middle,dc=earth
cn: frodo
displayName: Frodo Baggins
gidNumber: 8
givenName: Frodo
homeDirectory: /var/mail/middle.earth/f/frodo
mail: [email protected]
mailHost: 172.16.16.23
mailQuota: 102400
objectClass: inetLocalMailRecipient
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
sn: Baggins
uidNumber: 8
uid: frodo
userPassword:: e01ENX04UGlDRHVnWEdCMmNhRktnbDljTmpRPT0=
mailLocalAddress: [email protected]
mailLocalAddress: [email protected]
mailLocalAddress: [email protected]
dn: uid=gmail,dc=middle.earth,ou=domains,dc=middle,dc=earth
cn: gmail
mail: [email protected]
mailHost: 172.16.16.23
mailRoutingAddress: [email protected]
objectClass: inetMailForwarder
objectClass: inetOrgPerson
objectClass: top
sn: alias to Gmail address
uid: gmailRecevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.