j2c-s2c.com » Informatique » Linux » Postfix

Installer Postfix et Courrier

L'objectif de cet article est de mettre en oeuvre un MTA : Mail Transfert Agent, c'est un agent de transfert de mail. Il permettra de recevoir des mails et de les stoquer dans un repertoire situé sur le serveur, et de relayers vos mails vers l'exterieur.

Pour faciliter les opérations de créations de comptes, nous utiliserons une base de données qui stoquera toute les informations de login/mot de passe, adresse, ainsi que l'activité du compte, nous aurons aussi la possibilité de mettre en oeuvre des alias

Le processus permettant à un client de consulter ses mails sera présenté dans 2 autres articles : IMAP et WebMail

Enfin, afin de limiter le SPAM, nous verrons comment paramettrer au mieux PostFix. 2 autres articles seront réalisés, concernant le filtrage via SpamAssassin et la suppression de virus.

Avertissement

La mise en oeuvre d'un serveur de mail engage votre résponsabilité concernant l'utilisation de ce serveur. Vous êtes donc tenu de faire en sorte qu'il ne devienne pas rapidement un open-relay (machine utilisable par des SPAMMERs)

Les informations sont données ici à titre indicatif, elles sont inspirés des sources disponible en bas de page, si j'ai oublié d'en citer l'une d'elle, n'hésitez pas .. contactez-moi

Si vous trouvez que mon article nécéssite une amélioration, n'hésitez pas.. les commentaires sont là pour ça.

Prérequis

Avant de pouvoir utiliser votre serveur de mails plusieurs éléments sont requis

Il est préférable que votre fournisseur d'accès à internet vous fournisse un relai de mail afin de garantir que vos messages seront toujours délivrés

Sur un serveur dédié, vous n'avez pas besoin de passer par votre fournisseur d'accès : délai de livraison rallongés

Mettez à jour votre distribution

A partir de Debian ETCH, il est recommandé d'utiliser aptitude en lieu et place d'apt-get

Mettre à jour la liste des paquets, et mettre à jour le serveur

root@server:# aptitude update
root@server:# aptitude dist-upgrade

Installez MySQL

Ici, nous installons le serveur mysql sur la même machine, il faut donc installer la composante serveur et la composante client de mysql

root@server:# aptitude install mysql-server mysql-client

Afin de vous faciliter la tâche, installez un serveur Web avec PhpMyAdmin

root@server:# aptitude install apache2 apache2-common libapache2-mod-php5 phpmyadmin

Indiquez uniquement Apache2 quand debconf vous demande la configuration de phpmyadmin (à la fin, il vous demande si vous voulez redémarrer le serveur apache 2 : oui).

Cette opération install apache2 : il faut autoriser le démarrage : dans le fichier /etc/default/apache2

# 0 = start on boot; 1 = don't start on boot
NO_START=0

Configurer éventuellement apache 2 à l'aide du fichier /etc/apache2/httpd.conf (mais normalement le comportement par défaut suffit ici, le descriptif du fichier de config dépasse le cadre de cet article)

Démarrer Apache !

root@server:# /etc/init.d/apache2 start
ou
root@server:# apache2ctl start

Après chaques modifs dans le fichier de config Redémarrer Apache !

root@server:# /etc/init.d/apache2 restart
ou
root@server:# apache2ctl restart

Arrêter Apache !

root@server:# /etc/init.d/apache2 stop
ou
root@server:# apache2ctl stop

Le démarrage de apache est automatique au lancement du système

Paramettrer MySQL

Il faut impérativement paramettrer MySQL : mettre un mot de passe root

root@server:# mysqladmin -u root password un-mot-de-passe-root

Nous avons ainsi défini le mot de passe root de mysql à "un-mot-de-passe-root", je vous conseil d'en trouver un suffisament sécurisé

Après quelques réfléxions vous décidés de changer de mot de passe root : il faut maintenant se loguer en tant que root avec mot de passe

root@server:# mysqladmin -u root -p password un-nouveau-mot-de-passe-root
Enter password:

Nous devons rentrer l'ancien mot de passe dès qu'il le demande, on peut aussi mettre le mot de passe dans la ligne de commande, ce qui n'est pas conseillé il faudra veiller à ne pas mettre d'espace derrière le "-p"

REMARQUE : postfix, depart sa configuration déjà très sécurisée, ne peut pas se connecter en SOCKET sur MySQL, il faut donc impérativement utiliser une connection TCP-IP sur l'adresse 127.0.0.1 port 3306

Pour acceder à phpmyadmin : utilisez votre navigateur web http://votre-serveur/phpmyadmin

Installer PostFix

Nous sommes enfin prêt à installer postfix

root@server:# aptitude install postfix postfix-mysql postfix-doc

Lors de l'installation, vous serez amené à choisir un type d'installation : choisir local seulement

où vont les mails pour root : vers l'utilisateur administrateur de la machine (le premier compte créé lors de l'installation de debian par exemple) pour moi c'est jcrochet

le nom de domain au quel appartient le serveur de mails ! j2c-s2c.com

Laisser la synchronisation à No

Exim4 est désinstallé dans la foulée : il ne peut pas y avoir 2 serveurs de mails sur la même machine (et en plus c'est idiot).

PostFix est prêt, il faut maintenant configurer tout ce qui tourne autour : commençons par la base de données

Patcher postfix

La version du package debian ne permet pas de gérer les quotas.. on va la patcher pour qu'elle puisse le gérer

Récupérer quelques package nécéssaires pour l'opération :

root@server:# aptitude install build-essential dpkg-dev fakeroot debhelper libgdbm-dev libpcre3-dev po-debconf dpatch libdb4.3-dev libcdb-dev

Récupérer les sources de postfix

root@server:# cd /usr/src
root@server:# apt-get source postfix

On va vérifier la version afin de ne pas télécharger n'importe quel patch

root@server:# postconf -d | grep mail_version
mail_version = 2.3.8
milter_macro_v = $mail_name $mail_version

Normalement sous Etch, c'est bien 2.3.8... on peut donc lancer le téléchargement du patch

root@server:# wget http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz

On décompresse, puis on applique le patch

root@server:# gunzip postfix-2.3.8-vda.patch.gz
root@server:# cd postfix-2.3.8
root@server:# patch -p1 < ../postfix-2.3.8-vda.patch

Puis on regénère le package

root@server:# dpkg-buildpackage

à la fin, il se peut qu'il y ai un warning

(Warning: Failed to sign .dsc and .changes file)

On peut ignorer ce message

Cette commande nous a généré 2 fichiers postfix_2.3.8-1_i386.deb et postfix-mysql_2.3.8-2_i386.deb

root@server:# dpkg -i postfix_2.3.8-2_i386.deb
root@server:# dpkg -i postfix-mysql_2.3.8-2_i386.deb

On peut continuer par installer mysql

Configurer la gestion des mails virtuels via MySQL

Nous allons créer une base et un utilisateur mysql qui sera utilisé par postfix pour acceder aux données. Cet utilisateur n'aura accès qu'en local (127.0.0.1)

Créons d'abord la base "postfix-db"

root@server:# mysqladmin -u root -p create postfix_db
Enter password:

Associons un utilisateur : "postfix", avec un mot de passe "postfix" (pensez à remplacer par votre mot de passe)

root@server:# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4441 to server version: 4.0.24_Debian-10sarge2-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>
grant select on postfix_db.* to postfix@127.0.0.1 identified by 'postfix';
mysql> flush privileges;
mysql> quit;

Nous avons donc créé une base de donnée "postfix_db" et l'utilisateur associé "postfix", l'opération "flush privilège" permet de prendre en compte les modifications de droits opérés sur "postfix"

Créons maintenant les tables nécéssaires au fonctionnement de postfix

root@server:# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4441 to server version: 4.0.24_Debian-10sarge2-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>
CREATE TABLE `domains` (`domain` varchar(50) NOT NULL default '', PRIMARY KEY (`domain`))\
TYPE=MyISAM;
mysql>CREATE TABLE `forwardings` (`source` varchar(80) NOT NULL default '',`destination` text NOT NULL,\
`active` enum('yes','no') NOT NULL default 'yes', PRIMARY KEY (`source`)) TYPE=MyISAM;
mysql>CREATE TABLE `users` (`login` varchar(32) NOT NULL default '',\
`email` varchar(80) NOT NULL default '',`password` varchar(20) NOT NULL default '',\
`active` enum('yes','no') NOT NULL default 'yes', PRIMARY KEY (`email`)\
) TYPE=MyISAM;

Nous avons donc 3 tables "domains", "forwardings", "users" vides :

domain :

domain

forwardings :

source destination active

user :

login email password active

Pour les flémard : un script sql : disquette create.sql à lancer comme suit :
(Il faut quand même avant avoir créé la base !)

root@server:# mysql -u root -p postfix_db < create.sql
Enter password :

Nous verrons plus loin comment les remplires

Passons maintenant à la configuration des fichiers coté postfix

Nous allons créer 4 fichiers qui seront lié à la configuration de postfix

disquette /etc/postfix/mysql-virtual_domains.cf

user = postfix
password = postfix
dbname = postfix_db
table = domains
select_field = 'virtual'
where_field = domain
hosts = 127.0.0.1

disquette /etc/postfix/mysql-virtual_forwardings.cf

user = postfix
password = postfix
dbname = postfix_db
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1

disquette /etc/postfix/mysql-virtual_mailboxes.cf

user = postfix
password = postfix
dbname = postfix_db
table = users
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
where_field = email
hosts = 127.0.0.1
additional_conditions = and active='yes'

disquette /etc/postfix/mysql-virtual_email2email.cf

user = postfix
password = postfix
dbname = postfix_db
table = users
select_field = email
where_field = email
hosts = 127.0.0.1

Nous reviendrons sur les éléments barbares qui se trouvent dans le fichier mysql-virtual_mailboxes.cf

Nous l'avons vu dans l'introduction, les mails à destination des utilisateurs du serveur seront stoqués dans un repertoire :

Ce repertoire se trouve être la "home directory" d'un utilisateur spécial : vmail

Créons cet utilisateur :

root@server:#groupadd -g 5000 vmail
root@server:#useradd -g vmail -u 5000 vmail -d /home/vmail -m

Une explication s'impose !!

La table domain sert à stoquer les noms de domaine pour les quels notre serveur acceptera de recevoir des mails

La table forwarding sert à stoquer tout les alias et redirections

La table user sert à stoquer les paramettres des adresses mails hebergées par le serveur

L'adresse mail de l'utilistateur (contenue dans le champs "email") sera coupée en 2 la partie utilisateur et la partie nom de domaine, afin d'organiser les mails dans le repertoire /home/vmail. Exemple

un.mail@exemple.com => /home/vmail/exemple.com/un.mail

C'est la commande barbare "CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')" qui récupère ce qui est à droite de "@" rajoute un "/" et met derrière ce qui est à gauche de "@".

Maintenant que tout est prête, il faut l'inclure à postfix

Votre fichier de config /etc/main.cf resemble à ça :

  1. # See /usr/share/postfix/main.cf.dist for a commented, more complete version
  2.  
  3. smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
  4. biff = no
  5.  
  6. # appending .domain is the MUA's job.
  7. append_dot_mydomain = no
  8.  
  9. # Uncomment the next line to generate "delayed mail" warnings
  10. # delay_warning_time = 4h
  11.  
  12. myhostname = localhost.localdomain
  13. alias_maps = hash:/etc/aliases
  14. alias_database = hash:/etc/aliases
  15. myorigin = /etc/mailname
  16. mydestination = exemple.com, localhost.localdomain, localhost.localdomain, localhost
  17. relayhost =
  18. mynetworks = 127.0.0.0/8
  19. mailbox_command = procmail -a "$EXTENSION"
  20. mailbox_size_limit = 0
  21. recipient_delimiter = +
  22. inet_interfaces = loopback-only

Les numéros de lignes ne font pas parti du fichier de configuration.

Autant dire qu'il n'y a pas grand chose, mais déjà comme ça, ce serveur marche !

Passons en revue déjà les diférentes lignes

La ligne 3 est la signature du serveur, il ne faut pas la modifier sous peine que plus rien de marche

La ligne 4 permet aux utilisateurs localement logué d'être averti qu'un nouveau courier est arrivé : dans notre cas, c'est inutile, vu que les utilisateurs sont virtuels.

La ligne 7 rajoute automatiquement le nom de domaine derrière un utilisateur si celui-ci n'a pas été rajouté avant.

La ligne 10, si décommentée, permet d'avertir les expediteurs qu'il y a un problème temporaire de livraison au bout de 4 heures = problème chez le destinataire

La ligne 12 permet de donner le nom de la machine sur lequel tourne le serveur (il faut un DNS)

La ligne 13 permet de donner le fichier dans le quel on spécifiera les alias et redirection (chez nous on passera par la base MySQL)

La ligne 14 : idem que 13

La ligne 15 permet de spécifier le domaine d'origine

La ligne 16 permet de spécifier pour qui on accèpte le courier

La ligne 17 spécifie un serveur Relais de mail : dans notre cas il est vivement conseillé d'utiliser celui du FAI qui a pour obligation de délivrer le courier

La ligne 18 spécifie les IP/réseaux qui appartiennent au réseau LOCAL

La ligne 19 spécifie la commande qui permet à postfix d'envoyer un courier

La ligne 20 spécifie s'il y a un quota à respecter pour les boites aux lettres (ici, il n'y en a pas)

La ligne 21 spécifie quel délimiteur est utilisé entre 2 adresses mails de destination (ne pas modifier)

La ligne 22 spécifie sur quel interface on écoute : ici.. seulement 127.0.0.1. A modifier donc

Nous allons donc adapter tout ça pour faire coller notre configuration : Ne pas hésiter à rajouter des commentaires !!!

disquette /etc/postfix/main.cf

  1. # See /usr/share/postfix/main.cf.dist for a commented, more complete version
  2.  
  3. smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
  4. biff = no
  5.  
  6. # Appending .domain is the MUA's job.
  7. append_dot_mydomain = no
  8.  
  9. # Uncomment the next line to generate "delayed mail" warnings
  10. #delay_warning_time = 4h
  11.  
  12. # Noms du serveur, et nom de domaine
  13. myhostname = mail.exemple.com
  14. mydomain = exemple.com
  15.  
  16. # Table des alias
  17. alias_maps = hash:/etc/aliases
  18. alias_database = hash:/etc/aliases
  19.  
  20. # Origine : qui je suis, et Destination : pour qui j'accèpte de délivrer du courier
  21. myorigin = $mydomain
  22. mydestination = localhost.localdomain, localhost.localdomain, localhost
  23.  
  24. # Relai SMTP de mon FAI
  25. relayhost = [smtp.free.fr]
  26.  
  27. # Mes réseaux locaux
  28. mynetworks = 127.0.0.0/8 , 192.168.0.0/16
  29. mynetworks_style = host
  30.  
  31. # Commande pour envoyer des mails
  32. mailbox_command = procmail -a "$EXTENSION"
  33.  
  34. # Quotas et délimiteur des adresse de destinations
  35. mailbox_size_limit = 0
  36. recipient_delimiter = +
  37.  
  38. # Interfaces à écouter : on veut être accessible à partir d'internet comme du LOCAL
  39. inet_interfaces = all
  40.  
  41. # Mise en place de la gestion des boites virtuelles : accès aux fichiers de conf
  42. virtual_alias_domains =
  43. virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf mysql:/etc/postfix/mysql-virtual_email2email.cf
  44. virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
  45. virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
  46.  
  47. # Emplacement de base des mails en destination de boites virtuelles
  48. virtual_mailbox_base = /home/vmail
  49.  
  50. # GID et UID du propriétaire du compte
  51. virtual_uid_maps = static:5000
  52. virtual_gid_maps = static:5000

Nous avons donc un outil capable d'envoyer et de recevoir des mails virtuels.

Afin de faire un test, il faut donc peupler la base de données

On commence par remplir la table domains : qui indique quels sont les domaines que l'on accèpte d'heberger et de relayer

root@server:# mysql -u root -p postfix_db -e "INSERT INTO domains (domain) VALUES ('exemple.com');"

On continue par créer les comptes

root@server:# mysql -u root -p postfix_db -e "INSERT INTO users (login,email,password,active) VALUES ('un.user','un.user@exemple.com','test','yes');"

Nous avons donc 3 tables "domains", "forwardings", "users" dont une encore vide :

domain :

domain
exemple.com

forwardings :

source destination active

user :

login email password active
un.user un.user@exemple.com test yes

Tests

Une fois que tout est paramettré, rechargez la configuration de postfix !

root@server:# /etc/init.d/postfix restart
ou
root@server:# postfix reload

Installez netcat (on peut aussi le faire avec telnet, mais c'est plus élégant avec netcat ;) )

root@server:# apt-get install netcat

root@server:# netcat localhost 25
220 mail.exemple.com ESMTP Postfix (Debian/GNU)
ehlo exemple.com
250-mail.exemple.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250 8BITMIME

mail from:test@test.com
250 Ok
rcpt to:un.user@exemple.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
Du texte pour tester
blabla
.
250 Ok: queued as 863D8102C1A
quit

La commande "ehlo exemple.com" permet de dire que nous agissons pour le compte de exemple.com.

La commande "mail from:test@test.com" indique que le mail provient de test@test.com.

La commande "rcpt to:un.user@exemple.com" indique à qui on veut distribuer le courier : donnez un compte valide !!

La commande "data" indique que la suite sera le contenu du mail : ici, il n'est pas bien formé, il faut terminer par un retour chariot, un point et un retour chariot.

On remarquera au passage que le message de bienvenue du serveur est celui paramettré ligne 3 dans main.cf : ne vous amusez pas à le changer, certains serveur veulent une syntaxe stricte

root@server:# tail /var/log/mail.log

Oct 22 15:57:57 localhost postfix/postfix-script: starting the Postfix mail system
Oct 22 15:57:57 localhost postfix/master[1503]: daemon started -- version 2.1.5
Oct 22 15:58:36 localhost postfix/smtpd[1509]: connect from localhost.localdomain[127.0.0.1]
Oct 22 15:59:05 localhost postfix/smtpd[1509]: 863D8102C1A: client=localhost.localdomain[127.0.0.1]
Oct 22 15:59:13 localhost postfix/cleanup[1515]: 863D8102C1A: message-id=<20061022135856.863D8102C1A@mail.exemple.com>
Oct 22 15:59:13 localhost postfix/qmgr[1506]: 863D8102C1A: from=<test@test.com>, size=360, nrcpt=1 (queue active)
Oct 22 15:59:13 localhost postfix/virtual[1518]: 863D8102C1A: to=<un.user@exemple.com>, relay=virtual, delay=17, status=sent (delivered to maildir)
Oct 22 15:59:13 localhost postfix/qmgr[1506]: 863D8102C1A: removed
Oct 22 15:59:20 localhost postfix/smtpd[1509]: disconnect from localhost.localdomain[127.0.0.1]

Pensez à consulter réguliairement ce log, il est vital !!

Dans /home/vmail/exemple.com/un.user/new, il y a un fichier

Return-Path: <test@test.com>
X-Original-To: un.user@exemple.com
Delivered-To: un.user@exemple.com
Received: from exemple.com (localhost.localdomain [127.0.0.1])
by mail.exemple.com (Postfix) with ESMTP id 863D8102C1A
for <un.user@exemple.com>; Sun, 22 Oct 2006 15:58:56 +0200 (CEST)
Message-Id: <20061022135856.863D8102C1A@mail.exemple.com>
Date: Sun, 22 Oct 2006 15:58:56 +0200 (CEST)
From: test@test.com
To: undisclosed-recipients:;

Du texte pour tester
blabla

Nous ne nous attarderons pas sur le "To : undisclosed-recipients:;", il est du au fait que le mail que nous avons fait n'est pas correctement écrit : un mail est formé d'une enveloppe, et d'un contenu, l'enveloppe est lue par l'agent de livraison de mails pour savoir où ranger le mail, le contenu est lu par le maileur pour indiquer la provenance et la destination du mail (qui peuvent différer de ce qui est marqué sur l'enveloppe : voir SPAM)

Même si votre serveur permet de fonctionner, ne le lancez pas en production, il n'est pas assez protégé contre le SPAM !!

SASL et TLS

Jusqu'à présent, postfix vous permet de vous connecter à partir du serveur où à partir de réseau local pour envoyer des mails. SASL et TLS permettent à un utilisateur nomade de pouvoir utiliser le serveur SMTP comme s'il était sur le réseau : il demande une authentification et chiffre le transfert.

Installez les modules supplémentaires

root@server:# apt-get install postfix-tls openssl libsasl2 libsasl2-modules libsasl2-modules-sql

Génération du Certificat

Nous allons créer un certificat pour 10 ans (pour être tranquile un bout de temps

root@server:# openssl req -new -outform PEM -out /etc/postfix/smtpd.cert \
> -newkey rsa:2048 -nodes -keyout /etc/postfix/smtpd.key \
> -keyform PEM -days 3650 -x509
Generating a 2048 bit RSA private key
.........+++
..................................................+++
writing new private key to '/etc/postfix/smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
FR
State or Province Name (full name) [Some-State]:Alsace
Locality Name (eg, city) []:Strasbourg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Exemple
Organizational Unit Name (eg, section) []:service mail
Common Name (eg, YOUR name) []:Un USER
Email Address []:postmaster@exemple.com

Attention, la clef créée ici est illégale, un chiffrage supérieur à 1024 est interdit dans certains pays. (alors ne dites pas qu'on vous a pas prévenu :) )

Modifications du fichier de config

disquette /etc/postfix/main.cf

  1. # See /usr/share/postfix/main.cf.dist for a commented, more complete version
  2.  
  3. smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
  4. biff = no
  5.  
  6. # Appending .domain is the MUA's job.
  7. append_dot_mydomain = no
  8.  
  9. # Uncomment the next line to generate "delayed mail" warnings
  10. #delay_warning_time = 4h
  11.  
  12. # Noms du serveur, et nom de domaine
  13. myhostname = mail.exemple.com
  14. mydomain = exemple.com
  15.  
  16. # Table des alias
  17. alias_maps = hash:/etc/aliases
  18. alias_database = hash:/etc/aliases
  19.  
  20. # Origine : qui je suis, et Destination : pour qui j'accèpte de délivrer du courier
  21. myorigin = $mydomain
  22. mydestination = localhost.localdomain, localhost.localdomain, localhost
  23.  
  24. # Relai SMTP de mon FAI
  25. relayhost = [smtp.free.fr]
  26.  
  27. # Mes réseaux locaux
  28. mynetworks = 127.0.0.0/8 , 192.168.0.0/16
  29. mynetworks_style = host
  30.  
  31. # Commande pour envoyer des mails
  32. mailbox_command = procmail -a "$EXTENSION"
  33.  
  34. # Quotas et délimiteur des adresse de destinations
  35. mailbox_size_limit = 0
  36. recipient_delimiter = +
  37.  
  38. # Interfaces à écouter : on veut être accessible à partir d'internet comme du LOCAL
  39. inet_interfaces = all
  40.  
  41. # Mise en place de la gestion des boites virtuelles : accès aux fichiers de conf
  42. virtual_alias_domains =
  43. virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf mysql:/etc/postfix/mysql-virtual_email2email.cf
  44. virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
  45. virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
  46.  
  47. # Emplacement de base des mails en destination de boites virtuelles
  48. virtual_mailbox_base = /home/vmail
  49.  
  50. # GID et UID du propriétaire du compte
  51. virtual_uid_maps = static:5000
  52. virtual_gid_maps = static:5000
  53.  
  54. # SASL / TLS
  55. smtpd_sasl_auth_enable = yes
  56. broken_sasl_auth_clients = yes
  57. smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
  58. smtpd_use_tls = yes
  59. smtpd_tls_cert_file = /etc/postfix/smtpd.cert
  60. smtpd_tls_key_file = /etc/postfix/smtpd.key

Nous ne verrons pas le détail de toutes les commandes rajoutées, cependant, "smtpd_recipient_retrictions" mérite qu'on s'y attarde un peu.

Recipient veut dire "adresse de destination". Cette commande est par défaut initialisée à "permit_mynetworks, reject_unauth_destination". En d'autre terme, soit vous être sur le réseau et vous pouvez utiliser le sereur pour relayer vos messages, soit le serveur est à destination des mails (*@exemple.com pour nous ici).. les autres.. sont rejetés

Ici, nous authorisons aussi les utilisateurs distants authentifiés via SASL

Nous reviendrons en détail sur le fonctionnement des règles "restrictions" dans la partie configuration anti-spam

SASL a besoin de connaitre l'endroit où se trouvent les mots de passe : ici, la base de données

Créer le fichier : disquette /etc/postfix/sasl/smtpd.conf

  1. # module à charger pour gerer l'authentification via la base de données
  2. pwcheck_method: auxprop
  3. # plugin sql à charger
  4. auxprop_plugin: sql
  5. # type de mot de passe pris en charge
  6. mech_list: plain login cram-md5 digest-md5
  7. # type de base sql
  8. sql_engine: mysql
  9. # identifiants de connection
  10. sql_hostnames: 127.0.0.1
  11. sql_user: postfix
  12. sql_passwd: postfix
  13. sql_database: postfix_db
  14. #champs à récuperer pour le mot de passe
  15. sql_select: select password from users where email='%u@%r'

Installez courrier

Maintenant qu'on sait envoyer et recevoir du courier, on aimerai bien le lire dans un client mail potable

Dans tout le reste de l'article nous nous baserons sur un outil gratuit disponible sur toute les plateformes : Thunderbird

root@server:#apt-get install courier-authdaemon courier-authmysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl

Configuring courier-base : ne pas accepter la consolidation des fichiers : les laisser eclaté

il faut modifier la configuration pour autoriser la connection à la base de donnée (qui contien login/mot de passe et emplacement)

Fichier d'origine

  1. ##VERSION: $Id: authdaemonrc.in,v 1.8 2001/10/07 02:16:22 mrsam Exp $
  2. #
  3. # Copyright 2000-2001 Double Precision, Inc. See COPYING for
  4. # distribution information.
  5. #
  6. # authdaemonrc created from authdaemonrc.dist by sysconftool
  7. #
  8. # Do not alter lines that begin with ##, they are used when upgrading
  9. # this configuration.
  10. #
  11. # This file configures authdaemond, the resident authentication daemon.
  12. #
  13. # Comments in this file are ignored. Although this file is intended to
  14. # be sourced as a shell script, authdaemond parses it manually, so
  15. # the acceptable syntax is a bit limited. Multiline variable contents,
  16. # with the \ continuation character, are not allowed. Everything must
  17. # fit on one line. Do not use any additional whitespace for indentation,
  18. # or anything else.
  19.  
  20. ##NAME: authmodulelist:0
  21. #
  22. # The authentication modules that are linked into authdaemond. The
  23. # default list is installed. You may selectively disable modules simply
  24. # by removing them from the following list. The available modules you
  25. # can use are: authcustom authcram authuserdb authldap authpgsql authmysql authpam
  26.  
  27. authmodulelist="authpam"
  28.  
  29. ##NAME: authmodulelistorig:1
  30. #
  31. # This setting is used by Courier's webadmin module, and should be left
  32. # alone
  33.  
  34. authmodulelistorig="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
  35.  
  36. ##NAME: daemons:0
  37. #
  38. # The number of daemon processes that are started. authdaemon is typically
  39. # installed where authentication modules are relatively expensive: such
  40. # as authldap, or authmysql, so it's better to have a number of them running.
  41. # PLEASE NOTE: Some platforms may experience a problem if there's more than
  42. # one daemon. Specifically, SystemV derived platforms that use TLI with
  43. # socket emulation. I'm suspicious of TLI's ability to handle multiple
  44. # processes accepting connections on the same filesystem domain socket.
  45. #
  46. # You may need to increase daemons if as your system load increases. Symptoms
  47. # include sporadic authentication failures. If you start getting
  48. # authentication failures, increase daemons. However, the default of 5
  49. # SHOULD be sufficient. Bumping up daemon count is only a short-term
  50. # solution. The permanent solution is to add more resources: RAM, faster
  51. # disks, faster CPUs...
  52.  
  53. daemons=5
  54.  
  55. ##NAME: version:0
  56. #
  57. # When you have multiple versions of authdaemond.* installed, authdaemond
  58. # just picks the first one it finds. Set "version" to override that.
  59. # For example: version=authdaemond.plain
  60.  
  61. version=""
  62.  
  63. ##NAME: authdaemonvar:0
  64. #
  65. # authdaemonvar is here, but is not used directly by authdaemond. It's
  66. # used by various configuration and build scripts, so don't touch it!
  67.  
  68. authdaemonvar=/var/run/courier/authdaemon

Il suffit de modifier la ligne 27 : authmodulelist="authpam" en authmodulelist="authmysql".

disquette /etc/courier/authdaemonrc

Il sagit maintenant de mettre en place un fichier qui permet à courier de connaitre les identifiants de connection mysql

Le fichier d'origine :

  1. ##VERSION: $Id: authmysqlrc,v 1.17 2004/04/20 01:38:17 mrsam Exp $
  2. #
  3. # Copyright 2000-2004 Double Precision, Inc. See COPYING for
  4. # distribution information.
  5. #
  6. # Do not alter lines that begin with ##, they are used when upgrading
  7. # this configuration.
  8. #
  9. # authmysqlrc created from authmysqlrc.dist by sysconftool
  10. #
  11. # DO NOT INSTALL THIS FILE with world read permissions. This file
  12. # might contain the MySQL admin password!
  13. #
  14. # Each line in this file must follow the following format:
  15. #
  16. # field[spaces|tabs]value
  17. #
  18. # That is, the name of the field, followed by spaces or tabs, followed by
  19. # field value. Trailing spaces are prohibited.
  20.  
  21.  
  22. ##NAME: LOCATION:0
  23. #
  24. # The server name, userid, and password used to log in.
  25.  
  26. MYSQL_SERVER localhost
  27. MYSQL_USERNAME admin
  28. MYSQL_PASSWORD admin
  29.  
  30. ##NAME: MYSQL_SOCKET:0
  31. #
  32. # MYSQL_SOCKET can be used with MySQL version 3.22 or later, it specifies the
  33. # filesystem pipe used for the connection
  34. #
  35. # MYSQL_SOCKET /var/run/mysqld/mysqld.sock
  36.  
  37. ##NAME: MYSQL_PORT:0
  38. #
  39. # MYSQL_PORT can be used with MySQL version 3.22 or later to specify a port to
  40. # connect to.
  41.  
  42. MYSQL_PORT 0
  43.  
  44. ##NAME: MYSQL_OPT:0
  45. #
  46.  
  47. # Leave MYSQL_OPT as 0, unless you know what you're doing.
  48.  
  49. MYSQL_OPT 0
  50.  
  51. ##NAME: MYSQL_DATABASE:0
  52. #
  53. # The name of the MySQL database we will open:
  54.  
  55. MYSQL_DATABASE mysql
  56.  
  57. ##NAME: MYSQL_USER_TABLE:0
  58. #
  59. # The name of the table containing your user data. See README.authmysqlrc
  60. # for the required fields in this table.
  61.  
  62. MYSQL_USER_TABLE passwd
  63.  
  64. ##NAME: MYSQL_CRYPT_PWFIELD:0
  65. #
  66. # Either MYSQL_CRYPT_PWFIELD or MYSQL_CLEAR_PWFIELD must be defined. Both
  67. # are OK too. crypted passwords go into MYSQL_CRYPT_PWFIELD, cleartext
  68. # passwords go into MYSQL_CLEAR_PWFIELD. Cleartext passwords allow
  69. # CRAM-MD5 authentication to be implemented.
  70.  
  71. MYSQL_CRYPT_PWFIELD crypt
  72.  
  73. ##NAME: MYSQL_CLEAR_PWFIELD:0
  74. #
  75. #
  76. # MYSQL_CLEAR_PWFIELD clear
  77.  
  78. ##NAME: MYSQL_DEFAULT_DOMAIN:0
  79. #
  80. # If DEFAULT_DOMAIN is defined, and someone tries to log in as 'user',
  81. # we will look up 'user@DEFAULT_DOMAIN' instead.
  82. #
  83. #
  84. # DEFAULT_DOMAIN example.com
  85.  
  86. ##NAME: MYSQL_UID_FIELD:0
  87. #
  88. # Other fields in the mysql table:
  89. #
  90. # MYSQL_UID_FIELD - contains the numerical userid of the account
  91. #
  92. MYSQL_UID_FIELD uid
  93.  
  94. ##NAME: MYSQL_GID_FIELD:0
  95. #
  96. # Numerical groupid of the account
  97.  
  98. MYSQL_GID_FIELD gid
  99.  
  100. ##NAME: MYSQL_LOGIN_FIELD:0
  101. #
  102. # The login id, default is id. Basically the query is:
  103. #
  104. # SELECT MYSQL_UID_FIELD, MYSQL_GID_FIELD, ... WHERE id='loginid'
  105. #
  106.  
  107. MYSQL_LOGIN_FIELD id
  108.  
  109. ##NAME: MYSQL_HOME_FIELD:0
  110. #
  111.  
  112. MYSQL_HOME_FIELD home
  113.  
  114. ##NAME: MYSQL_NAME_FIELD:0
  115. #
  116. # The user's name (optional)
  117.  
  118. MYSQL_NAME_FIELD name
  119.  
  120. ##NAME: MYSQL_MAILDIR_FIELD:0
  121. #
  122. # This is an optional field, and can be used to specify an arbitrary
  123. # location of the maildir for the account, which normally defaults to
  124. # $HOME/Maildir (where $HOME is read from MYSQL_HOME_FIELD).
  125. #
  126. # You still need to provide a MYSQL_HOME_FIELD, even if you uncomment this
  127. # out.
  128. #
  129. # MYSQL_MAILDIR_FIELD maildir
  130.  
  131. ##NAME: MYSQL_DEFAULTDELIVERY:0
  132. #
  133. # Courier mail server only: optional field specifies custom mail delivery
  134. # instructions for this account (if defined) -- essentially overrides
  135.  
  136. # DEFAULTDELIVERY from ${sysconfdir}/courierd
  137. #
  138. # MYSQL_DEFAULTDELIVERY defaultdelivery
  139.  
  140. ##NAME: MYSQL_QUOTA_FIELD:0
  141. #
  142. # Define MYSQL_QUOTA_FIELD to be the name of the field that can optionally
  143. # specify a maildir quota. See README.maildirquota for more information
  144. #
  145. # MYSQL_QUOTA_FIELD quota
  146.  
  147. ##NAME: MYSQL_AUXOPTIONS:0
  148. #
  149. # Auxiliary options. The MYSQL_AUXOPTIONS field should be a char field that
  150. # contains a single string consisting of comma-separated "ATTRIBUTE=NAME"
  151. # pairs. These names are additional attributes that define various per-account
  152. # "options", as given in INSTALL's description of the "Account OPTIONS"
  153. # setting.
  154. #
  155. # MYSQL_AUXOPTIONS_FIELD auxoptions
  156. #
  157. # You might want to try something like this, if you'd like to use a bunch
  158. # of individual fields, instead of a single text blob:
  159. #
  160. # MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
  161. #
  162. # This will let you define fields called "disableimap", etc, with the end result
  163. # being something that the OPTIONS parser understands.
  164.  
  165.  
  166. ##NAME: MYSQL_WHERE_CLAUSE:0
  167. #
  168. # This is optional, MYSQL_WHERE_CLAUSE can be basically set to an arbitrary
  169. # fixed string that is appended to the WHERE clause of our query
  170. #
  171. # MYSQL_WHERE_CLAUSE server='mailhost.example.com'
  172.  
  173. ##NAME: MYSQL_SELECT_CLAUSE:0
  174. #
  175. # (EXPERIMENTAL)
  176. # This is optional, MYSQL_SELECT_CLAUSE can be set when you have a database,
  177. # which is structuraly different from proposed. The fixed string will
  178. # be used to do a SELECT operation on database, which should return fields
  179. # in order specified bellow:
  180. #
  181. # username, cryptpw, clearpw, uid, gid, home, maildir, quota, fullname, options
  182. #
  183. # The username field should include the domain (see example below).
  184. #
  185. # Enabling this option causes ignorance of any other field-related
  186. # options, excluding default domain.
  187. #
  188. # There are two variables, which you can use. Substitution will be made
  189. # for them, so you can put entered username (local part) and domain name
  190. # in the right place of your query. These variables are:
  191. # $(local_part), $(domain), $(service)
  192. #
  193. # If a $(domain) is empty (not given by the remote user) the default domain
  194. # name is used in its place.
  195. #
  196. # $(service) will expand out to the service being authenticated: imap, imaps,
  197. # pop3 or pop3s. Courier mail server only: service will also expand out to
  198. # "courier", when searching for local mail account's location. In this case,
  199. # if the "maildir" field is not empty it will be used in place of
  200. # DEFAULTDELIVERY. Courier mail server will also use esmtp when doing
  201. # authenticated ESMTP.
  202. #
  203. # This example is a little bit modified adaptation of vmail-sql
  204. # database scheme:
  205. #
  206. # MYSQL_SELECT_CLAUSE SELECT CONCAT(popbox.local_part, '@', popbox.domain_name), \
  207. # CONCAT('{MD5}', popbox.password_hash), \
  208. # popbox.clearpw, \
  209. # domain.uid, \
  210. # domain.gid, \
  211. # CONCAT(domain.path, '/', popbox.mbox_name), \
  212. # '', \
  213. # domain.quota, \
  214. # '', \
  215. # CONCAT("disableimap=",disableimap,",disablepop3=", \
  216. # disablepop3,",disablewebmail=",disablewebmail, \
  217. # ",sharedgroup=",sharedgroup) \
  218. # FROM popbox, domain \
  219. # WHERE popbox.local_part = '$(local_part)' \
  220. # AND popbox.domain_name = '$(domain)' \
  221. # AND popbox.domain_name = domain.domain_name
  222.  
  223. ##NAME: MYSQL_ENUMERATE_CLAUSE:0
  224. #
  225. # {EXPERIMENTAL}
  226. # Optional custom SQL query used to enumerate accounts for authenumerate,
  227. # in order to compile a list of accounts for shared folders. The query
  228. # should return the following fields: name, uid, gid, homedir, maildir
  229. #
  230. # Example:
  231. # MYSQL_ENUMERATE_CLAUSE SELECT CONCAT(popbox.local_part, '@', popbox.domain_name), \
  232. # domain.uid, \
  233. # domain.gid, \
  234. # CONCAT(domain.path, '/', popbox.mbox_name), \
  235. # '' \
  236. # FROM popbox, domain \
  237. # WHERE popbox.local_part = '$(local_part)' \
  238. # AND popbox.domain_name = '$(domain)' \
  239. # AND popbox.domain_name = domain.domain_name
  240.  
  241.  
  242.  
  243. ##NAME: MYSQL_CHPASS_CLAUSE:0
  244. #
  245. # (EXPERIMENTAL)
  246. # This is optional, MYSQL_CHPASS_CLAUSE can be set when you have a database,
  247. # which is structuraly different from proposed. The fixed string will
  248. # be used to do an UPDATE operation on database. In other words, it is
  249. # used, when changing password.
  250. #
  251. # There are four variables, which you can use. Substitution will be made
  252. # for them, so you can put entered username (local part) and domain name
  253. # in the right place of your query. There variables are:
  254. # $(local_part) , $(domain) , $(newpass) , $(newpass_crypt)
  255. #
  256. # If a $(domain) is empty (not given by the remote user) the default domain
  257. # name is used in its place.
  258. # $(newpass) contains plain password
  259. # $(newpass_crypt) contains its crypted form
  260. #
  261. # MYSQL_CHPASS_CLAUSE UPDATE popbox \
  262. # SET clearpw='$(newpass)', \
  263. # password_hash='$(newpass_crypt)' \
  264. # WHERE local_part='$(local_part)' \
  265. # AND domain_name='$(domain)'

Nous devons modifier le fichier, afin qu'il cole à notre système de messagerie avec comptes virtuels

disquette /etc/courier/authmysqlrc

  1. ##VERSION: $Id: authmysqlrc,v 1.17 2004/04/20 01:38:17 mrsam Exp $
  2. #
  3. # Copyright 2000-2004 Double Precision, Inc. See COPYING for
  4. # distribution information.
  5. #
  6. # Do not alter lines that begin with ##, they are used when upgrading
  7. # this configuration.
  8. #
  9. # authmysqlrc created from authmysqlrc.dist by sysconftool
  10. #
  11. # DO NOT INSTALL THIS FILE with world read permissions. This file
  12. # might contain the MySQL admin password!
  13. #
  14. # Each line in this file must follow the following format:
  15. #
  16. # field[spaces|tabs]value
  17. #
  18. # That is, the name of the field, followed by spaces or tabs, followed by
  19. # field value. Trailing spaces are prohibited.
  20.  
  21.  
  22. ##NAME: LOCATION:0
  23. #
  24. # The server name, userid, and password used to log in.
  25.  
  26. MYSQL_SERVER 127.0.0.1
  27. MYSQL_USERNAME postfix
  28. MYSQL_PASSWORD postfix
  29.  
  30. ##NAME: MYSQL_SOCKET:0
  31. #
  32. # MYSQL_SOCKET can be used with MySQL version 3.22 or later, it specifies the
  33. # filesystem pipe used for the connection
  34. #
  35. # MYSQL_SOCKET /var/run/mysqld/mysqld.sock
  36.  
  37. ##NAME: MYSQL_PORT:0
  38. #
  39. # MYSQL_PORT can be used with MySQL version 3.22 or later to specify a port to
  40. # connect to.
  41.  
  42. MYSQL_PORT 0
  43.  
  44. ##NAME: MYSQL_OPT:0
  45. #
  46.  
  47. # Leave MYSQL_OPT as 0, unless you know what you're doing.
  48.  
  49. MYSQL_OPT 0
  50.  
  51. ##NAME: MYSQL_DATABASE:0
  52. #
  53. # The name of the MySQL database we will open:
  54.  
  55. MYSQL_DATABASE postfix_db
  56.  
  57. ##NAME: MYSQL_USER_TABLE:0
  58. #
  59. # The name of the table containing your user data. See README.authmysqlrc
  60. # for the required fields in this table.
  61.  
  62. MYSQL_USER_TABLE users
  63.  
  64. ##NAME: MYSQL_CRYPT_PWFIELD:0
  65. #
  66. # Either MYSQL_CRYPT_PWFIELD or MYSQL_CLEAR_PWFIELD must be defined. Both
  67. # are OK too. crypted passwords go into MYSQL_CRYPT_PWFIELD, cleartext
  68. # passwords go into MYSQL_CLEAR_PWFIELD. Cleartext passwords allow
  69. # CRAM-MD5 authentication to be implemented.
  70.  
  71. MYSQL_CRYPT_PWFIELD crypt
  72.  
  73. ##NAME: MYSQL_CLEAR_PWFIELD:0
  74. #
  75. #
  76. # MYSQL_CLEAR_PWFIELD password
  77.  
  78. ##NAME: MYSQL_DEFAULT_DOMAIN:0
  79. #
  80. # If DEFAULT_DOMAIN is defined, and someone tries to log in as 'user',
  81. # we will look up 'user@DEFAULT_DOMAIN' instead.
  82. #
  83. #
  84. # DEFAULT_DOMAIN example.com
  85.  
  86. ##NAME: MYSQL_UID_FIELD:0
  87. #
  88. # Other fields in the mysql table:
  89. #
  90. # MYSQL_UID_FIELD - contains the numerical userid of the account
  91. #
  92. MYSQL_UID_FIELD 5000
  93.  
  94. ##NAME: MYSQL_GID_FIELD:0
  95. #
  96. # Numerical groupid of the account
  97.  
  98. MYSQL_GID_FIELD 5000
  99.  
  100. ##NAME: MYSQL_LOGIN_FIELD:0
  101. #
  102. # The login id, default is id. Basically the query is:
  103. #
  104. # SELECT MYSQL_UID_FIELD, MYSQL_GID_FIELD, ... WHERE id='loginid'
  105. #
  106.  
  107. MYSQL_LOGIN_FIELD email
  108.  
  109. ##NAME: MYSQL_HOME_FIELD:0
  110. #
  111.  
  112. MYSQL_HOME_FIELD "/home/vmail"
  113.  
  114. ##NAME: MYSQL_NAME_FIELD:0
  115. #
  116. # The user's name (optional)
  117.  
  118. MYSQL_NAME_FIELD name
  119.  
  120. ##NAME: MYSQL_MAILDIR_FIELD:0
  121. #
  122. # This is an optional field, and can be used to specify an arbitrary
  123. # location of the maildir for the account, which normally defaults to
  124. # $HOME/Maildir (where $HOME is read from MYSQL_HOME_FIELD).
  125. #
  126. # You still need to provide a MYSQL_HOME_FIELD, even if you uncomment this
  127. # out.
  128. #
  129. MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')

J'ai supprimé le lignes inutiles dans notre cas !

Références

Remerciements

Merci à David, Marc, François et Pierre pour m'avoir aidé lors de longues scéances de débugages de mon serveur de mail.

Avertissement

Ne tentez pas de vous connecter sur le serveur mail.j2c-s2c.com pour faire des essais, votre IP apparaitrait dans les logs, et vous seriez banni de l'ensemble des services proposés par j2c-s2c.com : y compris ce site..
Avant de faire des conneries, contactez moi !

Il y a 2 commentaires.

pencil Afficher les commentaires

.: Dernière mise à jour le 30/07/2008

Conception et design Jérôme CROCHET © 2000 - 2008 · j2c-s2c.com · Tous droits réservés.

Votre IP : 38.103.63.59 () - Page générée en 0,8571 s

Toute diffusion, même partielle de ce document, doit être soumise à une autorisation écrite préalable de son auteur.

Attention : Toutes les tentatives d'attaque envers ce serveur sont enregistrées, une plainte pourra être déposée.

miam