Déployer un serveur mail sous Debian avec Postfix et Dovecot

Prérequis: Un serveur LAMP fonctionnel

Tuto original: ICI

On commence par une petite mise à jour du systeme:

sudo apt-get update && sudo apt-get upgrade
  • Installez des dependances PHP:
ATTENTION:
Notez bien votre version de PHP (ex 7.4 ou 8.0) et remplacez $PHP.VERSION
sudo apt-get install php$PHPVersion-{mysql,mbstring,imap,xml,curl}
sudo service apache2 restart
  • Installation de mailutils et Postfix:
sudo apt-get install tree mailutils postfix postfix-mysql

Pendant l’installation, choisissez le mode Site Internet :

ATTENTION:
Entrez la valeur mail.$NomDeDomaine

Continuons avec l’installation de Dovecot et le groupe d’utilisateur vmail qui va gérer les e-mails dans le dossier /var/vmail:

sudo apt-get install dovecot-{mysql,pop3d,imapd,managesieved}
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/vmail -m
  • Installation de Postfixadmin:

Postfixadmin l’interface graphique de Postfix qui va gérer vos comptes:

ATTENTION:
Pensez à bien remplacer les variables $USERNAME & $PASSWORD
sudo mariadb -u $USERNAME -p$PASSWORD
CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY '$PASSWORD';
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY '$PASSWORD';
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
GRANT SELECT ON `postfix`.* TO 'mailuser'@'localhost';
FLUSH PRIVILEGES;
QUIT ;

On peut maintenant telecharger Postfixadmin en prenant soin de bien vérifier la dernière version disponible sur : Sourceforge

ATTENTION:
Pensez à bien remplacer la variable $PostfixadminVersion (ex: 3.3.8)
cd /var/www/html
sudo wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-$PostfixadminVersion.tar.gz
sudo tar -zxvf postfixadmin.tgz
sudo rm postfixadmin.tgz
sudo mv postfixadmin-$PostfixadminVersion postfixadmin
cd postfixadmin
sudo mkdir templates_c
sudo nano config.local.php

Et collez la configuration suivante:

ATTENTION:
Pensez à bien remplacer la variable $PASSWORD
<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_name'] = 'postfix';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = '$PASSWORD';

$CONF['configured'] = true;
?>

Rétablissez les droits du dossier:

sudo chown -R www-data:www-data /var/www/html/postfixadmin

Configurons maintenant Apache de façon à lui permettre d’afficher l’interface Postfixadmin à l’adresse: http://$NomDeDomaine/postfixadmin

cd /etc/apache2/sites-enabled
ls
ATTENTION:
Notez le nom de votre fichier .conf et remplacer $Apache.CONF
sudo nano $Apache.conf

Ajouter maintenant votre Alias sous la première section Directory:

       Alias /postfixadmin /var/www/html/postfixadmin/public
            <Directory /var/www/html/postfixadmin/public>
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>

Et on redémarre Apache:

sudo service apache2 restart

Rendez-vous maintenant sur: http://$NomDeDomaine/postfixadmin/setup.php pour la configuration.

ATTENTION:
Avant de continuer, vérifier bien que tous les voyants sont au vert. Si ce n’est pas le cas veuillez installer les dépendances manquantes.

Au moment de générer le mot de passe vous allez avoir un retour crypté, copiez toute la ligne, et coller la dans config.local.php:

cd /var/www/html/postfixadmin
sudo nano config.local.php

Vous pouvez désormais continuer la configuration de vos comptes e-mails:

Ajoutez votre $NomDeDomaine:

Ajoutez votre nouveau compte e-mail:

Configuration de Postfix:

sudo nano /etc/postfix/mysql-virtual-mailbox-domains.cf

Et collez:

ATTENTION: Pensez à remplacer $PASSWORD.
	user = mailuser
	password = $PASSWORD
	hosts = 127.0.0.1
	dbname = postfix
	query = SELECT domain FROM domain where domain='%s'
sudo nano /etc/postfix/mysql-virtual-mailbox-maps.cf

Et collez:

ATTENTION: Pensez à remplacer $PASSWORD.
	user = mailuser
	password = $PASSWORD
	hosts = 127.0.0.1
	dbname = postfix
	query = SELECT username FROM mailbox where username='%s'
sudo nano /etc/postfix/mysql-virtual-alias-maps.cf

Et collez:

user = mailuser
password = $PASSWORD
hosts = 127.0.0.1
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s'

Activez la configuration:

ATTENTION: Pensez à remplacer $NomDeDomaine.
sudo postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
sudo postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
sudo postconf -e virtual_mailbox_maps=mysql-virtual-alias-maps.cf
sudo postmap -q $NomDeDomaine mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Vous devriez avoir en retour la valeur: $NomDeDomaine

Si ce n’est pas le cas, reprenez les étapes prétendantes il y a un problème.

ATTENTION: Pensez à remplacer $USERNAME et $NomDeDomaine.
sudo postmap -q $USERNAME@$NomDeDomaine mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Vous devriez avoir en retour la valeur: $USERNAME@$NomDeDomaine

sudo postmap -q $VotreAlias@$NomDeDomaine mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Vous devriez avoir en retour la valeur: $USERNAME@$NomDeDomaine

Si ce n’est pas le cas, reprenez les étapes prétendantes il y a un problème.

Configuration de Dovecot:

cd /etc/dovecot/conf.d/
sudo nano 10-auth.conf

Remplacer “auth_mechanisms = plain” par “auth_mechanisms = plain login

Ajouter “#” devant “!include auth-system.conf.ext

Enlever “#” devant “!include auth-sql.conf.ext

sudo nano auth-sql.conf.ext

Remplacez le bloc userdb par:

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
sudo nano 10-mail.conf

Remplacez la ligne mail_location par:

mail_location = maildir:/var/vmail/%d/%n/Maildir
sudo nano 10-master.conf

Dans le bloc de configuration service auth , cherchez la partie Postfix smtp-auth et y ajouter les lignes suivantes :

unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
}
cd /etc/dovecot
sudo nano /etc/dovecot/dovecot-sql.conf.ext

Ajoutez à la fin:

ATTENTION: Pensez à bien remplacer la variable $PASSWORD
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=mailuser password=$PASSWORD
password_query = SELECT username,domain,password FROM mailbox WHERE username='%u';

On ajoute les droits et on redémarre Dovecot:

sudo chgrp vmail /etc/dovecot/dovecot.conf
sudo chmod g+r /etc/dovecot/dovecot.conf
sudo service dovecot restart

On modifie la configuration de Postfix:

sudo nano /etc/postfix/master.cf
ATTENTION:
C’est la partie qui risque de générer le plus d’erreurs, on ajoute à la fin du fichhier:
dovecot       unix        –              n             n             –              –              pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}
Sur la première ligne: Chaque champ doit être séparé par une tabulation
Sur la seconde: La ligne commence par 2 espaces et chaque champ doit être séparé par un espace
Si vous avez par la suite des erreurs il y a de fortes chances de les réglées ici
sudo nano /etc/postfix/main.cf

Remplacez la ligne mydestination par:

ATTENTION: Remplacez la variable $NomDeDomaine
mydestination = mail.$NomDeDomaine, localhost
sudo service postfix restart
sudo postconf -e virtual_transport=dovecot
sudo postconf -e dovecot_destination_recipient_limit=1
  • Installation de Rainloop:
ATTENTION: Remplacez la variable $USERNAME
cd /home/$USERNAME
sudo mkdir rainloop
sudo chown $USERNAME:$USERNAME rainloop
cd rainloop
sudo wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip
sudo unzip rainloop-latest.zip -d /var/www/html/rainloop
sudo rm *.zip
cd ..
sudo mv rainloop /var/www/html/
cd /var/www/html/rainloop
sudo find . -type d -exec chmod 755 {} \;
sudo find . -type f -exec chmod 644 {} \;
sudo chown -R www-data:www-data .

On modifie la configuration Apache pour ajouter un alias:

       Alias /rainloop /var/www/html/rainloop
            <Directory /var/www/html/rainloop>
                Options Indexes MultiViews
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
sudo service apache2 restart

Rendez-vous sur http://$NomDeDomaine/rainloop/?admin

Entrez l’identifiants: admin avec le mot de passe 12345

Changez vos identifiants

Ajoutez un nouveau domaine:

ATTENTION: Pensez à remplacer $NomDeDomaine.

Vous pouvez maintenant vous rendre sur http://$NomDeDomaine/rainloop/

Et vous connecter avec les utilisateurs créer précédemment dans postfixadmin.

Votre serveur mail est maintenant opérationnel vous pouvez tester votre score sur Mail-Tester de façon à éviter d’être considéré comme spam.

Pour améliorer ce score vous pouvez par exemple mettre en place une signature DKIM ou encore renforcer la sécurité avec mta-sts.

Securisation SSL:

Si vous avez déjà suivi l’article sur la mise en place des certificats Let’s Encrypt vous pouvez éditer la configuration de postfix:

ATTENTION: Prenez bien soin et remplacer chaque $NomDeDomaine par votre propre nom de domaine.
sudo postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/$NomDeDomaine/fullchain.pem'
sudo postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/$NomDeDomaine/privkey.pem'
sudo postconf -e '#SSL'
sudo postconf -e 'smtpd_sasl_type = dovecot'
sudo postconf -e 'smtpd_sasl_path = private/auth'
sudo postconf -e 'smtpd_sasl_local_domain ='
sudo postconf -e 'smtpd_sasl_security_options = noanonymous'
sudo postconf -e 'broken_sasl_auth_clients = yes'
sudo postconf -e 'smtpd_sasl_auth_enable = yes'
sudo postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
sudo postconf -e 'smtp_tls_security_level = may'
sudo postconf -e 'smtpd_tls_security_level = may'
sudo postconf -e 'smtp_tls_note_starttls_offer = yes'
sudo postconf -e 'smtpd_tls_loglevel = 1'
sudo postconf -e 'smtpd_tls_received_header = yes'

Éditez la configuration de Dovecot:

sudo nano /etc/dovecot/conf.d/10-ssl.conf

Et adaptez les lignes:

ssl = required
ssl_cert = /etc/letsencrypt/live/$NomDeDomaine/fullchain.pem
ssl_key = /etc/letsencrypt/live/$NomDeDomaine/privkey.pem

Et ajoutez:

ssl_min_protocol = TLSv1

Redemarrez les services:

sudo postfix stop && sudo postfix start
sudo service dovecot stop && sudo service dovecot start

Firewall:

Si vous avez suivi l’article sur la mise en place d’un firewall, il faudra ouvrir les ports correspondants:

sudo nano /etc/init.d/firewall

Et ajoutez les lignes:

# Autoriser IMAP SSL
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
# Autoriser SMTP SSL
iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT

Enfin redemarrer le firewall:

sudo /etc/init.d/firewall stop
sudo /etc/init.d/firewall start

Fail2Ban:

Si vous avez installé Fail2Ban vous pouvez le configurer:

sudo sed -i '/^\[postfix\].*/a enabled = true' /etc/fail2ban/jail.local
sudo sed -i '/^\[dovecot\].*/a enabled = true' /etc/fail2ban/jail.local
sudo service fail2ban restart