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 adressesvirtual_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