VI. Configuration de Postfix▲
VI-A. Introduction▲
Que manque-t-il de crucial sur notre serveur web ? Un MTA. En effet, actuellement, nous pouvons accéder à notre site, le mettre à jour, et y exécuter des pages web. Il faut maintenant pouvoir envoyer et recevoir des mails.
C'est le rôle de Postfix. Un MTA (Mail Transfert Agent) très connu, très performant, et assez simple à mettre en œuvre. Une fois de plus, son choix a été décisif vis-à-vis de sa possibilité à gérer les utilisateurs virtuels. Chacun de nos sites sera désireux d'avoir un ou plusieurs mails. Ce système nous permettra de proposer un nombre infini de mails pour chaque site, sans risque de conflit entre utilisateurs.
VI-A-1. Création de l'utilisateur▲
On commence par rajouter l'utilisateur et le groupe qui gérera postfix :
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m
VI-A-2. Configuration de Mysql▲
Pour commencer, il faut autoriser mysql à se connecter en local (pour cela, rechercher et décommenter bind-adress) :
bind-address = 127.0.0.1
# skip-networking
On se connecte à mysql en root, afin de le configurer :
# mysql -p
On entre le mot de passe lorsque le shell nous le demande. On va maintenant ajouter nos paramètres Mysql :
> create database postfix;
> use postfix;
> CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';
> CREATE TABLE `mailbox` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`actif` tinyint(1) NOT NULL default '1',
`imap` tinyint(1) NOT NULL default '1',
`pop3` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites Emails Virtuelles';
> CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias Virtuels';
On rajoute l'utilisateur mysql pour postfix (pensez à remplacer MONMOTDEPASSE par le mot de passe désiré).
> GRANT SELECT ON `postfix`.* TO 'postfix'@'%' IDENTIFIED BY 'MONMOTDEPASSE';
On applique les paramètres :
> FLUSH PRIVILEGES;
Et on termine notre session mysql.
> exit;
VI-A-3. Fichiers de configuration▲
On va éditer/créer nos fichiers de configuration. N'oubliez pas de mettre vos informations à jour, sous peine d'erreurs.
smtp_banner = $myhostname ESMTP (Debian / GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes
append_dot_mydomain = no
mydestination = nom_de_votre_serveur, localhost, localhost.localdomain
mydomain = nom_de_votre_serveur
myhostname = nom_de_votre_serveur
relayhost =
mynetworks = 127.0.0.0/8 ip_de_votre_serveur
inet_interfaces = all
smtpd_sender_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
warn_if_reject reject_unverified_sender
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient
smtpd_client_restrictions =
reject_unknown_client,
permit_mynetworks
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf, mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine. Veuillez re-essayer plus tard !"
virtual_overquota_bounce = yes
hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = quota
table = mailbox
where_field = email
hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif='1'
hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif='1'
hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif='1'
hosts = 127.0.0.1
user = postfix
password = VOTREMOTDEPASSE
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif='1'
On modifie les droits de ces fichiers de configuration :
# chgrp postfix /etc/postfix/mysql-virtual_*.cf
# chmod u=rw,g=r,o= /etc/postfix/mysql-virtual_*.cf
Un redémarrage de Postfix, et un test de la configuration :
# /etc/init.d/postfix restart
# postfix check
VI-A-4. Configuration du courrier▲
# apt-get install courier-base courier-authdaemon courier-authmysql courier-imap courier-pop
À la question posée, on répond par oui.
On va maintenant signaler à postfix que l'on utilise mysql pour l'identification :
/etc./courier/authdaemonrc
Et on modifie la ligne qui commence par authmodulelist.
authmodulelist="authmysql"
Je remplace le contenu du fichier /etc./courier/authmysqlrc par ce qui suit :
# >/etc./courier/authmysqlrc
# nano /etc./courier/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD MOTDEPASSE
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/var/spool/vmail/"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
MYSQL_QUOTA_FIELD quota
On pense à redémarrer les différents démons que l'on a paramétrés :
# /etc/init.d/courier-authdaemon restart
# /etc/init.d/courier-imap restart
# /etc/init.d/courier-pop restart
L'accès POP ou IMAP échouera si la boîte mail n'existe pas ! En conséquence, je vous conseille d'envoyer un email de bienvenue lors de la création de vos comptes. Cela vous permettra de créer le répertoire !
VI-A-5. Test du serveur▲
On commence par installer les outils :
# apt-get install mailutils
On teste que notre domaine est bien configuré dans bind pour accepter notre serveur mail :
# host -t MX nom_domaine
Il doit répondre nom_domaine mail is handled by 10 mail.nom_domaine.tld. Dans le cas contraire, il est nécessaire d'aller configurer BIND !
On va ajouter notre compte dans notre base de données. N'oubliez pas de remplacer les valeurs par les vôtres.
# mysql -u root -p
==> On entre le mot de passe
> use postfix;
> INSERT INTO domain (domain, actif) VALUES ('nom_domaine.com', '1');
> INSERT INTO mailbox (email,password,quota,actif,imap,pop3) VALUES ('user@nom_domaine.com',ENCRYPT('MONMOTDEPASSEDUCOMPTEMAIL'),0,1,1,1);
> exit;
Et maintenant, on va envoyer un mail à notre propre utilisateur, et à une adresse externe (j'ai testé avec Gmail sans que ce soit reconnu comme spam) :
mail -s sujet
To : user@nom_domaine.com
Cc : user@domaine_externe.com
texte du mail
.
- mail -s ==> pour envoyer le sujet. Remplacez le mot sujet par un sujet.
- To : l'adresse du compte créé ci-dessus.
- Cc : je mets une autre adresse pour tester la réception vers une adresse externe.
- Il faut terminer par une ligne contenant un . pour envoyer le mail.
Si vous vérifiez votre logiciel mail, vous devriez obtenir le mail envoyé en Cc. Pour tester le mail envoyé à votre utilisateur, il vous suffit de rentrer les bons paramètres dans votre logiciel de mail préféré (Thunderbird).
pop: mail.nom_domaine.com
smtp: votre FAI
login: user@nom_domaine.com
pass: *****
VI-A-6. Conclusion▲
Voilà, votre MTA (Mail Transfert Agent) est normalement configuré. Si vous ne recevez rien, vérifiez bien tous les paramètres. Il est important d'avoir autorisé la connexion en local lors de l'installation de mysql, par exemple. En cas de doute, ou de souci, allez voir les logs :
# nano /var/log/mail.log
VII. Script▲
VII-A. Installation d'un nouvel hébergement▲
Ce script permet de créer les paramètres nécessaires pour créer un nouveau site. Il configure :
- Apache (virtualhost) ;
- Bind ;
- Vsftpd ;
- Postfix (création du compte mail webmaster) ;
- Copie des fichiers de base dans le répertoire home.
Ce script a besoin, pour être exécuté, de trois paramètres et d'un répertoire :
- nom de l'utilisateur shell créé ;
- mot de passe de cet utilisateur ;
- le nom de domaine correspondant.
Avant d'utiliser le script pour la première fois, il faut commencer par créer l'arborescence de base qui devra exister dans le nouvel hébergement créé. Dans le même répertoire que votre script, créer l'arborescence suivante :
fic_originaux/
fic_originaux/logs/
fic_originaux/public_html/
fic_originaux/public_html/index.html
Vous pouvez évidemment mettre ce que vous voulez dans le dossier fic_originaux/public_html/. Pour ma part, je mets un fichier index.html contenant un message de bienvenue, et un fichier info.php qui contient la commande phpinfo(). Cela permet de vérifier que le PHP est activé et fonctionne correctement.
Ce script est livré en l'état, sans aucune assurance. Il peut être adapté, mais en aucun cas redistribué, sous quelque forme que ce soit. Il n'est certainement pas optimisé, mais il fonctionne avec le reste du tutoriel !
Pour exécuter le script, il faut lui donner les droits d'exécution (X), et le lancer sous cette forme :
./new_site.sh user mdp domaine
# ------------------------------------------------------------------------------------------------------------------------
# Script de création d'hébergement
#
# Auteur: Lange Olivier
# Date: 2006/2007
# Description:
# Script permettant d'ajouter un nouvel hébergement dans le serveur. Il crée tous les fichiers
# nécessaires, et effectue les configurations de base.
# Paramètre: 1° Nom de l'utilisateur Shell
# 2° Mot de passe de l'utilisateur
# 3° Nom de domaine
#-------------------------------------------------------------------------------------------------------------------------
#!/bin/sh
# Récupère le nom d'utilisateur créé
new_user=$1
# Récupère le nom de domaine
nom_domaine=$3
# Récupère le mot de passe souhaité
password=$2
# Définit le mot de passe root de mysql
mdp_mysql_root = XXXXXXXXXXXX
# Récupère la date de création pour générer le fichier Bind
date_creation=`date +%Y%m%d`01
# Récupère l'IP du serveur
mon_ip=`grep $HOSTNAME /etc./hosts |cut -f1`
# Définit le répertoire de base de l'utilisateur
rep=/home/$new_user
# Teste si le répertoire existe, et donc l'utilisateur
if [ -d $rep ]; then
echo "L'utilisateur est déjà géré par ce serveur"
else
if [ -e /etc/apache2/sites-enabled/$nom_domaine ]; then
echo "Le nom de domaine est déjà géré par ce serveur"
else
# Génère les fichiers de base du nouveau site
/usr/sbin/useradd -p $password $new_user
cp -R fic_originaux $rep
chown -R www-data:www-data $rep
chmod -R 755 $rep
# ------------------------------------------------------------------------------------------------------------------------
# Configuration d'apache
#-------------------------------------------------------------------------------------------------------------------------
# Crée le fichier de configuration du répertoire virtuel
echo "
<VirtualHost *>
ServerAdmin postmaster@$nom_domaine
ServerName www.$nom_domaine
ServerAlias $nom_domaine *.$nom_domaine
DocumentRoot /home/$new_user/public_html/
<Directory /home/$new_user/public_html/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
ErrorLog /home/$new_user/logs/error.log
LogLevel warn
CustomLog /home/$new_user/logs/access.log combined
ServerSignature Off
</VirtualHost>
" >> /etc/apache2/sites-available/$nom_domaine
ln -s /etc/apache2/sites-available/$nom_domaine /etc/apache2/sites-enabled/$nom_domaine
# ------------------------------------------------------------------------------------------------------------------------
# Configuration de BIND
#-------------------------------------------------------------------------------------------------------------------------
# Crée le fichier de déclaration de zone BIND
echo "
\$ttl 86400
$nom_domaine. IN SOA $HOSTNAME. webmaster.$nom_domaine. (
$date_creation
21600
3600
604800
86400 )
IN NS $HOSTNAME.
IN NS ns.kimsufi.com.
IN MX 10 mail.$nom_domaine.
IN A $mon_ip
www IN A $mon_ip
mail IN A $mon_ip
smtp IN A $mon_ip
pop IN A $mon_ip
pop3 IN A $mon_ip
imap IN A $mon_ip
sql IN A $mon_ip
mysql IN A $mon_ip
" > /etc./bind/db.$nom_domaine
# Crée la zone BIND
echo "zone \"$nom_domaine\" {
type master;
file \"/etc./bind/db.$nom_domaine\";
};
" >> /etc/bind/zones.conf
# ------------------------------------------------------------------------------------------------------------------------
# Configuration du ftp principal
#-------------------------------------------------------------------------------------------------------------------------
# On ajoute l'utilisateur et son mdp
echo "$new_user
$password" > /etc/vsftpd/login.txt
# On met à jour la base berkeley
db3_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
# On ajoute les paramètres pour notre nouveau site
echo "anon_world_readable_only=NO
local_root=$rep
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES" > /etc/vsftpd/vsftpd_user_conf/$new_user
# ------------------------------------------------------------------------------------------------------------------------
# Installation du compte mail par défaut
#-------------------------------------------------------------------------------------------------------------------------
mysql -u root -e "INSERT INTO domain (domain, actif) VALUES ('$nom_domaine', '1');" -p$mdp_mysql_root postfix
mysql -u root -e "INSERT INTO mailbox (email,password,quota,actif,imap,pop3) VALUES ('webmaster@$nom_domaine',ENCRYPT('$password'),0,1,1,1);" -p$mdp_mysql_root postfix
# ------------------------------------------------------------------------------------------------------------------------
# Redémarre les services
#-------------------------------------------------------------------------------------------------------------------------
/etc/init.d/bind9 restart
/etc/init.d/apache2 restart
/etc/init.d/vsftpd restart
/etc/init.d/postfix restart
echo "L'utilisateur $new_user a bien été enregistré sur le serveur"
echo "Le serveur a été redémarré"
fi
fi
VIII. Remerciements▲
Je tiens tout particulièrement à remercier Fred036 pour son aide, et la mise à disposition de son tutoriel, qui m'a bien aidé, et dont je me suis largement inspiré pour ce tutoriel sur Postfix.