Mise à jour du 16/04/2024.
Les MTA pour Linux ne reconnaissent que les utilisateurs locaux. Les utilisateurs locaux sont les utilisateurs autorisés à se connecter à votre serveur Linux. Ce n'est pas le type de serveur de messagerie que nous voulons. Au lieu de cela, nous voulons configurer le MTA pour un groupe d'utilisateurs (adresses courriel comme par exemple bal@piapp.fr), qui n'ont pas accès à notre serveur Linux. C'est là qu'intervient les BAL virtuelles. Ce sont des BAL (virtuelles) mais qui ne sont pas associées à des comptes Linux. Tout au long de cet article, vous devez remplacer piapp.fr par votre propre nom de domaine Internet.
Avant de commencer, vous devez décider du nom du "rôle" qui gérera le "schéma" (base de données) utilisé par le système de messagerie. Pour nos exemple, nous choisissons de créer le "rôle" adminmail pour gérer le "schéma" mail. Vous devez aussi associer à votre "rôle" son mot de passe. Il est recommandé de s'en tenir aux lettres et aux chiffres car les symboles peuvent parfois créer des effets de bords en nécessitant des caractères d'échappement avant d'être transmis aux différents scripts. C'est donc une source importante d'erreur difficile à déceler. Pour créer des mots de passe de ce type, vous pouvez utiliser une commande comme apg(avec les options limitant les mots de passe aux lettres et chiffres).
Bien que l'emploi d'outils graphiques comme pgadmin4 soit très pratique, tout devrait pouvoir se réaliser en mode console. Voici les commandes à créer depuis un outil SQL comme psql lancé sur la base postgres à partir d'un compte DBA :
CREATE USER adminmail WITH PASSWORD '[ mot de passe]'; CREATE DATABASE mail; GRANT ALL ON DATABASE mail TO adminmail;
Reste maintenant à créer le schéma de données et à peupler ses tables de nos premières valeurs. Nous voulons que PostgreSQL puisse créer des données hash-codées et chiffrés. Pour les données chiffrées, nous devons ajouter à notre base de données l'extension pgcrypto. A partir d'un compte DBA et en utilisant la commande psql, tapez la commande :
CREATE EXTENSION pgcrypto;
Chaque base de données SQL est un ensemble d'objets dont les plus fréquents sont les tables. Nous allons désormais nous connecter à la base de données mail avec le compte adminmail. Pour cela, la commande à lancer est :
psql -u adminmail -d mail -w
Vous devrez saisir le mot de passe du compte adminmail afin de pouvoir réaliser cette connexion et ainsi modifier le schéma. La première table que nous allons créer est le domaine de messagerie pour lequel notre serveur sera utilisé (piapp.fr) :
CREATE TABLE virtual_domains( id SERIAL PRIMARY KEY, name varchar(50) NOT NULL );
La seconde table à créer est celle des BAL virtuelles. Il s'agit de table principale qui stocke les adresses courriel et les mots de passe hash-codés. Vous pouvez définir le stockage de quota par défaut que vous souhaitez. Ici, il a été mis à 5 gio. Ceci est basé sur la documentation des quotas de Dovecot, recommandant l'utilisation des suffixes b, k, M, G, T ou %.
CREATE TABLE virtual_users(
id SERIAL PRIMARY KEY,
domain_id int NOT NULL,
email varchar(100) NOT NULL UNIQUE,
password varchar(250) NOT NULL,
quota varchar(20) DEFAULT '5G',
created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (domain_id) REFERENCES public.virtual_domains (id)
ON DELETE SET NULL
ON UPDATE CASCADE
);Notez la clef étrangère domain_id qui référence le domaine virtuel auquel appartient la BAL.
La 3ème table est celle des alias. Les alias sont importants pour référencer des adresses courriels spécifiques vers un compte. Par exemple, supposons que vous créez votre adresse courriel personnelle sous la forme moi@piapp.fr. Vous pouvez référencer les courriels sources (par exemple, postmaster@piapp.fr, webmaster@piapp.fr et abuse@piapp.fr) vers une même destination : moi@piapp.fr.
CREATE TABLE virtual_aliases( id SERIAL PRIMARY KEY, domain_id int NOT NULL, source varchar(100) NOT NULL, destination varchar(100) NOT NULL, FOREIGN KEY (domain_id) REFERENCES public.virtual_domains (id) ON DELETE SET NULL ON UPDATE CASCADE );
Nous déclarons ensuite notre domaine virtuel :
INSERT INTO public.virtual_domains (name) VALUES ('piapp.fr');Pour les adresses courriel, il est recommandé de stocker les mots de passe sous une forme chiffrée ou d'enregistrer leur code de hachage.
Si vous avez l'intention d'utiliser des outils Web PHP comme client de messagerie (roundcube, Zinbra, etc.) vous aurez intérêt à utiliser une méthode de hachage compatible avec PHP. A cette fin, vous livrons un script PHP qui crée le code de hachage SHA512 d'un mot de passe avec sa propre fonction crypt() comme indiqué ci-dessous. Il est aisé de reprendre ce script dans une page Web PHP pour permettre aux utilisateurs de modifier leur mot de passe. Pour le hachage du mot de passe, nous utiliserons SHA512 avec un alea de 16 caractères. Le préfixe $6$ signifie un code de hachage SHA512. Le script PHP sera exécuté pour chaque mot de passe.
<?php
// Saisie du mot de passe
$stdin = fopen('php://stdin', 'r');
echo 'Mot de passe : ';
$pass = trim(fgets($stdin));
// Initialisation des données de l'alea
$i = 0;
$salt = '';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$chars .= strtolower($chars);
$chars .= '0123456789';
$max = strlen($chars);
// Création de l'alea
while ($i < 16) {
$i = $i + 1;
$salt .= $chars[rand(0,$max - 1)];
}
// Création du hash-code du mot de passe
$passHash = crypt($pass, '$6$rounds=5000$'.$salt);
echo $passHash;
echo PHP_EOL;
?>Nous nommons le fichier de script passwordHashCode.php. L'exécution se fait au moyen de la commande :
php -f passwordHashCode.php
Cette façon de faire est plutôt commune sur le Web mais ce n'est pas la seule. En effet, PHP est une plate-forme "risquée" dans la mesure où sa généralisation en a fait une cible privilégiée des pirates. Si vous ne devez pas utiliser de client de messagerie PHP, la documentation du projet Dovecotfournit d'autres méthodes plus résilientes via l'utilitaire doveadm. En voici quelques exemples pour le mot de passe 'secret' :
doveadm pw -s SHA512-CRYPT -p secret
{SHA512-CRYPT}$6$qCJ8zcE7PPhz6lR6$DU8B19L/Sh4V1qD4Y.W1nwchW/gYRtZ5o1JGyiR4FUadw.bqPVzjPPH22dl3G30.h9j3vyRj7ukvkYq.lLfkw0
doveadm pw -s BLF-CRYPT -r 10 -p 'mon mot de passe'
{BLF-CRYPT}$2y$10$Hpu1noFjF5BmW.1m3VmTGuxguCXRIJYbbc6cue5h/WK/dNkGF8khC
doveadm pw -s ARGON2I -p 'mon mot de passe'
{ARGON2I}$argon2i$v=19$m=32768,t=4,p=1$FXVdzdfu/QlCcr16SuPWiw$8CZn84NXl5YcIK/C2eP3Kfe6TVYQaCc070TicBMnZ2kA chaque "schéma" (méthode de chiffrement ou de hachage), correspond une valeur du paramètre default_pass_scheme dans le fichier /etc/dovecot/dovecot-sql.conf.ext.
Nous allons créer deux mots de passe puis insérer deux BAL :
INSERT INTO public.virtual_users
(domain_id,email,password)
VALUES
('1','jmp@piapp.fr','[password1-hash]'),
('1','admin@piapp.fr','[password2-hash]');Nous insérons ensuite quelques alias ces 2 BAL :
INSERT INTO public.virtual_aliases
(domain_id,source,destination)
VALUES
('1', 'root', 'admin@piapp.fr'),
('1', ''[compte Linux]', 'admin@piapp.fr'),
('1', 'postmaster@piapp.fr', 'admin@piapp.fr'),
('1', 'webmaster@piapp.fr', 'admin@piapp.fr'),
('1', 'abuse@dpiapp.fr', 'admin@piapp.fr'),
('1', 'www-data', 'jmp@piapp.fr');Maintenant que la base de données de messagerie virtuelle est configurée, installons le serveur de messagerie.
Rédaction par Jean-Marie Piatte (1983-2021)