Postfix Admin

PostfixAdmin est une interface web en php permettant de créer et gérer des domaines de messagerie quand postfix est configuré pour les domaines et utilisateurs virtuels stockés au sein d’une base mysql.


[toc title="Table des Matières" hint="Table des Matières" class="toc-right" style="inline CSS style"]
[toc auto=off]

Installation des paquets de base

On installe les paquets debian dont nous allons avoir besoin c’est à dire au minimun :

  • Le serveur MySQL 3.23 ou supérieur.
  • Le serveur de messagerie postfix 2.0 ou supèrieur.
  • Le serveur web apache 1.3.27 ou supérieur.
  • Le module php pour apache 4.1 ou supérieur
  • Le serveur pop3
  • phpmyadmin (optionnel)
apt-get install mysql-server postfix apache2 libapache2-mod-php5 courier-authlib-mysql phpmyadmin

On accepte les dépendance que apt calcule et on installe le tout. Pour des soucis de sécurité on fixe un mot de passe de connection à la base MySQL pour l’utilisateur local root.

mysqladmin -u root password mysecretpassword

Patch VDA pour postfix afin de gérer les quotas sur les boites e-mail (optionnel)

Si l’on souhaite gérer les quotas sur les boites e-mail, car postfix en natif ne prend pas en compte cette fonctionnalité, il nous faut la prise en compte du patch VDA pour postfix.

Pour cela il faut récupérer les sources du paquet Debian Postfix, lui appliquer le patch VDA, créer un nouveau paquet .deb pour Postfix et l’installer en lieu et place de celui actuellement installé.

Pour construire ce nouveau paquet .deb il va falloir installer quelque paquets Debian supplémentaires :

apt-get install build-essential dpkg-dev binutils make dpatch debhelper lsb-release libdb4.3-dev
libgdbm-dev libldap2-dev libpcre3-dev libmysqlclient15-dev libssl-dev libsasl2-dev libpq-dev
libcdb-dev

On a maintenant les paquets nécessaire pour construire notre paquet postfix avec patch VDA.

On vérifie que l’on a bien un repository source dans le fichier /etc/apt/sources.list.

cat /etc/apt/sources.list

deb http://debian.ens-cachan.fr/ftp/debian/ etch main
deb-src http://debian.ens-cachan.fr/ftp/debian/ etch main

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib

C’est ici le cas (ligne en gras), on peux donc commencer à récupérer les sources de postfix et leur appliquer le patch VDA pour construire notre nouveau paquet postfix debian.

cd /usr/src
apt-get source postfix
wget http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz
gunzip postfix-2.3.8-vda.patch.gz
cd postfix-2.3.8
patch –p1 < ../postfix-2.3.8-vda.patch
dpkg-buildpackage

Attendre la fin de la compilation, puis installer les paquets .deb suivants :

cd ..
dpkg –i postfix_2.3.8-2_i386.deb
dpkg -i postfix-doc_2.3.8-2_all.deb
dpkg –i postfix-mysql-2.3.8-1_i386.deb

Vérifier que le support MySQL est bien pris en compte par Postfix

posfconf -m
btree
cidr
environ
hash
mysql
nis
proxy
regexp
sdbm
static
tcp
unix

La ligne mysql doit apparaître.

Le nouveau paquet Postfix installé prend donc maintenant en compte le support MySQL et les quotas sur les boites e-mail.

Installation et configuration de PostfixAdmin

On récupère les sources de PostfixAdmin

cd /usr/local/share
wget http://mesh.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-2.1.0.tgz
tar -xzvf postfixadmin-2.1.0.tgz
rm postfixadmin-2.1.0.tgz

Comme indiqué dans le INSTALL.TXT on change les permissions des fichiers dans les répertoires suivants :

 cd /usr/local/share/postfixadmin-2.1.0
 chmod 640 *.php *.css
 cd /usr/local/share/postfixadmin-2.1.0/admin/
 chmod 640 *.php .ht*
 cd /usr/local/share/postfixadmin-2.1.0/images/
 chmod 640 *.png
 cd /usr/local/share/postfixadmin-2.1.0/languages/
 chmod 640 *.lang
 cd /usr/local/share/postfixadmin-2.1.0/templates/
 chmod 640 *.tpl
 cd /usr/local/share/postfixadmin-2.1.0/users/
 chmod 640 *.php

On change le proprietaire et le groupe d’appartenance pour le répertoire et tous ses sous-répertoires.

chown -R www-data:www-data /usr/local/share/postfixadmin-2.1.0

Puis on crée un lien symbolique à la racine de notre serveur apache2

ln -s /usr/local/share/postfixadmin-2.1.0 /var/www/postfixadmin

Par soucis de sécurité et afin de ne pas laisser les mots de passe par défaut, on édite le fichier /usr/local/share/postfixadmin-2.1.0/DATABASE_MYSQL.TXT et l’on modifie les lignes suivantes :

INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('postfix'));
INSERT INTO user (Host, User, Password) VALUES 'localhost','postfixadmin',password('postfixadmin'));

par

INSERT INTO user (Host, User, Password) VALUES localhost','postfix' \
            ,password('mysecretpassword'));
INSERT INTO user (Host, User, Password) VALUES localhost','postfixadmin' \
            ,password('mysecretpassword'));

On peux maintenant créer les tables SQL de PostfixAdmin

mysql -u root -p < DATABASE_MYSQL.TXT

On renomme le fichier config.inc.php.sample en config.inc.php dans le répertoire /usr/local/share/postfixadmin-2.1.0

cp -p config.inc.php.sample config.inc.php

On modifie les sections suivantes pour notre configuration.

// Postfix Admin Path
// Set the location to your Postfix Admin installation here.
$CONF['postfix_admin_url'] = 'http://x.x.x.x/postfixadmin/admin';
$CONF['postfix_admin_path'] = '/var/www/postfixadmin/admin';

// Database Config
// mysql = MySQL 3.23 and 4.0
// mysqli = MySQL 4.1
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'mysecretpassword';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = ;

// Site Admin
// Define the Site Admins email address below.
// This will be used to send emails from to create mailboxes.
$CONF['admin_email'] = 'admin@domain.tld';

// Default Aliases
// The default aliases that need to be created for all domains.
$CONF['default_aliases'] = array (
       'abuse' => 'abuse@domain.tld'',
       'postmaster' => 'admin@domain.tld.local'',
  );

// Mailboxes
// If you want to store the mailboxes per domain set this to 'YES'.
// Example: /usr/local/virtual/domain.tld/username@domain.tld
$CONF['domain_path'] = 'YES';
// If you don't want to have the domain in your mailbox set this to 'NO'.
// Example: /usr/local/virtual/domain.tld/username
$CONF['domain_in_mailbox'] = 'NO';

// Quota
// When you want to enforce quota for your mailbox users set this to 'YES'.
$CONF['quota'] = 'YES';
// You can either use '1024000' or '1048576'
$CONF['quota_multiplier'] = '1024000';

Ensuite afin de sécuriser l’ensemble du répertoire admin et ses fichiers php on modifie le fichier .htaccess dans /usr/local/share/postfixadmin-2.1.0/admin/.
< pre>AuthUserFile /var/www/postfixadmin/admin/.htpasswd
AuthGroupFile /dev/null
AuthName « Postfix Admin »
AuthType Basic

<limit GET POST>
require valid-user
</limit>

On défini le mot de passe grace a la commande suivante :

htpasswd -b /var/www/postfixadmin/admin/.htpasswd admin mysecretpassword

Attention il se peut que malgrés cela la demande de nom d’utilisateur et mot de passe lors de l’accès aux pages web dans le répertoire admin ne fonctionne pas. Cela est dû à la présence des lignes suivantes dans le fichier /etc/apache2/sites-enabled/000-default :

<Directory />
  Options FollowSymLinks
  AllowOverride None
</Directory>
<Directory /var/www/>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride None
  Order allow,deny
  allow from all
  # This directive allows us to have apache2's default start page
  # in /apache2-default/, but still have / go to the right place
  RedirectMatch ^/$ /apache2-default/
 </Directory>

Dans ce cas ajouter les lignes suivantes à ce fichier :

<Directory /var/www/postfixadmin/admin>
  AuthUserFile /var/www/postfixadmin/admin/.htpasswd
  AuthGroupFile /dev/null
  AuthName "Postfix Admin"
  AuthType Basic

<limit GET POST>
  require valid-user
</limit>
  Allowoverride All
</Directory>

Redémarré le serveur Apache et re testé l’accès au pages web du répertoire admin.

/etc/init.d/apache2 restart

Renommez ou supprimez le fichier /var/www/postfixadmin/setup.php afin que personne n’y ai plus accès.

mv /var/www/postfixadmin/setup.php /var/www/postfixadmin/setup.php.bak

Renommez ou supprimez le fichier /var/www/postfixadmin/motd-admin.txt afin de ne plus avoir le motd en plein milieu de la page web d’administration

mv /var/www/postfixadmin/motd-admin.txt /var/www/postfixadmin/motd-admin.txt.bak

Configuration de postfix

On Crée un utilisateur et un groupe appelé vmail avec un UID/GDI fixé à 5000 ne pouvant pas se logger sur le système.

groupadd –g 5000 vmail
useradd –g vmail –u 5000 vmail –d /home/vmail –s /bin/false

On crée le répertoire où seront stocké les mails pour les utilisateurs et domaines virtuels.

mkdir -p /var/mail/vmail
chown -R 5000:5000 /var/mail/vmail
chmod -R 770 /var/mail/vmail

On modifie ensuite la configuration de postfix en lui ajoutant les lignes suivantes (lignes en gras) :

#Ajouter par Debian
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)

biff = no

append_dot_mydomain = no

#Nom FQDN du serveur postfix
myhostname = mail.alpha.tld

myorigin = alpha.tld

#Relais de messagerie a utiliser dans le cas ou le client n'as pas une vraie adresse ip fixe
# sinon on laisse vide.
relayhost = 

#Specifie sur quelles interfaces postfix écoute
inet_interfaces = all

#Reseau ip de confiance, relay des mail autorisé pour les clients faisant parti de ces reseaux.
mynetworks = 127.0.0.0/8 192.168.0.0/24

#Les quotas sur les mailbox sont géres via patch VDA et interrogation base MySQL
mailbox_size_limit = 0

#Pas de fichier d’alias local ceux-ci sont stockes dans la base MySQL
alias_maps =

#Limite max pour un e-mail, attention cette valeur doit etre inferieur au quota fixe sur
#les boite e-mail.
message_size_limit = 5242880

#On utilise l’agent de transport virtual du master.cf
virtual_transport = virtual

#Fichier de conf pour la recherche des alias virtuels dans la bdd MySQL
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual_alias.cf

#Fichier de conf pour la recherche des domain virtuels dans la bdd MySQL
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/mysql-virtual_domains.cf

#Fichier de conf pour la recherche des boites e-mail virtuels dans la bdd MySQL
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual_mailboxes.cf

#Fichier de conf pour la recherche des domaines MX que l'on backup dans la bdd MySQL.
relay_domains = proxy:mysql:/etc/postfix/mysql/mysql-virtual_domains_relay.cf

#Fichier de conf pour la recherche des quota des boites e-mail dans la bdd MySQL
virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql/mysql-virtual_limit_maps.cf

#Racine a partir de laquelle seront stocke les boites e-mail
virtual_mailbox_base = /var/vmail

#Utilisateur a qui appartient les repertoires ou seront deposes les e-mails par l’agent
#de transport de postfix virtuel
virtual_uid_maps = static:5000

#Groupe a qui appartient les repertoires ou seront deposes les e-mails par l’agent virtuel de
#transport de postfix
virtual_gid_maps = static:5000

#On autorise la creation des boites e-mail par postfix si elles n’ont pas ete crees sous
var/mail/vhost virtual_create_maildirsize = yes

#Utilisation des formats de fichier compatibles IMAP.
virtual_mailbox_extended = yes

#Ajout virtual-mailbox_limit-maps a proxy_read_maps pour autorise l’utilisation de proxymap
#qui ameliore les temps de connection a la base MySQL et résoud les pb de chroot.
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

#Pas de gestion de softquota le seuil du quota est inscrit en dur dans la bdd MYSQL.
virtual_mailbox_client_limit_override = no

#Envoie notification a l’expéditeur que le quota du destinataire est atteint
virtual_overquota_bounce = yes

#Message retourne a l’utilisateur si la boite email du destinataire a atteint son quota maximum
virtual_mailbox_limit_message = "The user your are trying to reach is over quota please try
later"

On crée les fichiers de configuration nécessaire à la communication entre Postfix et MySQL et on les renseigne.

mkdir -p /etc/postfix/mysql
touch /etc/postfix/mysql/mysql-virtual_alias.cf
touch /etc/postfix/mysql/mysql-virtual_domains.cf
touch /etc/postfix/mysql/mysql-virtual_mailboxes.cf
touch /etc/postfix/mysql/mysql-virtual_domains_relay.cf
touch /etc/postfix/mysql/mysql-virtual_limit_maps.cf

mysql-virtual_alias.cf

user = postfix
password = mysecretpassword
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

mysql-virtual_domains.cf

user = postfix
password = mysecretpassword
hosts = localhost
dbname = postfix
#query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

mysql-virtual_domains_relay.cf

user = postfix
password = mysecretpassword
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'

mysql-virtual_limit_maps.cf

user = postfix
password = mysecretpassword
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'

mysql-virtual_mailboxes.cf

user = postfix
password = mysecretpassword
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

une fois les modification effectué on peux redemarrer les serveur postfix

Testez Postfix et PostfixAdmin

Se connecté a l’interface d’administration de PostfixAdmin à l’adresse http://x.x.x.x/postfixadmin/admin et créer deux domaines alpha.tld et beta.tld, créer également deux utilsateurs dans chaque domaines user1 et user2.

Vérifier dans le répertoire /var/mail/vmail que les répertoires pour les domaines ont bien été crées ai nsi que les répertoires des utilisateurs sous chaque domaine.

Dans chaque répertoires utilisateur doit figurer un mail de bienvenue qui a été envoyé lors de la création de la mailbox par postfixadmin afin de crée la structure maildir.

Leave a Reply

You must be logged in to post a comment.