Préparation de la base de données - Debian 9.0 Stretch
Rédigé par Marc GUILLAUME | 4 commentairesTraduction de la page : https://workaround.org/ispmail/stretch/preparing-database
Il est maintenant temps de préparer la base de données MariaDB pour y enregistrer les informations de contrôle de votre serveur de mail. Pour cela vous devrez lancer des requêtes SQL, le langage des bases de données relationnelles. Vous pouvez les entrer dans la ligne de commande mysql. Mais si vous êtes moins expérimenté avec MySQL vous pouvez utiliser une application web appellée PhpMyAdmin pour la maintenance de votre base de données.
Configuration de PhpMyAdmin
Installez d'abord le paquet PhpMyAdmin :
apt install phpmyadmin
PhpMyAdmin a besoin de sa propre petite base SQL sur votre serveur pour y enregistrer ses données de configuration. Il va donc vous être demandé si vous voulez que cette base soit créée automatiquement ou si vous désirez la créer par la suite, répondez oui :
Le programme d'installation va également créer un utilisateur spécifique pour autoriser PhpMyAdmin à accéder à sa propre base de données. Son mot de passe n'a pas beaucoup d'importance pour vous. Appuyez juste sur Entrée pour créer un mot de passe alléatoire :
On va également vous demander quel logiciel serveur web vous désirez utiliser. Sélectionnez Apache :
L'installeur va créer un fichier /etc/phpmyadmin/apache.conf qui doit être inclus dans la configuration de votre hôte virtuel HTTPS de manière à ce que vous puissiez y accéder avec votre navigateur. Éditez le fichier /etc/apache2/sites-available/webmail.example.org-https.conf et quelque part entre les balises <VirtualHost>
et </VirtualHost>
mais avant toute autre ligne Include ajoutez cette ligne :
Include /etc/phpmyadmin/apache.conf
Je recommande fortement de désactiver PhpMyAdmin pour tous les autres utilisateurs virtuels qui pourraient exister sur votre serveur :
a2disconf phpmyadmin
Sinon tous vos sites web offriraient un lien /phpmyadmin. Cela pourrait vous induire en erreur et éventuellement vous conduire à l'utiliser accidentellement sur une connexion HTTP (non chiffrée). Si possible vous devriez restreindre par la suite l'accès à PhpMyAdmin pour des raisons de sécurité.
Rechargez le processus Apache :
service apache2 reload
Ouvrez votre navigateur et faites le pointer sur l'URL « https://webmail.example.org/phpmyadmin ». Cela va afficher le formulaire de connexion :
Vous ne pourrez pas encore vous connecter. Le seul utilisateur existant dans la base de données est root et MariaDB vous emêche de l'utiliser avec un mot de passe. Suivez les sections suivantes pour configurer la base de données et commencer par créer un utilisateur de connexion.
Note : PhpMyAdmin par défaut se connecte à la base sur l'hôte localhost, c'est à dire sur le même serveur sur lequel il est installé. Nous allons créer un utilisateur de base de données du nom de mailadmin qui sera capable de se connexter à localhost. Cependant l'utilisateur mailuser qui est utilisé par le processus serveur se connecte à 127.0.0.1. Attendez, c'est quoi ça ? Est-ce que ce n'est pas la même chose que localhost ? En règle générale ça l'est, mais MariaDB et MySQL font une différence. Si vous ouvrez une connexion avec localhost, alors vous parlez au fichier socket se trouvant à /var/run/mysqld/mysqld.sock sur votre serveur. Mais si vous vous connectez à 127.0.0.1 alors vous créez une connexion réseau qui parle à un socket TCP sur le port 3306 sur votre serveur. Du coup votre utilisateur de base de données ‘mailuser’@’127.0.0.1’ ne peut être utilisé par PhpMyAdmin (à moins de modifier sa configuration). Mais l'utilisateur ‘mailadmin’@’localhost’ lui le peut. Vous me suivez toujours ? Alors pourquoi utilisons nous tout de même 127.0.0.1 ? La raison est que Postfix sera cantonné dans son propre répertoire à /var/spool/postfix. Et comme le socket mysql (mysqld.sock) ne se trouve pas dans ce répertoire nous avons besoin d'utiliser une connexion TCP pour sortir de la prison dans laquelle est enfermé Postfix. Pfff… c'est fou non ? 🙂
Création du shéma de base de données
Votre base de données sera utilisée par deux comptes utilisateur :
- « mailuser » (@127.0.0.1 via TCP) aura un acces en lecture à la base de données. Postfix et Dovecot l'utiliseront pour rechercher les informations concernant les domaines de mail et les utilisateurs.
- « mailadmin » (@localhost via un socket) aura un accès en lecture et écriture. Vous pourrez l'utiliser avec PhpMyAdmin pour gérer votre base de données.
Utilisez la commande pwgen pour créer de bons mots de passe aléatoires pour ces comptes :
pwgen -s 25 1
La création de la base de données serait assez pénible si l'on devait la faire avec PhpMyAdmin. Nous allons simplement passer les bonnes commandes SQL au serveur MySQL pour créer la base de données et les tables. Une table, dans la terminologie des bases de données, ressemble assez à une feuille de calcul. Vous avez des lignes et des colonnes. Et les colonnes sont aussi appellées champs (fields en anglais). Les ordres SQL peuvent être entrés dans le shell mysql que vous pouvez atteindre en lançant la commande mysql en tant que root sur votre serveur :
root@mail:~# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 230935 Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
Vous êtes maintenant connecté à la base de données et vous pouvez saisir des commandes SQL. Commençons par créer la base de données :
CREATE DATABASE mailserver;
Nous devons aussi créer un utilisateur MySQL appelé mailuser qui ait accès à cette base de données. À la place des garde place ChangeMe 1 et 2 utilisez le mot de passe que vous avez créé avec pwgen un peu plus haut.
CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'ChangeMe1';
…et un utilisateur qui vous permette de mettre à jour votre base de données:
CREATE USER 'mailadmin'@'localhost' IDENTIFIED BY 'ChangeMe2';
L'administrateur doit avoir les droits de lecture et écriture sur toute la base :
GRANT ALL ON mailserver.* TO 'mailadmin'@'localhost';
L'autre utilisateur n'a besoin que des droits de lecture :
GRANT SELECt ON mailserver.* TO 'mailuser'@'127.0.0.1';
Nous avons besoin de trois tables :
virtual_domains (domaines virtuels)
Cette table contient simplement la liste des domaines que vous allez utiliser en tant que virtual_mailbox_domains avec Postfix.
Champ | Utilité |
id | Un identifiant numérique unique qui identifie chaque ligne. Il est incrémenté automatiquement par la base de données. |
name | Le nom du domaine pour lequel vous voulez recevoir du courrier. |
Cette commande crée une telle table :
USE mailserver;
CREATE TABLE IF NOT EXISTS `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
virtual_users (utilisateurs virtuels)
La table suivante contient les informations à propos de vos utilisateurs. Chaque compte mail occupe une ligne.
Champ | Utilité |
id | Un identifiant numérique unique qui identifie chaque ligne. Il est incrémenté automatiquement par la base de données. |
domain_id | Contient la valeur du champ domain_id dans la table virtual_domains. L'ordre delete cascade assure que si un domaine est supprimé alors les comptes utilisateurs associés à ce domaine seront également effacés pour éviter les lignes orphelines. |
l'adresse mail du compte. | |
password | Le hachage du mot de passe du compte mail. Il est fourni par l'algorithme de hachage. Par défaut le chiffrement se fait avec {SHA256-CRYPT}. Mais vous pouvez avoir d'anciens utilisateurs créés lors d'un ancienne installation de guide qui utilisent encore {PLAIN-MD5}. Ajouter l'algorithme de hachage vous permet d'utiliser différentes sortes de hachage. |
Voici la requête SQL pour créer cette table :
USE mailserver;
CREATE TABLE IF NOT EXISTS `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `email` varchar(100) NOT NULL, `password` varchar(150) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
virtual_aliases (alias virtuels)
Cette table contient les transferts d'une adresse mail à une autre.
Champ | Utilité |
id | Un identifiant numérique unique qui identifie chaque ligne. Il est incrémenté automatiquement par la base de données. |
domain_id | Contient la valeur du champ domain_id dans la table virtual_domains. L'ordre delete cascade assure que si un domaine est supprimé alors les alias d'utilisateurs associés à ce domaine seront également effacés pour éviter les lignes orphelines. |
source | L'adresse mail du destinataire original du mail. Dans le cas d'un alias catch-all (qui accepte toutes les adresses dans un domaine) la source est de la forme @exemple.org. |
destination | L'adresse mail à laquelle le mail doit être transféré. |
Voici la requête que vous devez lancer :
USE mailserver;
CREATE TABLE IF NOT EXISTS `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Comme décrit dans la sections sur les types de domaine il peut y avoir plusieurs adresse de transfert pour une même adresse mail. Il suffit pour cela de saisir plusieurs lignes avec la même adresse source et différentes adresses de transfert qui doivent recevoir une copie du mail.
Un jeu d'essai avec lequel vous amuser
Remplissons la base avec le domaine example.org, un compte mails john@example.org et une adresse de transfert de jack@example.org vers john@example.org. Lancez ces requêtes SQL :
REPLACE INTO mailserver.virtual_domains (id,name) VALUES ('1','example.org');
REPLACE INTO mailserver.virtual_users (id,domain_id,password,email) VALUES ('1', '1', '{SHA256-CRYPT}$5$M/GWzmtjsLroRWIf$0qDt7IgXCoCQyvQZO7v.NC46rXzFVBSkZcilijlwgL7', 'john@example.org');
REPLACE INTO mailserver.virtual_aliases (id,domain_id,source,destination) VALUES ('1', '1', 'jack@example.org', 'john@example.org');
Vous vous demandez peut-être où j'ai trouvé ce long mot de passe chiffré ? J'ai lancé la commande dovecot pw -s SHA256-CRYPT -p sumersun pour créer un hash du simple mot de passe « sumersun ». Vous pouvez essayer vous-même et vous obtiendres une toute autre valeur. La raison est que les mots de passe sont « salés » pour augmenter la sécurité. .
Avant de mettre votre serveur en production, à la fin de ce guide vous devriez supprimer ce jeu d'essai avec la simple requête SQL :
DELETE FROM mailserver.virtual_domains WHERE name='example.org';
Note du traducteur : il suffit en effet de supprimer le domaine et les clauses ON CASCADE DELETE suffiront à supprimer tous les comptes d'utilisateur et d'alias de la base de données liés à ce domaine.