Réseau - Web - GNU/Linux

2018 28 janvier

Préparation de la base de données - Debian 9.0 Stretch

Rédigé par Marc GUILLAUME | 4 commentaires
Article précédent Mail façon FAI - Debian 9.0 Stretch Article suivant

Traduction 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.
email 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.

4 commentaires

#1  - Letouane a dit :

Dans la mesure où je prévois d'installer Postfixadmin, je peux me passer d'installer PHPMyAdmin on est bien d'accord ?
Bien entendu, pour autant e réalise les opérations de la partie "Création du shéma de base de données" ?

Répondre
#2  - Marc GUILLAUME a dit :

Oui puisque vous n'en aurez pas besoin pour créer les compte utilisateur. Moins il y a de portes d'entrée sur un serveur mieux c'est, ça évite d'avoir à surveiller des choses qui en pratique ne servent jamais et qu'on finit par oublier. Et si vous devez l'installer pour x raison, je vous conseille de mettre devant un mot de passe Apache. Ce n'est pas de la haute sécurité, mais au moins ça bloque les scripts Kiddy les plus balourds qui vont passer leur temps à essayer de s'identifier et qu'il faudra bloquer avec fail2ban.

Si MariaDB sur votre serveur ne sert qu'à Postfix, Dovecot et Roundcube, il est bien plus rapide d'utiliser la ligne de commande en ssh et PhpMyAdmin est plus que superflu si Postfixadmin se charge de gérer les comptes.

Je ne connais pas Postfixadmin et du coup je ne sais pas si il est programmé pour créer les tables dont il a besoin ou bien si il s'attend à trouver une base toute prête. Dans tous les cas il faut bien vérifier que le schéma de base de données qu'il utilise est cohérent avec celui proposé dans le guide, et si ce n'est pas le cas modifier la structure et les requêtes proposées dans le guide pour être compatible.

Répondre
#3  - Aimsai a dit :

Dans la partie des utilisateurs, je pense qu'il y a un mélange entre mailuser et mailserver, du coup je ne sais pas ni la note est bonne, ou si les requêtes le sont. Du coup, c'est 'mailuser'@'127.0.0.1' ou 'mailserver'@'127.0.0.1' ?

Répondre
#4  - Marc GUILLAUME a dit :

Oui !!! Bien vu, en effet mailserver c'est la base de données, et mailuser l'utilisateur utilisé par Postfix. J'ai corrigé le texte, mais je vois que Christoph a la même erreur sur son site, je vais le prévenir. Merci de la remarque.

Répondre

Écrire un commentaire

Quelle est la cinquième lettre du mot luwjod ?

Fil RSS des commentaires de cet article

À propos

Yakati.info - Réseau - Web - GNU/Linux © 2017

Généré par PluXml en 0.04s  - Administration

Mes coordonnées

Marc Guillaume
contact[at]yakati.info
79150 ÉTUSSON

Crédits

Pour la gestion du contenu

Généré par PluXml, le Blog ou Cms sans base de données

Pour le contenu

Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.

Pour le thème

Thème SOLID de blacktie.co adapté pour PluXml