Serveur mail et webmail – part. 3 – postfix admin – Mariadb

C’est un peu lourd de devoir créer un compte unix par utilisateur. Avec postfix admin, nous allons pouvoir gérer les boites et les alias au travers d’un interface web et stocker les comptes dans une base MariaDb

Cet article est très largement inspiré de : Part 3: PostfixAdmin – Create Virtual Mailboxes on Debian 11/10 Mail Server. Il fait suite à : Serveur mail et webmail – part. 2 – postfix – dovecot

Mariadb

root@klopmail:~# apt-get install mariadb-server mariadb-client

Mariadb devrait tourner

root@klopmail:~# systemctl status mariadb

Post configuration de Mariadb :

root@klopmail:~# mysql_secure_installation
...
Enter current password for root (enter for none): <enter>
...
Switch to unix_socket authentication [Y/n] n
...
Change the root password? [Y/n] n
...
Remove anonymous users? [Y/n] <enter>
...
Disallow root login remotely? [Y/n] <enter>
...
Remove test database and access to it? [Y/n] <enter>
...
Reload privilege tables now? [Y/n] <enter>

postfixadmin

Installons php puis postfixadmin à partir des repos de debian.

root@klopmail:~# apt-get install php
root@klopmail:~# apt-get install postfixadmin

Le paquet nous demande de configurer la base à notre place : allons-y, en répondant yes.

Je recopie le mot de passe généré par mon Keepass (mon gestionnaire de mot de passe).

Puis, je confirme le mot de passe.

Chez Gandi, dans la zone dync.fr, j’ajoute un cname de postfixadmin vers klopmail

Le tout semble s’installer dans /usr/share/postfixadmin. Créons un virutal host:

root@klopmail:~# vi /etc/apache2/sites-available/020-postfixadmin.conf

Avec le contenu suivant :

MDomain postfixadmin.dync.fr
<VirtualHost _default_:443>
        ServerName postfixadmin.dync.fr
        DocumentRoot /usr/share/postfixadmin/public
        ErrorLog ${APACHE_LOG_DIR}/postfixadmin-error.log
        CustomLog ${APACHE_LOG_DIR}/postfixadmin-access.log combined
        SSLEngine on
        SSLOpenSSLConfCmd MinProtocol TLSv1.2
        Protocols h2 http/1.1 acme-tls/1
</VirtualHost>

Activons le site et redémarrons apache (2 fois)

root@klopmail:~# a2ensite 020-postfixadmin.conf
root@klopmail:~# apachectl --configtest
root@klopmail:~# apachectl restart
root@klopmail:~# apachectl restart

Créons un fichier config.local.php

root@klopmail:~# vi /etc/postfixadmin/config.local.php

avec

<?php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_port'] = '3306';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'levotre';
$CONF['database_name'] = 'postfixadmin';
$CONF['encrypt'] = 'dovecot:ARGON2I';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5";
if(@file_exists('/usr/bin/doveadm')) { // @ to silence openbase_dir stuff; see https://github.com/postfixadmin/postfixadmin/issues/171
$CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5"; # debian
}

Autorisons apache à générer des hash argon2

root@klopmail:/etc/postfixadmin# usermod -a -G dovecot www-data

Accédons à la page : https://postfixadmin.dync.fr/setup.php et générons un long mot de passe avec notre keepass et cliquons sur generate password hash

Nous récupérons un quelque-chose de la forme : $CONF[‘setup_password’] = ‘$2y$10$cLPLzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’; que nous ajoutons dans le fichier /etc/postfixadmin/config.local.php

root@klopmail:~# vi /etc/postfixadmin/config.local.php 

Rafraichissons la page de setup et identifions-nous avec le mot de passe.

Puis saisissons le mot de passe de setup, une adresse de superadmin dans notre domaine de messagerie et un mot de passe qui lui est propre :

Vous pouvez vous connecter désormais à https://postfixadmin.dync.fr/login.php

Postfix – Mariadb

Plutôt que de remettre les mails entrants à des utilisateurs, nous allons expliquer à postfix de remettre les mails à des utilisateurs déclarés dans la base de données.

root@klopmail:/etc/postfix# apt-get install postfix-mysql
Éditons le fichier de configuration
root@klopmail:~# vi /etc/postfix/main.cf

et ajoutons les lignes suivantes à la fin du fichier

virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
  • virtual_mailbox_domains pointe vers un fichier décrivant comment trouver les domaines dans la base
  • virtual_mailbox_maps pointe vers des fichiers décrivant comment trouver les adresses
  • virtual_alias_maps et comment trouver les alias.

De plus, nous souhaitons (sisi, même si vous ne le savez pas) que dovecot délivre les mails. Nous ajoutons la ligne suivante au fichier

virtual_transport = lmtp:unix:private/dovecot-lmtp

Nous allons créer les fichiers maps.cf

root@klopmail:~# mkdir /etc/postfix/sql

Créons le premier fichier mysql_virtual_domains_maps.cf

root@klopmail:~# vi /etc/postfix/sql/mysql_virtual_domains_maps.cf

Avec le contenu :

user = postfixadmin
password = levotre
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
#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'
#expansion_limit = 100
root@klopmail:~# vi /etc/postfix/sql/mysql_virtual_mailbox_maps.cf

Avec le contenu

user = postfixadmin
password = levotre
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100
root@klopmail:~# vi /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

Avec le contenu

user = postfixadmin
password = levotre
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain
) AND mailbox.active = 1 AND alias_domain.active='1'
root@klopmail:~# vi /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf

Avec le contenu

user = postfixadmin
password = levotre
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
root@klopmail:~# vi /etc/postfix/sql/mysql_virtual_alias_maps.cf

Avec le contenu

user = postfixadmin
password = levotre
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#expansion_limit = 100
root@klopmail:~# vi /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

Avec le contenu

# handles catch-all settings of target-domain
user = postfixadmin
password = levotre
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

Changeons les droits pour protéger le mot de passe :

root@klopmail:~# chmod 640 /etc/postfix/sql/*
root@klopmail:~# chgrp postfix /etc/postfix/sql/*

Le paramètre mydestination contient la liste des domaines pour lesquels les emails sont délivrés à des comptes locaux. Nous allons supprimer ceux qui concernent les boites « MariaDb » ou « Virtuelles ».

root@klopmail:~# postconf mydestination
mydestination = $myhostname, dync.fr, klopmail.dync.fr, localhost.dync.fr, localhost
root@klopmail:~# postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost"
root@klopmail:~# postconf mydestination
mydestination = $myhostname, localhost.$mydomain, localhost

Éditons à nouveau, le fichier de configuration de postfix

root@klopmail:~# vi /etc/postfix/main.cf

et ajoutons les lignes suivantes pour indiquer la localisation des fichiers de courrier et quel compte Unix utiliser.

virtual_mailbox_base = /var/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000

Créons compte et répertoire

root@klopmail:~# adduser vmail --system --group --uid 2000 --disabled-login --no-create-home
Adding system user `vmail' (UID 2000) ...
Adding new group `vmail' (GID 2000) ...
Adding new user `vmail' (UID 2000) with group `vmail' ...
useradd warning: vmail's uid 2000 is greater than SYS_UID_MAX 999
Not creating `/nonexistent'.
root@klopmail:~# mkdir /var/vmail/
root@klopmail:~# chown vmail:vmail /var/vmail/ -R
root@klopmail:~# systemctl restart postfix

Dovecot – MariaDB

Installons le module

root@klopmail:~# apt-get install dovecot-mysql

Éditons le fichier 10-mail.conf et sous la ligne mail_localtion, précisons où sont stocker les boites viruels par :

mail_home = /var/vmail/%d/%n/

Éditons 10-auth.conf

root@klopmail:~# vi /etc/dovecot/conf.d/10-auth.conf

Le nom de l’utilisateur devient son adresse complète au lieu de la partie gauche et on force en minuscule. auth_username_format passe de %n à %Lu.

Si l’utilisateur ne saisi pas de domaine, nous en ajoutons un par défaut. Décommentons la ligne auth_default_realm et mettons notre nom de domaine.

Utilisons la base de données pour l’authentification utilisateur et interdisons l’authentification avec un compte linux. Décommentons la ligne !include auth-sql.conf.ext et commentons !include auth-system.conf.ext.

Sauvegardons ce fichier et éditons dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=levotre
default_pass_scheme = ARGON2I
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT maildir, 2000 AS uid, 2000 AS gid FROM mailbox WHERE username = '%u' AND active='1'
iterate_query = SELECT username AS user FROM mailbox

En cas de soucis d’authentification, on peut activer un mode debug en ajoutant les deux lignes suivantes au fichier

auth_debug = yes
auth_debug_passwords = yes

Sauvegardons ce fichier et redémarrons dovecot

root@klopmail:~# systemctl restart dovecot

A partir de là nous avons un serveur fonctionnel. Faisons un test.

Ajoutons des domaines et des utilisateurs

Sur https://postfixadmin.dync.fr, après nous être authentifiés, dans la liste déroulante ‘liste des domaines’ sélectionnons, ‘nouveau domaine’. Et cliquons sur ‘nouveau domaine’.

Puis dans ‘liste des virtuels’, choisissons ‘ajouter un compte couriel’

Passons à la configuration de SPF, DKIM, DMARC : Serveur mail et webmail – part. 4 – SPF, DKIM, DMARC

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *