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
- Avoir une connection à internet via une IP Fixe (l'usage d'IP dynamique n'est pas couverte par cet article)
- Avoir un serveur sous Linux connecté en permanance à internet avec un VRAI firewall
- Avoir installé Debian Stable (4 ETCH).. (l'utilisation d'une autre distribution nécéssitera de modifier un peu l'article)
- Il est conseillé d'avoir un serveur DNS en marche
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 | password | active |
|---|
Pour les flémard : un script sql :
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
/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
/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
/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'
/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 :
- # See /usr/share/postfix/main.cf.dist for a commented, more complete version
- smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
- biff = no
- # appending .domain is the MUA's job.
- append_dot_mydomain = no
- # Uncomment the next line to generate "delayed mail" warnings
- # delay_warning_time = 4h
- myhostname = localhost.localdomain
- alias_maps = hash:/etc/aliases
- alias_database = hash:/etc/aliases
- myorigin = /etc/mailname
- mydestination = exemple.com, localhost.localdomain, localhost.localdomain, localhost
- relayhost =
- mynetworks = 127.0.0.0/8
- mailbox_command = procmail -a "$EXTENSION"
- mailbox_size_limit = 0
- recipient_delimiter = +
- 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 !!!
- # See /usr/share/postfix/main.cf.dist for a commented, more complete version
- smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
- biff = no
- # Appending .domain is the MUA's job.
- append_dot_mydomain = no
- # Uncomment the next line to generate "delayed mail" warnings
- #delay_warning_time = 4h
- # Noms du serveur, et nom de domaine
- myhostname = mail.exemple.com
- mydomain = exemple.com
- # Table des alias
- alias_maps = hash:/etc/aliases
- alias_database = hash:/etc/aliases
- # Origine : qui je suis, et Destination : pour qui j'accèpte de délivrer du courier
- myorigin = $mydomain
- mydestination = localhost.localdomain, localhost.localdomain, localhost
- # Relai SMTP de mon FAI
- relayhost = [smtp.free.fr]
- # Mes réseaux locaux
- mynetworks = 127.0.0.0/8 , 192.168.0.0/16
- mynetworks_style = host
- # Commande pour envoyer des mails
- mailbox_command = procmail -a "$EXTENSION"
- # Quotas et délimiteur des adresse de destinations
- mailbox_size_limit = 0
- recipient_delimiter = +
- # Interfaces à écouter : on veut être accessible à partir d'internet comme du LOCAL
- inet_interfaces = all
- # Mise en place de la gestion des boites virtuelles : accès aux fichiers de conf
- virtual_alias_domains =
- virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf mysql:/etc/postfix/mysql-virtual_email2email.cf
- virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
- virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
- # Emplacement de base des mails en destination de boites virtuelles
- virtual_mailbox_base = /home/vmail
- # GID et UID du propriétaire du compte
- virtual_uid_maps = static:5000
- 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 | 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
- # See /usr/share/postfix/main.cf.dist for a commented, more complete version
- smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
- biff = no
- # Appending .domain is the MUA's job.
- append_dot_mydomain = no
- # Uncomment the next line to generate "delayed mail" warnings
- #delay_warning_time = 4h
- # Noms du serveur, et nom de domaine
- myhostname = mail.exemple.com
- mydomain = exemple.com
- # Table des alias
- alias_maps = hash:/etc/aliases
- alias_database = hash:/etc/aliases
- # Origine : qui je suis, et Destination : pour qui j'accèpte de délivrer du courier
- myorigin = $mydomain
- mydestination = localhost.localdomain, localhost.localdomain, localhost
- # Relai SMTP de mon FAI
- relayhost = [smtp.free.fr]
- # Mes réseaux locaux
- mynetworks = 127.0.0.0/8 , 192.168.0.0/16
- mynetworks_style = host
- # Commande pour envoyer des mails
- mailbox_command = procmail -a "$EXTENSION"
- # Quotas et délimiteur des adresse de destinations
- mailbox_size_limit = 0
- recipient_delimiter = +
- # Interfaces à écouter : on veut être accessible à partir d'internet comme du LOCAL
- inet_interfaces = all
- # Mise en place de la gestion des boites virtuelles : accès aux fichiers de conf
- virtual_alias_domains =
- virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_forwardings.cf mysql:/etc/postfix/mysql-virtual_email2email.cf
- virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
- virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
- # Emplacement de base des mails en destination de boites virtuelles
- virtual_mailbox_base = /home/vmail
- # GID et UID du propriétaire du compte
- virtual_uid_maps = static:5000
- virtual_gid_maps = static:5000
- # SASL / TLS
- smtpd_sasl_auth_enable = yes
- broken_sasl_auth_clients = yes
- smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
- smtpd_use_tls = yes
- smtpd_tls_cert_file = /etc/postfix/smtpd.cert
- 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 :
/etc/postfix/sasl/smtpd.conf
- # module à charger pour gerer l'authentification via la base de données
- pwcheck_method: auxprop
- # plugin sql à charger
- auxprop_plugin: sql
- # type de mot de passe pris en charge
- mech_list: plain login cram-md5 digest-md5
- # type de base sql
- sql_engine: mysql
- # identifiants de connection
- sql_hostnames: 127.0.0.1
- sql_user: postfix
- sql_passwd: postfix
- sql_database: postfix_db
- #champs à récuperer pour le mot de passe
- 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
- ##VERSION: $Id: authdaemonrc.in,v 1.8 2001/10/07 02:16:22 mrsam Exp $
- #
- # Copyright 2000-2001 Double Precision, Inc. See COPYING for
- # distribution information.
- #
- # authdaemonrc created from authdaemonrc.dist by sysconftool
- #
- # Do not alter lines that begin with ##, they are used when upgrading
- # this configuration.
- #
- # This file configures authdaemond, the resident authentication daemon.
- #
- # Comments in this file are ignored. Although this file is intended to
- # be sourced as a shell script, authdaemond parses it manually, so
- # the acceptable syntax is a bit limited. Multiline variable contents,
- # with the \ continuation character, are not allowed. Everything must
- # fit on one line. Do not use any additional whitespace for indentation,
- # or anything else.
- ##NAME: authmodulelist:0
- #
- # The authentication modules that are linked into authdaemond. The
- # default list is installed. You may selectively disable modules simply
- # by removing them from the following list. The available modules you
- # can use are: authcustom authcram authuserdb authldap authpgsql authmysql authpam
- authmodulelist="authpam"
- ##NAME: authmodulelistorig:1
- #
- # This setting is used by Courier's webadmin module, and should be left
- # alone
- authmodulelistorig="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
- ##NAME: daemons:0
- #
- # The number of daemon processes that are started. authdaemon is typically
- # installed where authentication modules are relatively expensive: such
- # as authldap, or authmysql, so it's better to have a number of them running.
- # PLEASE NOTE: Some platforms may experience a problem if there's more than
- # one daemon. Specifically, SystemV derived platforms that use TLI with
- # socket emulation. I'm suspicious of TLI's ability to handle multiple
- # processes accepting connections on the same filesystem domain socket.
- #
- # You may need to increase daemons if as your system load increases. Symptoms
- # include sporadic authentication failures. If you start getting
- # authentication failures, increase daemons. However, the default of 5
- # SHOULD be sufficient. Bumping up daemon count is only a short-term
- # solution. The permanent solution is to add more resources: RAM, faster
- # disks, faster CPUs...
- daemons=5
- ##NAME: version:0
- #
- # When you have multiple versions of authdaemond.* installed, authdaemond
- # just picks the first one it finds. Set "version" to override that.
- # For example: version=authdaemond.plain
- version=""
- ##NAME: authdaemonvar:0
- #
- # authdaemonvar is here, but is not used directly by authdaemond. It's
- # used by various configuration and build scripts, so don't touch it!
- authdaemonvar=/var/run/courier/authdaemon
Il suffit de modifier la ligne 27 : authmodulelist="authpam" en authmodulelist="authmysql".
Il sagit maintenant de mettre en place un fichier qui permet à courier de connaitre les identifiants de connection mysql
Le fichier d'origine :
- ##VERSION: $Id: authmysqlrc,v 1.17 2004/04/20 01:38:17 mrsam Exp $
- #
- # Copyright 2000-2004 Double Precision, Inc. See COPYING for
- # distribution information.
- #
- # Do not alter lines that begin with ##, they are used when upgrading
- # this configuration.
- #
- # authmysqlrc created from authmysqlrc.dist by sysconftool
- #
- # DO NOT INSTALL THIS FILE with world read permissions. This file
- # might contain the MySQL admin password!
- #
- # Each line in this file must follow the following format:
- #
- # field[spaces|tabs]value
- #
- # That is, the name of the field, followed by spaces or tabs, followed by
- # field value. Trailing spaces are prohibited.
- ##NAME: LOCATION:0
- #
- # The server name, userid, and password used to log in.
- MYSQL_SERVER localhost
- MYSQL_USERNAME admin
- MYSQL_PASSWORD admin
- ##NAME: MYSQL_SOCKET:0
- #
- # MYSQL_SOCKET can be used with MySQL version 3.22 or later, it specifies the
- # filesystem pipe used for the connection
- #
- # MYSQL_SOCKET /var/run/mysqld/mysqld.sock
- ##NAME: MYSQL_PORT:0
- #
- # MYSQL_PORT can be used with MySQL version 3.22 or later to specify a port to
- # connect to.
- MYSQL_PORT 0
- ##NAME: MYSQL_OPT:0
- #
- # Leave MYSQL_OPT as 0, unless you know what you're doing.
- MYSQL_OPT 0
- ##NAME: MYSQL_DATABASE:0
- #
- # The name of the MySQL database we will open:
- MYSQL_DATABASE mysql
- ##NAME: MYSQL_USER_TABLE:0
- #
- # The name of the table containing your user data. See README.authmysqlrc
- # for the required fields in this table.
- MYSQL_USER_TABLE passwd
- ##NAME: MYSQL_CRYPT_PWFIELD:0
- #
- # Either MYSQL_CRYPT_PWFIELD or MYSQL_CLEAR_PWFIELD must be defined. Both
- # are OK too. crypted passwords go into MYSQL_CRYPT_PWFIELD, cleartext
- # passwords go into MYSQL_CLEAR_PWFIELD. Cleartext passwords allow
- # CRAM-MD5 authentication to be implemented.
- MYSQL_CRYPT_PWFIELD crypt
- ##NAME: MYSQL_CLEAR_PWFIELD:0
- #
- #
- # MYSQL_CLEAR_PWFIELD clear
- ##NAME: MYSQL_DEFAULT_DOMAIN:0
- #
- # If DEFAULT_DOMAIN is defined, and someone tries to log in as 'user',
- # we will look up 'user@DEFAULT_DOMAIN' instead.
- #
- #
- # DEFAULT_DOMAIN example.com
- ##NAME: MYSQL_UID_FIELD:0
- #
- # Other fields in the mysql table:
- #
- # MYSQL_UID_FIELD - contains the numerical userid of the account
- #
- MYSQL_UID_FIELD uid
- ##NAME: MYSQL_GID_FIELD:0
- #
- # Numerical groupid of the account
- MYSQL_GID_FIELD gid
- ##NAME: MYSQL_LOGIN_FIELD:0
- #
- # The login id, default is id. Basically the query is:
- #
- # SELECT MYSQL_UID_FIELD, MYSQL_GID_FIELD, ... WHERE id='loginid'
- #
- MYSQL_LOGIN_FIELD id
- ##NAME: MYSQL_HOME_FIELD:0
- #
- MYSQL_HOME_FIELD home
- ##NAME: MYSQL_NAME_FIELD:0
- #
- # The user's name (optional)
- MYSQL_NAME_FIELD name
- ##NAME: MYSQL_MAILDIR_FIELD:0
- #
- # This is an optional field, and can be used to specify an arbitrary
- # location of the maildir for the account, which normally defaults to
- # $HOME/Maildir (where $HOME is read from MYSQL_HOME_FIELD).
- #
- # You still need to provide a MYSQL_HOME_FIELD, even if you uncomment this
- # out.
- #
- # MYSQL_MAILDIR_FIELD maildir
- ##NAME: MYSQL_DEFAULTDELIVERY:0
- #
- # Courier mail server only: optional field specifies custom mail delivery
- # instructions for this account (if defined) -- essentially overrides
- # DEFAULTDELIVERY from ${sysconfdir}/courierd
- #
- # MYSQL_DEFAULTDELIVERY defaultdelivery
- ##NAME: MYSQL_QUOTA_FIELD:0
- #
- # Define MYSQL_QUOTA_FIELD to be the name of the field that can optionally
- # specify a maildir quota. See README.maildirquota for more information
- #
- # MYSQL_QUOTA_FIELD quota
- ##NAME: MYSQL_AUXOPTIONS:0
- #
- # Auxiliary options. The MYSQL_AUXOPTIONS field should be a char field that
- # contains a single string consisting of comma-separated "ATTRIBUTE=NAME"
- # pairs. These names are additional attributes that define various per-account
- # "options", as given in INSTALL's description of the "Account OPTIONS"
- # setting.
- #
- # MYSQL_AUXOPTIONS_FIELD auxoptions
- #
- # You might want to try something like this, if you'd like to use a bunch
- # of individual fields, instead of a single text blob:
- #
- # MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
- #
- # This will let you define fields called "disableimap", etc, with the end result
- # being something that the OPTIONS parser understands.
- ##NAME: MYSQL_WHERE_CLAUSE:0
- #
- # This is optional, MYSQL_WHERE_CLAUSE can be basically set to an arbitrary
- # fixed string that is appended to the WHERE clause of our query
- #
- # MYSQL_WHERE_CLAUSE server='mailhost.example.com'
- ##NAME: MYSQL_SELECT_CLAUSE:0
- #
- # (EXPERIMENTAL)
- # This is optional, MYSQL_SELECT_CLAUSE can be set when you have a database,
- # which is structuraly different from proposed. The fixed string will
- # be used to do a SELECT operation on database, which should return fields
- # in order specified bellow:
- #
- # username, cryptpw, clearpw, uid, gid, home, maildir, quota, fullname, options
- #
- # The username field should include the domain (see example below).
- #
- # Enabling this option causes ignorance of any other field-related
- # options, excluding default domain.
- #
- # There are two variables, which you can use. Substitution will be made
- # for them, so you can put entered username (local part) and domain name
- # in the right place of your query. These variables are:
- # $(local_part), $(domain), $(service)
- #
- # If a $(domain) is empty (not given by the remote user) the default domain
- # name is used in its place.
- #
- # $(service) will expand out to the service being authenticated: imap, imaps,
- # pop3 or pop3s. Courier mail server only: service will also expand out to
- # "courier", when searching for local mail account's location. In this case,
- # if the "maildir" field is not empty it will be used in place of
- # DEFAULTDELIVERY. Courier mail server will also use esmtp when doing
- # authenticated ESMTP.
- #
- # This example is a little bit modified adaptation of vmail-sql
- # database scheme:
- #
- # MYSQL_SELECT_CLAUSE SELECT CONCAT(popbox.local_part, '@', popbox.domain_name), \
- # CONCAT('{MD5}', popbox.password_hash), \
- # popbox.clearpw, \
- # domain.uid, \
- # domain.gid, \
- # CONCAT(domain.path, '/', popbox.mbox_name), \
- # '', \
- # domain.quota, \
- # '', \
- # CONCAT("disableimap=",disableimap,",disablepop3=", \
- # disablepop3,",disablewebmail=",disablewebmail, \
- # ",sharedgroup=",sharedgroup) \
- # FROM popbox, domain \
- # WHERE popbox.local_part = '$(local_part)' \
- # AND popbox.domain_name = '$(domain)' \
- # AND popbox.domain_name = domain.domain_name
- ##NAME: MYSQL_ENUMERATE_CLAUSE:0
- #
- # {EXPERIMENTAL}
- # Optional custom SQL query used to enumerate accounts for authenumerate,
- # in order to compile a list of accounts for shared folders. The query
- # should return the following fields: name, uid, gid, homedir, maildir
- #
- # Example:
- # MYSQL_ENUMERATE_CLAUSE SELECT CONCAT(popbox.local_part, '@', popbox.domain_name), \
- # domain.uid, \
- # domain.gid, \
- # CONCAT(domain.path, '/', popbox.mbox_name), \
- # '' \
- # FROM popbox, domain \
- # WHERE popbox.local_part = '$(local_part)' \
- # AND popbox.domain_name = '$(domain)' \
- # AND popbox.domain_name = domain.domain_name
- ##NAME: MYSQL_CHPASS_CLAUSE:0
- #
- # (EXPERIMENTAL)
- # This is optional, MYSQL_CHPASS_CLAUSE can be set when you have a database,
- # which is structuraly different from proposed. The fixed string will
- # be used to do an UPDATE operation on database. In other words, it is
- # used, when changing password.
- #
- # There are four variables, which you can use. Substitution will be made
- # for them, so you can put entered username (local part) and domain name
- # in the right place of your query. There variables are:
- # $(local_part) , $(domain) , $(newpass) , $(newpass_crypt)
- #
- # If a $(domain) is empty (not given by the remote user) the default domain
- # name is used in its place.
- # $(newpass) contains plain password
- # $(newpass_crypt) contains its crypted form
- #
- # MYSQL_CHPASS_CLAUSE UPDATE popbox \
- # SET clearpw='$(newpass)', \
- # password_hash='$(newpass_crypt)' \
- # WHERE local_part='$(local_part)' \
- # AND domain_name='$(domain)'
Nous devons modifier le fichier, afin qu'il cole à notre système de messagerie avec comptes virtuels
- ##VERSION: $Id: authmysqlrc,v 1.17 2004/04/20 01:38:17 mrsam Exp $
- #
- # Copyright 2000-2004 Double Precision, Inc. See COPYING for
- # distribution information.
- #
- # Do not alter lines that begin with ##, they are used when upgrading
- # this configuration.
- #
- # authmysqlrc created from authmysqlrc.dist by sysconftool
- #
- # DO NOT INSTALL THIS FILE with world read permissions. This file
- # might contain the MySQL admin password!
- #
- # Each line in this file must follow the following format:
- #
- # field[spaces|tabs]value
- #
- # That is, the name of the field, followed by spaces or tabs, followed by
- # field value. Trailing spaces are prohibited.
- ##NAME: LOCATION:0
- #
- # The server name, userid, and password used to log in.
- MYSQL_SERVER 127.0.0.1
- MYSQL_USERNAME postfix
- MYSQL_PASSWORD postfix
- ##NAME: MYSQL_SOCKET:0
- #
- # MYSQL_SOCKET can be used with MySQL version 3.22 or later, it specifies the
- # filesystem pipe used for the connection
- #
- # MYSQL_SOCKET /var/run/mysqld/mysqld.sock
- ##NAME: MYSQL_PORT:0
- #
- # MYSQL_PORT can be used with MySQL version 3.22 or later to specify a port to
- # connect to.
- MYSQL_PORT 0
- ##NAME: MYSQL_OPT:0
- #
- # Leave MYSQL_OPT as 0, unless you know what you're doing.
- MYSQL_OPT 0
- ##NAME: MYSQL_DATABASE:0
- #
- # The name of the MySQL database we will open:
- MYSQL_DATABASE postfix_db
- ##NAME: MYSQL_USER_TABLE:0
- #
- # The name of the table containing your user data. See README.authmysqlrc
- # for the required fields in this table.
- MYSQL_USER_TABLE users
- ##NAME: MYSQL_CRYPT_PWFIELD:0
- #
- # Either MYSQL_CRYPT_PWFIELD or MYSQL_CLEAR_PWFIELD must be defined. Both
- # are OK too. crypted passwords go into MYSQL_CRYPT_PWFIELD, cleartext
- # passwords go into MYSQL_CLEAR_PWFIELD. Cleartext passwords allow
- # CRAM-MD5 authentication to be implemented.
- MYSQL_CRYPT_PWFIELD crypt
- ##NAME: MYSQL_CLEAR_PWFIELD:0
- #
- #
- # MYSQL_CLEAR_PWFIELD password
- ##NAME: MYSQL_DEFAULT_DOMAIN:0
- #
- # If DEFAULT_DOMAIN is defined, and someone tries to log in as 'user',
- # we will look up 'user@DEFAULT_DOMAIN' instead.
- #
- #
- # DEFAULT_DOMAIN example.com
- ##NAME: MYSQL_UID_FIELD:0
- #
- # Other fields in the mysql table:
- #
- # MYSQL_UID_FIELD - contains the numerical userid of the account
- #
- MYSQL_UID_FIELD 5000
- ##NAME: MYSQL_GID_FIELD:0
- #
- # Numerical groupid of the account
- MYSQL_GID_FIELD 5000
- ##NAME: MYSQL_LOGIN_FIELD:0
- #
- # The login id, default is id. Basically the query is:
- #
- # SELECT MYSQL_UID_FIELD, MYSQL_GID_FIELD, ... WHERE id='loginid'
- #
- MYSQL_LOGIN_FIELD email
- ##NAME: MYSQL_HOME_FIELD:0
- #
- MYSQL_HOME_FIELD "/home/vmail"
- ##NAME: MYSQL_NAME_FIELD:0
- #
- # The user's name (optional)
- MYSQL_NAME_FIELD name
- ##NAME: MYSQL_MAILDIR_FIELD:0
- #
- # This is an optional field, and can be used to specify an arbitrary
- # location of the maildir for the account, which normally defaults to
- # $HOME/Maildir (where $HOME is read from MYSQL_HOME_FIELD).
- #
- # You still need to provide a MYSQL_HOME_FIELD, even if you uncomment this
- # out.
- #
- MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
J'ai supprimé le lignes inutiles dans notre cas !
Références
- http://www.starbridge.org/spip/spip.php?article12SUPERBE ARRTICLE SUR POSTFIX !! ma nouvelle référence
- http://www.howtoforge.com/taxonomy_menu/1/4 : un ensemble d'articles sur postfix
- deus-rulez.com : lien direct - (Copie locale)
- http://www.qmailrocks.org/start_qmail.htm (en) : pour les tests pop et imap.
- http://giik.net/blognotes/index.php/2005/08/28/13-installer-pear-xml_seriliazer-sous-linux-mandrake-101Installation de certains package PEAR
- http://www.littleboboy.net/archives/2005/04/15/postfix-courier-imap
- http://www.howtoforge.com/virtual_postfix_mysql_quota_courier
- http://www.howtoforge.com/greylisting_postfix_postgrey
- http://www.art-coding.fr/index.php/2006/04/14/3-comment-installer-horde-imp-sur-un-serveur-en-release-ovh
- http://www.security-labs.org/full-page.php3?page=413
- magouille avec spamassassin http://www.nuxwin.com/articles/view.php/91
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.
.: Dernière mise à jour le 30/07/2008

Afficher les commentaires


Uptime :