Préparation de la base de données - Debian 7.0 Wheezy
Rédigé par Marc GUILLAUME | Aucun commentairePréparer la base de données utilisée par le serveur de mail pour enregistrer et connaître les domaines et les utilisateurs du serveur.
Maintenant il est temps de préparer la base MySQL qui va contenir les informations de contrôle de votre serveur de courrier. Dans ce processus vous devrez saisir des requêtes SQL. Vous pouvez les entrer en utilisant l'utilitaires mysql en ligne de commande. Mais si vous êtes moins expérimenté avec MySQL je vous suggère de commencer facilement avec PhpMyAdmin en faisant pointer votre navigateur à cette URL : https://YOUR-MAIL-SERVER/phpmyadmin. Vous devriez voir une page web de ce genre :
Connectez-vous en tant que « root » avec le mot de passe d'administration que vous avez défini à l'installation. Vous allez alors vous retrouver sur l'écran principal :
Ceci va vous aider à gérer vos bases de données. Vous pouvez soit lancer des instructions SQL directement soit utiliser le click de votre souris au travers de l'interface web de PhpMyAdmin. J'expliquerai les deux manières de faire. Si vous choisissez d'utiliser les instructions SQL en ligne de commande il vous faudra tout d'abord entrer la commande :
mysql -u root -p
et saisir le mot de passe de l'administrateur de MySQL.
Créez la base de données
Note du traducteur : J'ai conservé les noms anglais des tables et des champs des tables pour éviter des erreurs de transcriptions dans le document et conserver la cohérence avec le document original.
Votre premier travail est de créer une nouvelle base de données dans MySQL où vous allez enregistrer les informations de contrôle de votre serveur mail.
phpMyAdmin | commande SQL |
---|---|
Clickez sur « Database » (ou « Bases de données » sur l'interface françisée) puis « Create new database » (« Créer une nouvelle base de données » dans l'interface françisée). Choisissez le nom « mailserver » comme nom de la nouvelle base de données et cliquez sur « Create » (« Créer » dans l'interface françisée) : |
CREATE DATABASE 'mailserver'; |
Ajoutez un utilisateur MySQL possédant des privilèges réduits
Pour des questions de sécurité vous devriez créer un autre compte d'utilisateur MySQL avec peu de privilèges. Postfix n'a besoin que de lire des informations dans la base de données, il n'a donc pas besoin d'accès en écriture. L'utilisateur root serait un mauvais choix.
pMyAdmin | Commande SQL |
---|---|
Choisissez la base « mailserver » dans la colonne de gauche. Cliquez alors sur « Privileges » dans le menu d'onglets. Cliquez alors sur « Create a new user » (« Créer un nouvel utilisateur »). Remplissez les champs du formulaire : Choisissez comme « User Name » (« Nom d'utilisateur ») « mailuser ». Comme « Host » (« Nom d'hôte ») sélectionnez « local » pour que le champ texte devienne « localhost ». Cliquez sur « Generate » (« Générer ») pour créer un mot de passe aléatoire. N'oubliez pas de noter ce mot de passe quelque part. Allez en bas de page et cliquer sur le bouton d'enregistrement « Go » (« Enregistrer »). pour des raisons de sécurité vous devriez retirer tous les privilèges à cet utilisateur à l'exception du droit SELECT. Pour ce faire dans la section « Database-specific privileges » (« Privilèges sécifiques à la base de données ») cliquez sur « Uncheck All » (« Tout désélectionner ») et ne cochez que la case à cocher « SELECT ». Enregistrez de nouveau. |
GRANT SELECT ON (Bien sûr il faut que vous créiiez votre propre mot de passe en utilisant par exemple apg ou pwgen au lieu d'utiliser celui-ci.) |
Créez les tables de la base de données
Dans la base qui vient d'être créée vous devrez créer les tables destinées à contenir les information concernant les domaines, les alias de redirection et les boîtes mail d'utilisateurs. Commencez par créer la table destinée à enregistrer les domaines virtuels que vous voulez héberger :
PhpMyAdmin | Commande SQL |
---|---|
Cliquez sur « Create table » (« Créer une table ») sur le menu de gauche. Appellez-la virtual_domains. Elle contiendra, comme son nom l'indique, les domaines virtuels. Créez une colonne id avec le type integer avec la propriété auto-incrément et un index unique. Créez également une colonne name avec le type VARCHAR et une taille de 50. Le formulaire devrait ressembler à ceci : Cliquez sur enregistrer. |
CREATE TABLE `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
La table suivante contientdra les informations sur les compte utilisateurs existants. Chaque utilisateur a un nom d'utilisateur (« username ») et un mot de passe (« password »). Il sera utilisé pour accéder à la boîte mail via POP3 ou IMAP, pour se connecter au service de webmail ou pour envoyer des courriers (fonction de relais, relay) si les utilisateurs ne se trouvent pas dans votre réseau local. Comme les utilisateurs ont tendance à oublier les choses, l'adresse email de l'utilisateur servira également de nom d'utilisateur (username). Créons la table des utilisateurs :
phpMyAdmin | Commande SQL |
---|---|
De nouveau cliquez sur « Create table ». Appellez la nouvelle table virtual_users. Créez les colonne comme ceci :
|
CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(32) NOT NULL, `email` varchar(100) 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; |
Le champ email contiendra l'adresse mail d'un utilisateur. Et le champ password contiendra un hachage MD5 du mot de passe de l'utilisateur. La clé unique unique key placée sur le champ email permettra de s'assurer qu'on ne pourra créer par accident deux utilisateurs de même nom sur le domaine.
Pour finir nous avons besoin d'une table pour enregistrer les alias de redirection aliases (pour le transfert de données d'un compte à un autre) :
phpMyAdmin | SQL statement |
---|---|
De nouveau cliquez sur « Create table ». Appellez la nouvelle table virtual_aliases. Créez les colonnes suivant ce schéma :
|
CREATE TABLE `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; |
Ici la colonne source contient l'adresse email de l'utilisateur qui veut rediriger ses mails. En cas de « catchall » les adresses du champ source ressembleront à « @domain ». La colonne destination contient l'adresse cible vers laquelle rediriger le mails. Comme décrit dans la section sur les domaines virtuels il peut y avoir plusieurs lignes pour une même adresse source, destinées à contenir de multiples destinations devant recevoir copie d'un courrier.
Vous vous demandez à quoi servent les foreign keys ? Elles expriment le fait que les tables virtual_aliases et virtual_users sont liées à la table virtual_domains. Ceci conservera l'intégrité référentielle de votre base, car vous ne pourrez créer un alias virtuel de redirection ou un utilisateur virtuel qui ne soient connectés à un domaine existant. Le suffixe ON DELETE CASCADE signifie que si vous effacez un ligne de la table référencée l'effacement se fera également dans la table courante automatiquement. Vous ne pourrez ainsi laisser des entrées orphelines accidentellement. Imaginez que vous n'hébergiez plus un certain domaine. Vous pouvez supprimer ce domaine de la table virtual_domains et toutes les entrées référençant ce domaine dans les autres tables seront également supprimées (notez cependant que cela ne supprimera pas les répertoires physiques sur le disque correspondant à ce domaine automatiquement).
Un exemple de données dans ces tables
virtual_domains
id | name |
---|---|
1 | example.org |
2 | example.net |
virtual_users
id | domain_id | password | |
---|---|---|---|
1 | 1 | john@example.org | 14cbfb845af1f030e372b1cb9275e6dd |
2 | 1 | steve@example.org | a57d8c77e922bf756ed80141fc77a658 |
3 | 2 | kerstin@example.net | 5d6423c4ccddcbbdf0fcfaf9234a72d0 |
Ajoutons un simple alias
virtual_aliases
id | domain_id | source | destination |
---|---|---|---|
1 | 1 | steve@example.org | devnull@workaround.org |
2 | 2 | kerstin@example.net | kerstin42@yahoo.com |
3 | 2 | kerstin@example.net | kerstin@mycompany.com |
Ceci aura pour résultat qu'un email pour steve@example.org sera redirigé vers devnull@workaround.org. Et le mail pour kerstin@example.net sera redirigé à la fois vers kerstin42@yahoo.com et kerstin@mycompany.com. Ni Steve ni Kerstin ne recevront de copie du mail.
Jeu de test
Remplissons la base de données avec le domaine example.org, une adresse mail d'exemple john@example.org et un alias de redirection de jack@exemple.org vers john@example.org. Ouvrez un shell MySQL (ou cliquez sur l'onglet SQL dans PhpMyAdmin) et saisissez ces requêtes SQL :
INSERT INTO `mailserver`.`virtual_domains` ( `id` , `name` ) VALUES ( '1', 'example.org' );INSERT INTO `mailserver`.`virtual_users` ( `id` , `domain_id` , `password` , `email` ) VALUES ( '1', '1', MD5('summersun'), 'john@example.org' );INSERT INTO `mailserver`.`virtual_aliases` ( `id`, `domain_id`, `source`, ) VALUES ( '1', '1', 'jack@example.org', 'john@example.org' );INSERT INTO `mailserver`.`virtual_aliases` ( `id`, `domain_id`, `source`, ) VALUES ( '1', '1', 'jack@example.org', 'john@example.org' );