Préparation de la base de données - Debian 5.0 Lenny
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.
Création de la base de données et des tables
Votre serveur Debian devrait maintenant être installé. Il est donc temps de préparer la base MySQL qui va contenir les informations servant à contrôler votre serveur de courrier. Au cours de cette préparation vous devrez lancer des requêtes SQL. Vous pouvez les saisir sur la ligne de commande de l'utilitaire "mysql". Mais si vous vous n'avez que peu d'expérience de MySQL je vous suggère d'y aller en douceur avec "PhpMyAdmin" en pointant votre navigateur sur l'URL : http://YOUR-MAIL-SERVER/phpmyadmin. Vous devriez voir une image ressemblant à ça :
Créez la base de données
La première chose à faire est de créer une nouvelle base de données dans MySQL. Nous allons la nommer "mailserver". Dans une console en tant qu'administrateur (root) entrez cette commande :
$> mysqladmin -p create mailserver
Le mot de passe root de MySQL que vous avez saisi lors de l'installation du paquet du serveur MySQL va vous être demandé.
(l'équivalent avec PhpMyAdmin est obtenu en entrant "mailserver" dans le champ "Create new database" (Créez une nouvelle base de données) et en cliquant sur "Create".)
Créez un utilisateur MySQL avec des droits limités
Pour des raisons de sécurité vous devriez créer un autre utilisateur MySQL avec moins de droits. Postfix n'a besoin que de lire les données de la table et n'a donc pas besoin d'un accès en écriture.
Connectez-vous à la base :
$> mysql -p
Lorsque vous voyez le prompt de MySQL : mysql>
entrez l'ordre SQL suivant (votre saisie est figurée en gras
) pour créer l'utilisateur avec les droits appropriés :
mysql>GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuser2009';
Query OK, 0 rows affected (0.00 sec) mysql>flush privileges
; Query OK, 0 rows affected (0.00 sec) mysql>exit
Bye
(On peut également faire ça avec PhpMyAdmin en suivant les étapes suivantes : Cliquez sur "Privileges", Choisissez "Add a new User" (choisissez un nouvel utilisateur) et en nom d'utilisateur saisissez "mailuser". Comme "Host" choisissez "local
". Entrez "mailuser2009
" comme mot de passe, ainsi que dans la répétition de contrôle. Cliquez sur "Go
". Ensuite cliquez sur "Database-specific privileges". Choisissez "mailserver" comme base de données. Sur la page suivante cochez la case "SELECT
" et cliquez sur "Go
".)
Vous allez ainsi créer un utilisateur appelé "mailuser" qui n'a que le droit de sélectionner des données et les lire dans la base de données, mais pas de modifier ces données. Si vous devez ajouter ou modifier des données dans la base de données, soit utilisez le compte "root" soit créez un autre compte destiné spécialement à cet usage. Le mot de passe "mailuser2009" est simplement un exemple. Veillez à le remplacer par un mot de passe plus correct. Si vous manquez d'inspiration utilisez "pwgen" ou "apg" pour créer de bons mots de passe.
Créez les tables de la base de données
Dans la base nouvellement créée vous devez créer les tables nécessaires à l'enregistrement des informations de domaine, de redirection et des boîtes au lettre d'utilisateurs. Il est plus simple ici de créer les tables en utilisant des ordres SQL plutôt qu'en utilisant le "clickodrome" de PhpMyAdmin.
Connectez-vous au serveur MySQL et choisissez la base de données 'mailserver' :
$> mysql -p mailserver
Vous allez de nouveau voir le prompt mysql>
. Commencez par créer une table pour la liste des domaines virtuels que vous voulez héberger :
mysql> 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 contient des informations sur les comptes d'utilisateurs en service. Chaque utilisateur a un nom d'utilisateur et un mot de passe. Ils sont utilisés pour accéder à la boîte avec POP3 ou IMAP, pour se connecter au webmail ou pour envoyer des courriers ("relay") si ils ne sont pas dans votre réseau local. Comme les utilisateurs ont tendance à oublier ce genre de choses, l'adresse email de l'utilisateur est utilisée comme nom d'utilisateur de connexion. Créons la table des utilisateurs :
mysql> 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;
La colonne email
contient la valeur "adresse mail/nom d'utilisateur". Et la colonne password
contient le hash MD5 du mot de passe utilisateur. L'unicité posée sur la clé email
empêche de créer accidentellement deux utilisateurs semblables sur un domaine.
mysql> 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;
Ici la colonne source
contient l'adresse email de l'utilisateur qui veut rediriger son mail. Dans le cas d'une adresse "ramasse miettes" (catchall) la source ressemble à cela "@domain". La colonne de destination
contient l'adresse email cible. Comme décrit dans la section concernant les domaines virtuels il peut exister plusieurs lignes pour une adresse source indiquant chacune des destinataires multiples qui recevront copie des courriers.
Vous vous demandez à quoi servent les foreign keys ? Elles indiquent que des entrées dans les tables des virtual_aliases et virutal users sont liées à des entrées dans la table virtual_domains. Ça permet de de maintenir la cohérence des données car vous ne pouvez créer un alias virtuel ou un utilisateur virtuel qui ne soit relié à aucun domaine virtuel. La mention "ON DELETE CASCADE" indique que si vous supprimez une ligne de la table de référence les lignes correspondantes seront automatiquement supprimées de la table courante. Il ne pourra donc pas rester par accident des entrées orphelines. Imaginons que vous n'ayez plus à héberger un certain domaine. Vous pouvez supprimer ce domaine de la table virtual_domains et tous les entrées qui en dépendent (qui font référence à ce domaine) seront également supprimées des autres tables. (Notez cependant que cela ne supprimera pas automatiquement le répertoire physique contenant les mails sur le disque dur.)
Un exemple de données dans les tables :
id | name |
---|---|
1 | example.com |
2 | foobar.org |
id | domain_id | password | |
---|---|---|---|
1 | 1 | john@example.com | 14cbfb845af1f030e372b1cb9275e6dd |
2 | 1 | steve@example.com | a57d8c77e922bf756ed80141fc77a658 |
3 | 2 | kerstin@foobar.org | 5d6423c4ccddcbbdf0fcfaf9234a72d0 |
Créons quelques alias :
id | domain_id | source | destination |
---|---|---|---|
1 | 1 | steve@example.com | devnull@workaround.org |
2 | 2 | kerstin@foobar.org | kerstin42@yahoo.com |
3 | 2 | kerstin@foobar.org | kerstin@mycompany.com |
Cette configuration aura pour résultat que les courriers pour steve@example.com
seront redirigés sur devnull@workaround.org
. Et les courriers pour kerstin@foobar.org
seront redirigés à la fois sur kerstin42@yahoo.com
et kerstin@mycompany.com
. Ni Steve ni Kerstin ne recevront de copie du mail.