Installer un serveur dédié sous Ubuntu Serveur

Date de publication : 09 décembre 2011.


VIII. Postfix, MySQL et la gestion des mails


VIII. Postfix, MySQL et la gestion des mails

Postfix est un des serveurs mails les plus répandu. Il va nous permettre d'envoyer des mails de manière automatisé via nos sites web mais également gérer et stocker les mails reçus. Vous n'aurez plus qu'à utiliser votre client mail favori pour les consulter.

Tout d'abord, l'installation :

sudo apt-get install courier-authdaemon courier-authlib-mysql courier-pop \
courier-pop-ssl courier-imap courier-imap-ssl postfix postfix-mysql \
postfix-doc mysql-client mysql-server postfix-tls libsasl2-2 libsasl2-modules \
libsasl2-modules-sql sasl2-bin libpam-mysql openssl
info Si vous n'obtenez pas d'interface d'installation, lancez alors la commande suivante pour résoudre le problème : sudo dpkg-reconfigure postfix
Veuillez choisir 'Site Internet'
Votre nom de domaine de plus haut niveau (correspondant au PTR)
L'adresse mail principale du serveur
Laissez vide
Non
Profitons en pour créer nos utilisateur et groupe postfix, ceci permettra une meilleure sécurisation du serveur :

sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
Comme nous avons choisi un serveur mail géré par base de données, nous allons préparer le terrain via phpmyadmin.

Nous créons notre utilisateur postfix ainsi qu'une base qui lui sera attribuée.
Ajoutons également les tables suivantes. Elle nous permettront de définir nos comptes mails, domaines et redirections. Pour cela, lancez les une par une via l'onglet SQL de la base postfix.

info Certains champs sont inutiles ou facultatifs pour ce type d'installation. Cependant, si vous souhaitez un jour apporter de nouvelles fonctionnalités pour votre serveur mail, les champs nécessaires seront déjà présents. De plus, nous pourrons ainsi préciser d'éventuel filtrage supplémentaire en fonction de nos envies.

CREATE TABLE `alias` (
`address` varchar(255) NOT NULL default '',
`goto` text NOT NULL,
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (address)
) TYPE=MyISAM COMMENT='Postfix - Aliases';

CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`maxquota` int(10) NOT NULL default '0',
`transport` varchar(255) default NULL,
`backupmx` tinyint(1) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (domain)
) TYPE=MyISAM COMMENT='Postfix - Domaines';

CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY  (username)
) TYPE=MyISAM COMMENT='Postfix - Mailboxes';
Notre base de données étant en place, nous allons maintenant indiquer à postfix comment y trouver les informations nécessaires au bon fonctionnement.

N'oubliez pas de modifier la propriété password avec le mot de passe de l'utilisateur postfix de phpmyadmin ou de copier tel quel et d'utiliser l'astuce suivante.

idea Astuce :

La commande suivante vous permettra de remplacer la chaine "motdepasse" par VOTREMOTDEPASSE de l'ensemble des fichiers /etc/postfix/mysql_*.cf

sed -i 's/motdepasse/VOTREMOTDEPASSE/' /etc/postfix/mysql_*.cf



sudo nano /etc/postfix/mysql_virtual_alias_maps.cf 
				
user = postfix
password = motdepasse
hosts = 127.0.0.1
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

sudo nano /etc/postfix/mysql_virtual_domains_maps.cf 
				
user = postfix
password = motdepasse
hosts = 127.0.0.1
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

sudo nano /etc/postfix/mysql_virtual_mailbox.cf
				
user = postfix
password = motdepasse
hosts = 127.0.0.1
dbname = postfix
query = SELECT username FROM mailbox WHERE username='%s' AND active = 1

sudo nano /etc/postfix/mysql_virtual_mailbox_maps.cf 
				
user = postfix
password = motdepasse
hosts = 127.0.0.1
dbname = postfix
query = SELECT CONCAT(SUBSTRING_INDEX(username,'@',-1),'/',SUBSTRING_INDEX(username,'@',1),'/') FROM mailbox WHERE username='%s' AND active = 1

sudo nano /etc/postfix/mysql_virtual_mailbox_limit_maps.cf 
				
user = postfix
password = motdepasse
hosts = 127.0.0.1
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'

sudo nano /etc/postfix/mysql_relay_domains_maps.cf 
				
user = postfix
password = motdepasse
hosts = 127.0.0.1
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
N'oubliez pas la modification de votre mot de passe si vous avez opter pour un remplacement via sed (sinon passez à l'étape suivante) :

sed -i 's/motdepasse/VOTREMOTDEPASSE/' /etc/postfix/mysql_*.cf
Comme vous avez pu le constater, nos fichiers de configuration contiennent notre mot de passe de base de donnée en clair. Nous allons donc restreindre l'accès à ces fichiers :

sudo chmod o= /etc/postfix/mysql_*.cf
sudo chgrp postfix /etc/postfix/mysql_*.cf
Afin de permettre à postfix d'utiliser nos fichiers précédemment remplis, nous allons établir les configurations suivantes en ligne de commande.
N'oubliez pas de changer 'monsite.fr' par votre véritable nom de domaine.

sudo postconf -e 'myhostname = monsite.fr'

postconf -e 'mydestination = '
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'message_size_limit = 30720000'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/mysql_virtual_mailbox.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
Quelques succintes explications :

  • message_size_limit : correspond à la taille maximum d'un mail et est exprimé en octet (soit 30Mo dans le cas présent)
  • virtual_* : indique à postfix ou trouver les données, le préfixe proxy: permet de garder les résultats en cache et minimise ainsi les accès en base de données
  • broken_sasl_auth_clients : permet la connexion à partir de client tel que Outlook Express
  • smtpd_tls_* : spécifie l'emplacement des certificats SSL destinés au smtp (envoie de mail)
Afin de sécuriser les accès à notre serveur mail, nous allons configurer TLS et l'authentification SASL.

info Nous utilisons ici un certificat SSL auto-signé. Cependant, si vous disposez d'un certificat SSL signé par une autorité de certification, passez la génération du certificat et veuillez copier vos fichiers de certificats aux emplacement /etc/postfix/smtpd.cert et /etc/postfix/smtpd.key
Nous choisirons ici un certificat d'une validité de 10ans, libre à vous de choisir une période différente si vous le souhaitez :

cd /etc/postfix
sudo openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509
idea Si vous ne savez pas quoi répondre aux questions posés, vous obtiendrez de l'aide dans la partie Certificat SSL auto-signé de ce tutoriel.
Bien entendu, nous sécurisons note fichier key :

sudo chmod o= /etc/postfix/smtpd.key
L'étape suivante consiste à créer le répertoire nécessaire à l'utilisation de l'authentification SASL et de modifier la configuration de cette dernière.

sudo mkdir -p /var/spool/postfix/var/run/saslauthd
Remplaçons le contenu du fichier saslauthd par ce qui suit :

sudo nano /etc/default/saslauthd
				
#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#

# Should saslauthd run automatically on startup? (default: no)
START=yes

# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"

# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"

# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam -- use PAM
# rimap -- use a remote IMAP server
# shadow -- use the local shadow password file
# sasldb -- use the local sasldb database file
# ldap -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"

# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""

# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5

# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# WARNING: DO NOT SPECIFY THE -d OPTION.
# The -d option will cause saslauthd to run in the foreground instead of as
# a daemon. This will PREVENT YOUR SYSTEM FROM BOOTING PROPERLY. If you wish
# to run saslauthd in debug mode, please run it by hand to be safe.
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page and the output of 'saslauthd -h' for general
# information about these options.
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
Créez et modifiez également les fichiers suivant (n'oubliez pas de modifiez 'motdepasse' par le mot de passe correspondant au compte postfix de MySQL) :

sudo nano /etc/pam.d/smtp
	
auth    required   pam_mysql.so user=postfix passwd=motdepasse host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=postfix passwd=motdepasse host=127.0.0.1 db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1

sudo nano /etc/postfix/sasl/smtpd.conf
	
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: motdepasse
sql_database: postfix
sql_select: select password from mailbox where username = '%u'
Il ne nous reste plus qu'à changer les permissions, à ajouter l'utilisateur postfix au groupe sasl et à redémarrer les services postfix et saslauthd afin que les modification soient prises en compte :
	
sudo chmod o= /etc/pam.d/smtp
sudo chmod o= /etc/postfix/sasl/smtpd.conf
sudo adduser postfix sasl
sudo /etc/init.d/postfix restart
sudo /etc/init.d/saslauthd restart
Configurons maintenant Courier afin de gérer les accès IMAP et POP3 de notre serveur mail. Pour cela, nous allons informer Courier qu'il doit utiliser notre base de données mysql.

Modifions tout d'abord le module à charger.

sudo nano /etc/courier/authdaemonrc
	
#authmodulelist="authpam"
authmodulelist="authmysql"
Nous gardons une sauvegarde du fichier suivant avant de lui indiquer les sources de données MySQL. N'oubliez pas de modifier 'motdepasse'.

sudo cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_bak;sudo sh -c "cat /dev/null > /etc/courier/authmysqlrc"
sudo nano /etc/courier/authmysqlrc
	
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD motdepasse
MYSQL_PORT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD "/home/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(username,'@',-1),'/',SUBSTRING_INDEX(username,'@',1),'/')
Profitons en pour sécuriser les accès POP3 et IMAP.
Pour cela, il nous est nécessaire de supprimer les fichiers .pem correspondant. Nous disposerons de fichiers de configuration ainsi que de scripts pour les régénérer. Bien entendu, si vous avez opté pour un certificat SSL signé par une autorité de certfication, vous pouvez placez vos fichiers .pem aux emplacement /etc/courier/imapd.pem et /etc/courier/pop3d.pem.

sudo rm -f /etc/courier/imapd.pem
sudo rm -f /etc/courier/pop3d.pem
Modifions les fichiers suivants de manière identique. Veillez à bien remplir les champs CN (Common Name) et emailAddress comme expliqué précédemment.

sudo nano /etc/courier/imapd.cnf
sudo nano /etc/courier/pop3d.cnf
Regénérons nos certificats :

sudo mkimapdcert
sudo mkpop3dcert
Et redémarrons les services correspondant afin que les modifications soient prises en compte :

sudo /etc/init.d/courier-authdaemon restart
sudo /etc/init.d/courier-imap restart
sudo /etc/init.d/courier-imap-ssl restart
sudo /etc/init.d/courier-pop restart
sudo /etc/init.d/courier-pop-ssl restart
Définissons notre fichier d'alias pour les utilisateurs root et postmaster afin qu'il ressemble à ceci :

sudo nano /etc/aliases

postmaster:    root
root:   postmaster@monsite.fr
Et nous finissons par valider le fichier d'alias et par redémarrer le service postfix

sudo newaliases
sudo /etc/init.d/postfix restart
Il ne nous reste plus qu'à stocker dans la base de données postfix les informations relatives aux mails que nous souhaitons créer et gérer. Etudions en détail les possibilités qui s'offrent à nous.

La table Domain :
Elle détermine l'ensemble des domaines gérer par postfix et se remplit comme suit.

INSERT INTO domain (domain,description) VALUES ('monsite.fr','Mon Site');

La table Mailbox :
Elle définit l'ensemble des paramètres d'un compte mail.

INSERT INTO mailbox (username,password) VALUES ('monadmin@monsite.fr',ENCRYPT('Mon mot de passe'));
  • username : correspond à l'adresse mail à créer.
  • password : définit le mot de passe. La fonction MySQL encrypt nous permet de le stocker de manière chiffré.

La table Alias :
Cette table a une importance stratégique dans la gestion de vos mails. En effet, elle nous permet bon nombre d'options concernant les redirections de mails.

INSERT INTO alias (address,goto) VALUES ('utilisateur1@monsite.fr', 'monadmin@monsite.fr');
Comme vous pouvez vous en douter, address correspond à l'adresse mail utilisable et goto l'adresse mail de destination. Mais plus précisément, cela nous permet d'avoir les configurations suivantes :

Redirection de mails simple : les mails envoyés sur address seront redirigés vers goto. ex : utilisateur1@monsite.fr->monadmin@monsite.fr ou utilisateur1@monsite.fr->monadmin@monsite.fr,monadmin@monautresite.fr
Redirection de mails indéfinis dit CatchAll : les mails d'un domaine ne trouvant pas leurs destinations seront reroutés. ex : @monautresite.fr->postmaster@monsite.fr
Redirection de domaine : on redirige tous les mails d'un domaine sur un autre. ex : @monautresite.fr->monsite.fr

info Pour chaque boite mail créée, il est nécessaire d'envoyer dessus un mail de bienvenue afin de créer l'arborescence des répertoires correspondant.
Sans cela, il sera probablement impossible de vous connecter à ce compte.
 

Valid XHTML 1.0 TransitionalValid CSS!

Copyright © 2011 Benjamin GAGNEUX. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
 
 
 
Partenaires

PlanetHoster
Ikoula