Cet article a été mis à jour le 29/04/2024 à 14:25

Vous souhaitez mettre en place votre propre serveur mail sur un de vos Vps ou serveur dédié tournant sous Debian ? Ce tutoriel vous fournira les explications pour mettre un tel système en place, en utilisant Dovecot, Postfix et PostfixAdmin tout en fournissant les bonnes pratiques pour vous assurer une sécurité et une délivrabilité maximum.

Pourquoi ces outils ?

Postfix

Postfix est un serveur de messagerie open-source qui a été conçu pour être une alternative plus rapide, plus facile à administrer et plus sécurisée à Sendmail qui est installé par défaut sur Debian. Il est très modulaire et peut être configuré pour être très sécurisé. Pour en savoir plus, voici le site officiel.

Dovecot

Dovecot est un serveur IMAP et POP3 open-source qui a été conçu pour être sécurisé et facile à configurer. Il est très modulaire et peut être configuré pour être très sécurisé. Pour en savoir plus, voici le site officiel.

Prérequis

Nom de domaine

Pour mettre en place un serveur mail, il est nécessaire d'avoir un nom de domaine. Si vous n'en avez pas, vous pouvez en acheter via un registrar tel que Infomaniak, OVH, Gandi, etc. Ce nom de domaine vous permettra de créer des adresses e-mail personnalisées se terminant par votre nom de domaine plutôt que par des domaines tels que gmail.com, hotmail.com, etc.

Serveur web

Pour la gestion de votre serveur mail, on utilisera PostfixAdmin qui est une interface web. Il est donc nécessaire d'avoir un serveur web comme apache2 ou nginx qui tourne sur votre serveur. Si ce n'est pas le cas, je vous invite à faire cette installation avant de poursuivre.

Configuration DNS

En général, je rajoute un enregistrement DNS qui permet d'utiliser "mail" en préfix du nom de domaine pour pointer sur le serveur mail. Ce qui permettra d'utiliser mail.exemple.be comme adresse pour votre serveur mail. Si un tel enregistrement n'est pas présent dans vos enregistrement DNS, rajoutez-le. Voici un exemple d'enregistrement DNS CNAME :

mail IN CNAME exemple.be.

Dans le cas où votre serveur mail n'est pas sur la même adresse ip que l'enregistrement A de votre domaine, créez un champ A pour votre serveur mail. Voici un exemple :

IN A 51.xxx.xxx.xxx

Il faut que dans vos enregistrements DNS, il y ait un enregistrement MX qui pointe vers l'adresse ip du serveur sur lequel vous installez votre serveur mail. Si ce n'est pas fait, ajoutez l'enregistrement MX dans votre zone DNS. Voici un exemple d'enregistrement MX :

IN MX 10 exemple.be.

Création de l'utilisateur mail

Créez un utilisateur qui sera l'utilisateur utilisé pour votre serveur mail.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail -m

Installation et configuration de Postfix

Installation de Postfix

Commençons par l'installation et la configuration de postfix.

Premièrement, installez postfix et les dépendances nécessaires avec cette commande :

apt-get install postfix postfix-mysql libsasl2-modules sasl2-bin

Installation de PostfixAdmin

PostfixAdmin est une interface web qui vous permettra de configurer votre serveur mail. Exécutez cette commande pour installer PostfixAdmin :

apt-get install postfixadmin

Étape 1: Choix de la configuration

Postfixadmin configuration etape 1

À cette étape, choisissez "site internet".

Étape 2: Configuration du nom de domaine

PostfixAdmin configuration étape 2 Ici, renseignez le nom de domaine que vous utilisez pour votre serveur mail.

Étape 3: Configuration de la base de données

PostfixAdmin configuration étape 3 Choisissez "oui" pour la configuration de la base de données.

Étape 4: Configuration du mot de passe de la base de données

PostfixAdmin configuration étape 4 Renseignez le mot de passe de la base de données et conservez-le.

Configuration de PostfixAdmin

Pour pouvoir accéder à la configuration de Postfix, créez un raccourci vers PostfixAdmin dans votre serveur web.

sudo ln -s /usr/share/postfixadmin /var/www/postfixadmin #Changez le chemin avec celui qui correspond à votre configuration web

Setup password

Une fois le raccourci créé, accédez à la configuration via l'interface web en rajoutant "/postfixadmin/public/setup.php" à l'url de votre serveur web. Vous devriez accéder à une page qui ressemble à ça :

PostfixAdmin setup

Dans mon cas, j'ai déjà un setup_password de configuré, l'interface est donc légèrement différente. À cette étape, vous devez configurer ce setup_password, utilisez la section "Generate setup_password", inscrivez 2 fois votre setup_password (que vous devez retenir). Ensuite, vous obtiendrez un hash qu'il faudra inscrire dans le fichier config.inc.php de PostfixAdmin.

Le fichier config.inc.php se trouve dans /etc/postfixadmin, ouvrez-le et cherchez l'entrée $CONF['setup_password'], remplacez la valeur par le hash que vous avez obtenu. Voici un exemple de ce que vous devriez avoir :

// In order to setup Postfixadmin, you MUST specify a hashed password here.
// To create the hash, visit setup.php in a browser and type a password into the field,
// on submission it will be echoed out to you as a hashed value.
$CONF['setup_password'] = 'votre_hash';

Création du compte super admin

Une fois que vous avez défini votre setup_password, retournez sur l'url "/postfixadmin/public/setup.php" et utilisez la section "Login with setup_password" pour vous connecter à l'interface de configuration. Indiquez votre setup_password et cliquez sur "Login with setup_password".

Vous accéderez à une page avec une section "Add Superadmin Account" qui ressemble à ceci : PostfixAdmin création d'un compte super admin

Utilisez cette section pour créer un compte superadmin, ce compte vous permettra de gérer les domaines et les utilisateurs de votre serveur mail.

Ajout d'un nom de domaine

Une fois le compte créé, allez sur l'url suivante "/postfixadmin/public/login.php" et connectez-vous avec le compte que vous venez de créer.

Cliquez sur la liste des domaines pour ajouter le nom de domaine qui sera utilisé pour vos adresses mail. Cliquez sur "Ajouter un domaine" et renseignez votre nom de domaine.

PostfixAdmin ajout d'un nom de domaine

Une fois les différents champs complétés, cliquez sur "Ajouter un domaine".

Création d'un compte mail

Maintenant, nous allons ajouter un compte mail (je n'aime pas le mot courriel 😊). Pour cela, cliquez sur "Liste des virtuels" et allez dans le bas de la page à la section "Comptes courriels". Cliquez sur "Ajouter un compte courriel".

PostfixAdmin création d'un compte mail

Remplissez les différents champs et sélectionnez le nom de domaine que vous avez ajouté précédemment. Cliquez sur "Ajouter un compte courriel" et voilà, vous avez créé votre premier compte mail !

Configuration de Postfix

Pour commencer la configuration, ouvrez ou créez le fichier "/etc/postfix/mysql-virtual-mailbox-domains.cf" et mettez-y ceci :

user = postfixadmin #cette utilisateur a été renseigné lors de l'installation du package postfixadmin
password = //mettre le mot de passe
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT 1 FROM domain WHERE domain='%s'

Pour activer cette configuration, exécutez cette commande :

postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Pour tester si postfix se connecte bien à la base de données, exécutez cette commande :

postmap -q example.be mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf #remplacez example.be par le nom de domaine que vous avez ajouté

Si tout est bien configuré, vous devriez obtenir un "1" en retour.

Ouvrez ou créez le fichier "/etc/postfix/mysql-virtual-alias-maps.cf" et mettez-y ceci :

user = postfixadmin #cette utilisateur a été renseigné lors de l'installation du package postfixadmin
password = //mettre le mot de passe
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT username FROM mailbox WHERE username='%s'

Pour activer cette configuration, exécutez cette commande :

postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Pour tester si postfix se connecte bien à la base de données, exécutez cette commande :

postmap -q [email protected] mysql:/etc/postfix/mysql-virtual-alias-maps.cf #remplacez [email protected] par le compte mail que vous avez précédemment créé

Ouvrez ou créez le fichier "/etc/postfix/mysql-virtual-mailbox-maps.cf" et mettez-y ceci :

user = postfixadmin #cette utilisateur a été renseigné lors de l'installation du package postfixadmin
password = //mettre le mot de passe
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT 1 FROM mailbox WHERE username='%s'

Pour activer cette configuration, exécutez cette commande :

postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Changez les droits des différents fichiers créés avec cette commande :

chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Ouvrez le fichier "/etc/postfix/master.cf" et décommentez la ligne suivante :

submission inet n       -       -       -       -       smtpd

Ouvrez le fichier "/etc/postfix/main.cf" et ajoutez les lignes suivantes à la fin du fichier :

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

Changez la valeur de "myhostname" par le nom de domaine de votre serveur mail.

myhostname = exemple.be

Et changez la valeur de mydestination pour qu'elle pointe vers l'adresse locale :

mydestination = localhost

Création d'un certificat SSL pour Postfix avec Certbot

Pour générer un certificat SSL pour votre serveur mail, nous allons utiliser Certbot (anciennement Let's encrypt).

Pour commencer, installez Certbot avec cette commande :

apt-get install certbot

Stoppez votre serveur web pour que Certbot puisse utiliser le port 80 :

sudo service apache2 stop #Si vous utilisez apache2
sudo service nginx stop #Si vous utilisez nginx

Ensuite, générez un certificat SSL pour votre serveur mail avec cette commande :

certbot certonly --standalone -d exemple.be #Changer exemple.be par votre nom de domaine

Voilà votre certificat est généré, vous pouvez redémarrer votre serveur web :

sudo service apache2 start #Si vous utilisez apache2
sudo service nginx start #Si vous utilisez nginx

Configuration de Postfix pour utiliser le certificat SSL

Toujours dans le fichier "/etc/postfix/main.cf", allez à la section "TLS parameters" ou créez-la si elle n'existe pas. Cette section doit ressembler à ça :

#smtpd : SMTP entrant
smtpd_tls_protocols = !SSLv2, !SSLv3, TLSv1.1, TLSv1.2
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, TLSv1.1, TLSv1.2
smtpd_tls_mandatory_ciphers = high
smtpd_tls_security_level = may

#smtp : SMTP sortant
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, TLSv1.1, TLSv1.2
smtp_tls_mandatory_ciphers = high
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, TLSv1.1, TLSv1.2
smtp_tls_mandatory_ciphers = high
smtp_tls_security_level = may
tls_high_cipherlist = HIGH:!aNULL:!MD5:!ADH:!RC4:!DH 
smtpd_tls_cert_file=/etc/letsencrypt/live/exemple.be/fullchain.pem #Changer exemple.be par votre nom de domaine
smtpd_tls_key_file=/etc/letsencrypt/live/exemple.be/privkey.pem #Changer exemple.be par votre nom de domaine
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Installation et configuration de Dovecot

Allez dans le répertoire /etc/dovecot/conf.d/. Ouvrez le fichier "10-auth.conf". Définissez "auth_mechanisms" à plain login :

auth_mechanisms = plain login

Modifiez les includes à la fin du fichier, ils doivent ressembler à ça :

#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

Ouvrez le fichier auth-sql.conf.ext. Remplacez le userdb existant par :

userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Ouvrez 10-mail.conf. Définissez mail_location comme ça :

mail_location = maildir:/var/vmail/%d/%n/Maildir

Ouvrez 10-master.conf. Définissez service auth comme ça :

unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}

Ouvrez 10-ssl.conf. Définissez ssl à yes :

ssl = yes

Définissez ssl_cert et ssl_key comme ça :

ssl_cert = </etc/letsencrypt/live/exemple.be/fullchain.pem
ssl_key = </etc/letsencrypt/live/exemple.be/privkey.pem
#Changez exemple.be par votre nom de domaine

Ouvrez 15-lda.conf. Définissez le protocol lda comme ça :

protocol lda {
mail_plugins = $mail_plugins sieve
}

Ouvrez le fichier /etc/dovecot/dovecot-sql.conf.ext. À la fin du fichier, modifiez ou ajoutez ces 3 lignes :

driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=mdp #Changer mdp par le mot de passe
password_query = SELECT username,domain,password FROM mailbox WHERE username='%u';

Changez les droits du fichier "dovecot-sql.conf.ext" avec cette commande :

chown root:root /etc/dovecot/dovecot-sql.conf.ext
chmod go= /etc/dovecot/dovecot-sql.conf.ext

Changez les droits pour que l'utilisateur vmail créé précédemment puisse accéder à la configuration de dovecot :

chgrp vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

Redémarrez dovecot avec cette commande :

service dovecot restart

Liaison de Postfix et Dovecot

Ouvrez le fichier "/etc/postfix/master.cf" et ajoutez ces lignes à la fin du fichier :

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

Redémarrez postfix avec cette commande :

service postfix restart

Exécutez ces 2 commandes pour mettre à jour la configuration de postfix :

postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1

À ce stade, vous avez un serveur mail fonctionnel auquel vous pouvez déjà vous connecter avec un client mail tel que Mozilla Thunderbird ou Gmail sur votre téléphone. Il est aussi possible d'installer un client mail tel que Rainloop directement sur votre serveur web pour visualiser vos mails via une interface web.

Pour configurer votre client mail, utilisez les paramètres suivants :

Serveur mail: mail.exemple.be #Changez exemple.be par votre nom de domaine
Port SMTP: 587
Port IMAP: 143
Sécurité: STARTTLS #il faut parfois dire qu'on accepte tous les certificats

Configurez vos DNS pour (tenter) de ne pas finir dans les spams

"Tenter", car il n'est pas possible d'être sûr à 100% de ne pas finir dans les spams. Vous pouvez configurer au mieux votre serveur mail, mais si GMail ou Outlook décide que votre serveur mail est un spam, il finira dans les spams. La seule chose que vous pouvez faire, c'est travailler la notoriété de votre serveur mail au fil du temps. Vous pouvez, par exemple, demandez à vos interlocuteurs de signaler votre mail comme non-spam dans le cas où il finirait dans les spams. Et bien sûr, utilisez votre adresse mail en n'envoyant pas de spam 😊.

Sender Policy Framework (SPF)

Le SPF est un mécanisme qui permet de vérifier que le serveur qui envoie un mail est bien autorisé à envoyer des mails pour le domaine de l'adresse mail.

Pour mettre en place ce mécanisme, installez postfix-policyd-spf-python avec cette commande :

apt-get install postfix-policyd-spf-python

Ensuite, ouvrez le fichier "/etc/postfix/master.cf" et ajoutez ces lignes à la fin du fichier :

policy-spf  unix  -       n       n       -       -       spawn
     user=nobody argv=/usr/bin/policyd-spf

Ouvrez le fichier "/etc/postfix/main.cf" et modifiez la valeur de smtpd_recipient_restrictions pour qu'elle soit égale à ça :

smtpd_recipient_restrictions =
    permit_sasl_authenticated,
    reject_invalid_hostname,
    reject_unknown_recipient_domain,
    reject_unauth_destination,
    reject_rbl_client sbl.spamhaus.org,
    check_policy_service unix:private/policy-spf,
    permit

Et ajoutez cette ligne à la fin du fichier :

policy-spf_time_limit = 3600s

Maintenant, il faut configurer le SPF au niveau de vos DNS. Ajoutez un enregistrement TXT à votre zone DNS avec cette valeur :

"v=spf1 a mx ip4:0.0.0.0 ~all"
#Remplacez 0.0.0.0 par l'adresse ip de votre serveur mail

Vous pouvez changer le "~all" soit par "-all" pour dire que seul le serveur mail est autorisé à envoyer des mails pour votre domaine, soit "+all" pour dire que tout le monde est autorisé à envoyer des mails pour votre domaine. En laissant "~all", vous dites que le serveur mail est autorisé à envoyer des mails pour votre domaine, mais que d'autres serveurs peuvent aussi envoyer des mails pour votre domaine. Dans le cas où vous avez un site web qui envoie des mails avec votre nom de domaine, mais qui ne se trouve pas sur le même serveur, c'est intéressant de laisser le "~all". Pour plus de détails sur la configuration SPF, voici un article qui explique comment le configurer.

DomainKeys Identified Mail (DKIM)

Le DKIM est un mécanisme qui permet de vérifier que le contenu du mail n'a pas été modifié depuis l'envoi du mail.

Pour mettre en place ce mécanisme, installez OpenDKIM avec cette commande :

apt-get install opendkim opendkim-tools

Ouvrez le fichier "/etc/opendkim.conf" et modifiez le pour qu'il ressemble à ça :

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  Yes
SyslogSuccess           Yes
LogWhy                  Yes

OversignHeaders         From
AlwaysAddARHeader       Yes
Canonicalization        relaxed/simple

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  local:/var/spool/postfix/opendkim/opendkim.sock

Ouvrez le fichier "/etc/default/opendkim" et changez la socket pour qu'elle ait cette valeur :

SOCKET=local:/var/spool/postfix/opendkim/opendkim.sock

Créez le répertoire "/etc/opendkim" et créez un fichier "TrustedHosts" et mettez-y ceci :

127.0.0.1
localhost
::1
*.exemple.be #Changez exemple.com par votre nom de domaine

Ouvrez le fichier "/etc/postfix/main.cf" et ajoutez ces lignes à la fin du fichier :

# OpenDkdim
milter_protocol = 6
milter_default_action = accept
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = local:/opendkim/opendkim.sock

Dans "/etc/opendkim" créez le fichier KeyTable et mettez-y ceci :

mail._domainkey.exemple.be exemple.be:mail:/etc/opendkim/keys/exemple.com/mail.private
#Changez exemple.be par votre nom de domaine

Maintenant, il faut générer une clé DKIM. Effectuez ces commandes pour créer la clé :

mkdir -p /etc/opendkim/keys/exemple.be #Changez exemple.be par votre nom de domaine
cd /etc/opendkim/keys/exemple.be #Changez exemple.be par votre nom de domaine
opendkim-genkey -s mail -d exemple.be #Changez exemple.be par votre nom de domaine
#Petit tips, si votre hébergeur ne vous permet pas de mettre de grande clé, ajoutez un paramètre -b à la commande pour gérer la taille de la clé
chown opendkim:opendkim mail.private

Retournez dans le répertoire "/etc/opendkim" et créez le fichier SigningTable et mettez-y ceci :

*@exemple.be mail._domainkey.exemple.be #Changez exemple.be par votre nom de domaine

Effectuez la commande:

cat /etc/opendkim/keys/exemple.com/mail.txt

Et copier votre clé DKIM qui se trouve entre les 2 guillemets. Une fois la clé copiée, allez dans la configuration de votre zone DNS et ajoutez un enregistrement qui a comme clé "mail._domainkey." et comme valeur la clé que vous avez copiée :

mail._domainkey IN TXT "v=DKIM1;h=sha256;k=rsa;p=vote_clé"

Pour finir la configuration DKIM, créez le répertoire de la socket OpenDkim et changez les droits des fichiers avec ces commandes :

mkdir -p /var/spool/postfix/opendkim
chown opendkim:opendkim /var/spool/postfix/opendkim/
usermod -a -G opendkim postfix

Et ensuite, redémarrez les services avec ces commandes :

service postfix restart
service opendkim restart

Domain-based Message Authentication, Reporting, and Conformance (DMARC)

Le DMARC est un mécanisme qui permet de vérifier que le serveur qui envoie un mail est bien autorisé à envoyer des mails pour le domaine de l'adresse mail.

Pour mettre en place ce mécanisme, ajoutez un enregistrement TXT à votre zone DNS qui a comme clé "_dmarc." :

_dmarc IN TXT "v=DMARC1; p=none"

Vous avez la possibilité de modifier la valeur de "p". Vous pouvez la mettre à "none" pour indiquer que vous ne souhaitez pas de rapport. Vous pouvez aussi la mettre à "quarantine" pour spécifier que les e-mails ne passant pas le SPF et le DKIM doivent être dirigés vers les spams. Enfin, vous pouvez la mettre à "reject" pour indiquer que les e-mails non conformes au SPF et au DKIM doivent être rejetés. Pour plus de détail sur la configuration DMARC, voici un article qui explique comment le configurer.

Testez votre serveur mail

Pour tester que votre serveur mail est bien configuré, vous pouvez utiliser Mail Tester. Envoyez un mail à l'adresse mail qui vous est donné et vous obtiendrez un score qui vous indiquera si votre serveur mail est bien configuré. Si ce n'est pas le cas, vous recevrez des indications sur les points à améliorer.

Conclusion

Voilà, vous avez mis en place votre propre serveur mail en utilisant Postfix et Dovecot et en respectant les bonnes pratiques pour vous assurer une sécurité et délivrabilité maximum! Vous pouvez maintenant envoyer et recevoir des mails avec votre propre nom de domaine.

N'attendez plus pour lancer votre projet

Prenons contact