[tuto][linux][intermédiaire] Serveur mail avec Postfix + Postfixadmin et Dovecot + RoundCube

Tu as une bonne connaissance de Linux et tu es capable d'adapter le système à ta convenance.
Avatar de l’utilisateur
N4T0R4
Administrateur
Messages : 40
Inscription : 09 décembre 2023, 21:45

[tuto][linux][intermédiaire] Serveur mail avec Postfix + Postfixadmin et Dovecot + RoundCube

Message par N4T0R4 »

Ce guide montre comment configurer un serveur de messagerie à part entière sur un serveur avec Linux Debian 12. La tâche consiste à obtenir un serveur mail prêt à l'emploi avec la possibilité de gérer des domaines et des boîtes aux lettres via une interface Web. Nous installerons les services de messagerie de base, l'outil d'administration postfixadmin avec lequel vous pouvez ajouter des domaines, des adresses e-mail, ainsi que l'interface Web roundcube pour un travail pratique avec le courrier via un navigateur. Dans ce guide, nous installons en tant que root, si vous avez un compte normal, utilisez la commande sudo.

Sommaire

1. Installer et configurer PostfixAdmin
2. Installer et configurer Postfix
3. Installer et configurer Dovecot
4. Configurer un domaine et des boîtes aux lettres
5. Installer et configurer Roundcube

Prérequis

Configurer son hostname :

Code : Tout sélectionner

hostnamectl set-hostname serv.domain.tld
Configurer les DNS pour son domaine :

Code : Tout sélectionner

@	MX	mail.domain.tld
mail	A	<IP_du_serveur>
Mettre à jour son système :

Code : Tout sélectionner

apt update & apt-upgrade
Installer un serveur Web + PHP + MySQL ou MariaDB :

Nous aurons besoin de cet ensemble pour le fonctionnement de l'interface Web de messagerie, du système d'administration et de gestion de la boîte aux lettres, ainsi que de la base de données pour stocker les paramètres.

Serveur Web avec Nginx + MariaDB + PHP (LEMP)
Serveur Web avec Lighttpd + PHP + MariaDB

Configurer son pare-feu pour les services de messagerie :

Si vous avez un pare-feu, assurez-vous que les ports 25,110,143,465,587,993 et 995 sont ouverts.
Si vous avez suivi le tutoriel Sécuriser son serveur : SSH et firewall avec iptables, ajoutez la règle suivante dans /etc/iptables-rules.sh :

Code : Tout sélectionner

iptables -I INPUT 1 -p tcp --match multiport --dports 25,110,143,465,587,993,995 -j ACCEPT
iptables -I OUTPUT 1 -p tcp --match multiport --dports 25,110,143,465,587,993,995 -j ACCEPT
Redémarrer le firewall.

Pour connaitre les ports TCP ouverts sur son serveur, utiliser nmap ou un outil en ligne comme :
https://www.ipvoid.com/port-scan/
1. Installer et configurer PostfixAdmin

Cet outil permet de gérer le serveur de messagerie via une interface Web sans recourir à la console.

1.1. Installation

Pour connaitre la dernière version de postfixadmin :

https://github.com/postfixadmin/postfixadmin

SOLUTION 1 : installer le package

Code : Tout sélectionner

apt install postfixadmin
Laissez-vous guider.

SOLUTION 2 : installation manuelle

Télécharger et placer postfixadmin dans /var/www/postfixadmin (remplacer /var/www/ par le répertoire configuré dans votre serveur Web) :

Code : Tout sélectionner

apt install php-mysql php-mbstring php-imap
systemctl restart php8.2-fpm
apt install wget
wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz
mkdir /var/www/postfixadmin
tar -C /var/www/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1
Créer le répertoire "templates_c" et donner les droits d'accès du serveur sur /postfixadmin :

Code : Tout sélectionner

mkdir /var/www/postfixadmin/templates_c
chown -R www-data:www-data /var/www/postfixadmin
1.2. Création de la base de données

Code : Tout sélectionner

mysql -u root -p
On commence par créer la une base de données "postfix" :

Code : Tout sélectionner

> CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Puis on créer un utilisateur du même nom (choisissez un mot de passe) et on lui donne les droits d'accès à la base :

Code : Tout sélectionner

> GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'un_mot_de_passe';
On quitte MySQL :

Code : Tout sélectionner

> quit;
1.3. Configuration

On créer un fichier de configuration local :

Code : Tout sélectionner

nano /var/www/postfixadmin/config.local.php
Mettre le contenu comme ceci :

Code : Tout sélectionner

<?php
$CONF['configured'] = true;
$CONF['default_language'] = 'fr';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_port'] = '3306';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'le_mot_de_passe_postfix';
$CONF['database_name'] = 'postfix';
$CONF['encrypt'] = 'php_crypt:SHA512';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5";
if(@file_exists('/usr/bin/doveadm')) { // @ to silence openbase_dir stuff; see https://github.com/postfixadmin/postfixadmin/issues/171
    $CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5"; # debian
}
Ouvrez un navigateur et entrez l'adresse http://<votre-ip>/postfixadmin/public/setup.php

Vous devez trouver un mot de passe, puis cliquer sur le bouton Generate setup_password hash, pour générer un hachage.

Copiez la ligne entière et ajoutez-la à la fin du fichier :

Code : Tout sélectionner

nano /var/www/postfixadmin/config.local.php

Code : Tout sélectionner

...
$CONF['setup_password'] = '$2y$10$GJmg2kWevIWzibWe6XeypG2OF/msblSn1z6pfz7NhpXFVRu';
Actualiser la page http://<votre-ip>/postfixadmin/public/setup.php et connectez-vous avec le mot de passe choisi.

PostfixAdmin est installé.

Ensuite, nous devons ajouter un super utilisateur (un utilisateur avec tous les droits).
Dans le champ Admin, vous devez spécifier l'utilisateur sous forme de mail user@domain.tld

Passons maintenant à la page http://<votre-ip>/postfixadmin/public/login.php et entrez les données de l'utilisateur créé.
2. Installer et configurer Postfix

Postfix est le serveur SMTP de messagerie électronique libre le plus répandu. Il se charge de la livraison des e-mails et a été conçu de façon modulaire autour de différents programmes dévolus chacun à une tâche précise. Cela le rend résistant en terme de sécurité, tout en étant extensible. Plusieurs commandes servent à l'administrer, en voici quelques unes :
  • postfix : pour démarrer, arrêter et redémarrer Postfix (root seulement)
  • postconf : affiche ou permet d'éditer les paramètres du fichier main.cf
  • postalias : maintient les bases de données alias de Postfix (cf : newaliases)
  • postmap : maintient les tables de correspondances de Postfix (cf : hash)
  • postsuper : maintient la file d'attente
Dans la plupart des cas, la configuration suggérée ici sera à adapter à votre situation. En effet, celle-ci est relativement longue à mettre en place selon les mécanismes de stockage et d'identification choisis.

A tout instant, vous pourrez vérifier la configuration grâce à :

Code : Tout sélectionner

postfix check
puis la recharger avec

Code : Tout sélectionner

postfix reload
L'outil postconf vous permet d'afficher la configuration de Postfix avec les arguments suivants :

postconf -d : affiche les paramètres par défaut de Postfix au lieu de ceux utilisés
postconf -n : affiche les paramètres modifiés par rapport aux valeurs par défaut
postconf -v : affiche la totalité des paramètres utilisés
postconf -e 'biff = no' : édite le fichier main.cf (ajoute ou modifie la ligne mentionnée)

2.1. Installation

Code : Tout sélectionner

apt install postfix postfix-mysql
Lors de l'installation, la fenêtre de configuration de Postfix apparaîtra, répondez "site internet" à la première question (les autres ne nous intéressent pas), puis donnez le nom de domaine que vous avez pris (example.org par exemple) à la suivante.

Pour connaitre la version installée :

Code : Tout sélectionner

postconf mail_version
mail_version = 3.7.6

On créer ensuite un groupe et un utilisateurs vmail avec comme uid et gid 2000 :

Code : Tout sélectionner

groupadd -g 2000 vmail
adduser vmail --system --group --uid 2000 --disabled-login --no-create-home

On créer le répertoire vmail et on donne les droits à vmail :

Code : Tout sélectionner

mkdir /var/vmail
chown vmail:vmail /var/vmail
2.2. Configuration minimale

Postfix utilise 2 fichiers de configuration que l'on trouve dans /etc/postfix/ :

Le fichier main.cf définit les options générales de Postfix.
Le fichier master.cf, lui sert à gérer les sous process de Postfix et permet de modifier certains paramètres du fichier main.cf en les surchargeant (option -o).

Code : Tout sélectionner

nano /etc/postfix/main.cf

Code : Tout sélectionner

mydestination = localhost.$mydomain, localhost, localhost.localdomain
Ajouter les lignes suivantes à la fin du fichier de configuration :

Code : Tout sélectionner

virtual_mailbox_base = /var/vmail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_path = private/auth

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_helo_required = yes

maillog_file = /var/log/mail.log
Ouvrez le fichier de configuration /etc/postfix/master.cf et ajouter à la fin :

Code : Tout sélectionner

submission   inet  n  -  n  -  -  smtpd
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
smtps   inet  n  -  n  -  -  smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
dovecot   unix  -  n  n  -  -  pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
2.3 Configuration des virtuels

Création du fichier d'alias

Code : Tout sélectionner

nano /etc/postfix/mysql_virtual_alias_maps.cf

Code : Tout sélectionner

user = postfix
password = mot_de_passe
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
Création du fichier des domaines

Code : Tout sélectionner

nano /etc/postfix/mysql_virtual_domains_maps.cf

Code : Tout sélectionner

user = postfix
password = mot_de_passe
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%u'
Création du fichier des boites mail

Code : Tout sélectionner

nano /etc/postfix/mysql_virtual_mailbox_maps.cf

Code : Tout sélectionner

user = postfix
password = mot_de_passe
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
2.4 Création des certificats de sécurité SSL

SOLUTION 1 : certificat auto-signé

Code : Tout sélectionner

mkdir -p /etc/ssl/mail
Créons des certificats de sécurité à l'aide de la commande :

Code : Tout sélectionner

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key
Modifier le fichier de configuration /etc/postfix/main.cf :

Code : Tout sélectionner

smtpd_tls_cert_file = /etc/ssl/mail/public.pem
smtpd_tls_key_file = /etc/ssl/mail/private.key
Dans ce cas, nous avons créé un certificat auto-signé, pour qu'il fonctionne sans avertissement de sécurité, vous devez acheter un Certificat SSL.

SOLUTION 2 : Letsencrypt (recommandé)

Voir le tutoriel : Créer des certificats SSL avec letsencrypt.

Dans ce cas, modifier la configuration de /etc/postfix/main.cf en remplacant mail.domain.tld par votre serveur :

Code : Tout sélectionner

smtpd_tls_cert_file = /etc/letsencrypt/live/mail.domain.tld/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.domain.tld/privkey.pem
Redémarrer le service

Code : Tout sélectionner

service postfix restart
2.5 Tester le serveur

Installer mailutils :

Code : Tout sélectionner

apt install mailutils
Envoyer un mail depuis le shell :

Code : Tout sélectionner

echo "TEST" | mail -s "TEST" votre@email.com
Avec OpenSSL :

Code : Tout sélectionner

openssl s_client -connect mail.domain.tld:587 -starttls smtp

EHLO test.fr
MAIL FROM:root@test.fr
RCPT TO:mon@mail.com
DATA
Salut ! Ceci est un mail de test...
.
QUIT
Debug :

[TODO]
3. Installer et configurer Dovecot

Code : Tout sélectionner

apt install dovecot-imapd dovecot-pop3d dovecot-mysql
Pour connaitre la version installée :

Code : Tout sélectionner

dovecot --version
3.1 Configuration du stockage du courrier

Code : Tout sélectionner

nano /etc/dovecot/conf.d/10-mail.conf

Code : Tout sélectionner

mail_location = maildir:/var/vmail/%d/%n/
%u Nom d'utilisateur complet.
%n Partie utilisateur dans user@domain ; identique à %u s’il n’y a pas de domaine.
%d partie de domaine dans user@domain ; vide s'il n'y a pas de domaine.

De cette manière, un mail envoyé à user@domain.tld sera stocké dans /var/vmail/domain.tld/user/.
3.2 Configuration de l'autorisation

Code : Tout sélectionner

nano /etc/dovecot/conf.d/10-master.conf

Code : Tout sélectionner

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

  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
}
Modifier les paramètres d'autorisation de la base de données

Code : Tout sélectionner

nano /etc/dovecot/conf.d/10-auth.conf
Commentons la ligne par défaut et activons la ligne avec le mot sql dans le texte.

Code : Tout sélectionner

#!include auth-system.conf.ext
!include auth-sql.conf.ext
3.3 Configuration des certificats SSL

Créer des certificats SSL avec letsencrypt

Code : Tout sélectionner

nano /etc/dovecot/conf.d/10-ssl.conf

Code : Tout sélectionner

ssl = required
ssl_cert = </etc/letsencrypt/live/mail.domain.tld/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.domain.tld/privkey.pem
Configurons la création automatique de dossiers lors de la première autorisation de l'utilisateur dans le courrier.

Code : Tout sélectionner

nano /etc/dovecot/conf.d/15-lda.conf

Code : Tout sélectionner

lda_mailbox_autocreate = yes
3.4 Configurer une connexion à la base de données

Code : Tout sélectionner

nano /etc/dovecot/conf.d/auth-sql.conf.ext

Code : Tout sélectionner

passdb {
  …
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  …
  args = /etc/dovecot/dovecot-sql.conf.ext
}
3.5 Ajouter des paramètres au fichier de configuration

Code : Tout sélectionner

nano /etc/dovecot/dovecot-sql.conf.ext

Code : Tout sélectionner

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix1HuRaf92
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 2000 AS uid, 2000 AS gid FROM mailbox WHERE username = '%u'
3.6 Configurer l'interface sur laquelle le service s'exécutera

Code : Tout sélectionner

nano /etc/dovecot/dovecot.conf

Code : Tout sélectionner

listen = *
Activer les logs (mode debug) :

Code : Tout sélectionner

auth_verbose = yes
auth_verbose_passwords = no
auth_debug = yes
auth_debug_passwords = yes
mail_debug = yes
verbose_ssl = yes

log_path = /var/log/dovecot.log
3.7. Redémarrage et activation du service

Code : Tout sélectionner

systemctl enable dovecot
systemctl restart dovecot
4. Configurer un domaine et des boîtes aux lettres

Allons à l'interface Web et configurons le domaine pour qu'il fonctionne avec le courrier: http://<votre-ip>/postfixadmin/public/.

Image

Ensuite, ajoutez un domaine (menu du haut > Liste des domaines > Nouveau domaine) :

Image

Après avoir ajouté le domaine, créons une boîte aux lettres.

Image

5. Installer et configurer le service de messagerie Web, Roundcube

Option 1 : installation du paquet

Code : Tout sélectionner

apt install roundcube roundcube-plugins
dpkg-reconfigure roundcube-core
Option 2 : installation manuelle

Téléchargez la dernière version LTS du package et déployez-la sur votre serveur :

https://github.com/roundcube/roundcubemail/

Au moment de ce tutoriel, la version est 1.6.5.

Code : Tout sélectionner

apt install wget
wget https://github.com/roundcube/roundcubemail/releases/download/1.6.5/roundcubemail-1.6.5-complete.tar.gz
mkdir /var/www/webmail
tar -C /var/www/webmail -xvf roundcubemail-*.tar.gz --strip-components 1
cp /var/www/webmail/config/config.inc.php.sample /var/www/webmail/config/config.inc.php
chown -R www-data:www-data /var/www/webmail
Ouvrez le fichier de configuration et modifiez :

Code : Tout sélectionner

nano /var/www/webmail/config/config.inc.php

Code : Tout sélectionner

$config['db_dsnw'] = 'mysql://roundcube:roundcube1Yusm24M@localhost/roundcubemail';
$config['enable_installer'] = true;
Trouvons également le paramètre et rendons-le vide :

Code : Tout sélectionner

$config['smtp_pass'] = '';

Code : Tout sélectionner

nano/var/www/webmail/config/config.inc.php

Code : Tout sélectionner

$config['drafts_mbox'] = 'Drafts';
$config['junk_mbox'] = 'Junk'; 
$config['sent_mbox'] = 'Sent'; 
$config['trash_mbox'] = 'Trash'; 
$config['create_default_folders'] = true;
Créons une base pour roundcubemail dans MariaDB, spécifiée dans le fichier de configuration :

Code : Tout sélectionner

mysql -uroot -p

Code : Tout sélectionner

> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'roundcube1Yusm24M';
> quit
Importation de la base de données:

Code : Tout sélectionner

mysql -uroot -p roundcubemail < /var/www/webmail/SQL/mysql.initial.sql
Installez les packages php nécessaires :

Code : Tout sélectionner

apt install php-pear php-intl php-ldap php-net-smtp php-gd php-imagick php-zip php-curl php-dom php-xml php-mcrypt
Si une erreur s'est produite lors de l'installation de php-mcrypt, installez-le manuellement

Code : Tout sélectionner

apt install php-dev libmcrypt-dev
pecl channel-update pecl.php.net
pecl install mcrypt-1.0.5

Code : Tout sélectionner

nano /etc/php/8.2/fpm/conf.d/99-mcrypt.ini

Code : Tout sélectionner

extension=mcrypt.so
Configurez le service php :

Code : Tout sélectionner

nano /etc/php/8.2/fpm/php.ini

Code : Tout sélectionner

date.timezone = "Europe/Paris"
post_max_size = 50M
upload_max_filesize = 50M
Des limites de 50 mégaoctets sont présentées à titre d'exemple, vous pouvez définir les vôtres, elles vous permettront de joindre des pièces jointes plus volumineuses au courriel.

Code : Tout sélectionner

systemctl restart php8.2-fpm
Fixons les limites dans nginx lui-même

Code : Tout sélectionner

nano /etc/nginx/nginx.conf

Code : Tout sélectionner

http {

    ...
    client_max_body_size 50M;
    ...

Code : Tout sélectionner

systemctl restart nginx
Ensuite, nous continuerons l'installation dans le navigateur en utilisant le lien http://<votre-ip>/webmail/installer/

En suivant les instructions, installez rouncube, puis sur la page suivante, nous vérifions que tous les éléments sont dans l'état OK. Installation terminée.

Supprimez le programme d'installation et désactivez l'installation dans le fichier de configuration

Code : Tout sélectionner

rm -rf /var/www/webmail/installer

Code : Tout sélectionner

nano /var/www/webmail/config/config.inc.php

Code : Tout sélectionner

$config['enable_installer'] = false;
Suivons le lien http://<votre-ip>/webmail/ et accédez à la messagerie Web en utilisant l'adresse e-mail complète et le mot de passe comme identifiant.
6. Dernière étape de configuration

Notre serveur est configuré pour fonctionner avec le courrier, nous devons maintenant enregistrer ou remplacer l'enregistrement MX par l'adresse IP de notre serveur dans les paramètres du nom de domaine :

Code : Tout sélectionner

@	MX	mail.domain.tld
mail	A	<ip_du_serveur>
Une fois les entrées enregistrées, il est nécessaire spécifier la zone inverse pour l'adresse IP (PTR).

Le serveur de messagerie Linux Debain 12 est prêt à fonctionner.
Répondre