MailPostfixDovecotPostfixAdminMariaDBNginxOpenDKIMSPDFOpenDMARCMTALDA

Date de publication: 7 octobre 2024

Mettre en place un serveur mail, Postfix, Dovecot sous Debian

Pourvoir envoyer des Mails via son propre serveur, c'est cool, non?

Un serveur mail implique pas mal de chose. Il est bon de se familiariser et d'en apprendre plus sur certains acteurs: MUA, MSA, MTA, LDA. Tout comme de connaître un minima ne serait-ce que l'existence de certains protocols utilisés: SMTP, IMAP, TLS, STARTTLS, HTTPS...

Aussi, se faire une idée des imbrications entre les différents acteurs, je vous invite à réaliser votre propre schéma d'un serveur mail.

Personnellement, je me suis aidé de ces deux schémas:

Pour faire ce brouillon:

...

Ce guide, est avant tout personnel, issue de la lecture de linuxbabe.com par Guoan Xiao.
C'est aussi mon expérience dans la mise en place de ce type de service pour un usage privé et non pro.
Actuellement testé sous Debian 12, 10/10 sur mail-tester, fonctionne parfaitement avec Thunderbird.

J'aime la démarche de Guaoan Xiao, qui procède étape par étape et fournit un ensemble d'explication sur les différentes opérations effectuées.
Cela aide à comprendre le fonctionnement d'un serveur mail.

Aussi, ce guide n'est pas aussi complet. Je vais le compléter/améliorer avec le temps, mais nous avons ici le nécessaire pour avoir un serveur mail fonctionnel.

Et c'est déjà bien assez au vue de la taille de ce post! Qui me permet ici de tester les limites, de mon framework, mais ça c'est un tout autre sujet...

Trigger Warning :o Rookie detected
Attention, je ne suis pas admin syst. je peux donc facilement me tromper sur certains points.

Remarque si vous souhaitez disposer d'un serveur mail à la maison, votre FAI/Hébergeur ne doit pas bloquer le port 25.

Et sans transition on commence!

Configuration du host, FQDN, et DNS

Afin de faire fonctionner l'ensemble, lister les informations nécessaire:
  • Nom de domain: domain.tld
  • Nom d'hôte: hostname
  • FQDN: hostname.domain.tld (Fully Qualify Name)
  • MX: mail.domain.tld

Éditer le nom d'hôte

En général sur un PC, le nom d'hôte est représenté par un mot. Mais pour un serveur on utilise en général le FQDN, soit le hostname+le nom de domaine.

Surtout qu'ici, Postfix va se servir du nom d'hôte pour communiquer avec d'autres MTA.

Ici, le nom d'hôte correspond au FQDN

Pour connaître le nom d'hôte

hostname -f

Editer le FQDN

sudo hostnamectl set-hostname _FQDN_

# pour vérifier les changements il est nécessaire de se reconnecter
exit

Configuration des DNS

DNS - c'est quoi?

Excellente conférence de Stéphane Bortzmeyer a propos des DNS: Le DNS, par Stéphane Bortzmeyer - partie 1 : conférence

Il est commun pour le MX de mettre mail.domain.tld

Aussi on a besoin d'un enregistrement ptr.
Cela permet lors d'un reverse DNS (rDNS) de confirmer qui est le propriétaire de l'adresse IP. C'est important, cela aide à bloquer les spammers, à éviter que le MTA rejette l'e-mail et vos e-mail on plus de chance de finir en 'boite de réception' au lieu du dossier 'spam'.

Aussi, le sous-domain mail doit pointer directement avec l'IP du serveur. Que ce soit en ipv4 (A) ou en ipv6 (AAA).

Pour résumer:

HOSTNAME            CLASS             RECORD TYPE          VALUE
-----------------------------------------------------------------
@                   IN                A                    ipv4 du serveur
@                   IN                AAAA                 ipv6 du serveur
hostname            IN                A                    ipv4 du serveur
hostname            IN                AAAA                 ipv6 du serveur

mail                IN                A                    ipv4 du serveur
mail                IN                AAAA                 ipv6 du serveur

@                   IN                MX          10       mail.domain.tld.
-------------------SERVICES ANNEXES-------------------------------
postfixadmin        IN                CNAME                hostname  
roundcube           IN                CNAME                hostname

Dit autrement:

  • @ <== comprendre qu'il s'agit du: domain.tld
  • hostname.domain.tld <== pointe vers les IP du serveur (ipv4 et ipv6)
  • mail.domain.tld <== pointe vers les IP du serveur (ipv4 et ipv6)
  • le MX pour les mails <== on redirige vers le sous-domaine mail.domain.tld

Et le ptr? Cela dépend de l'organisation qui gère votre nom de domain auprès du registar. Il doit y avoir une interface admin où l'indiquer.

Vérifier la prise en compte du ptr:

# via dig
# si non installer => sudo apt install dnsutils

dig -x IP_Address +short

# ou
host _IP_ADRESS_

Installation 'basique' de Postfix

Enfin! On commence :)

On va vous demander la configuration à choisir, sélectionnez 'Internet Site'.
Aussi, pour le System mail name indiquer votre 'domain.tld'.

  • No configuration <== aucune configuration du fichier de config. /etc/postfix/main.cf
  • Internet Site <== Postfix est utilisé pour envoyer et recevoir depuis les autres MTAs
  • Internet with smarthost <== Postfix reçoit les e-mail depuis les autres MTAs, et utilise smarthost comme serveur relai pour les courriers sortant
  • Satellite system <== on utilise smarthost pour envoyer et recevoir
  • Local only <== usage local uniquement

# install postfix
sudo apt-get install postfix -y

# vérifions la version
sudo postconf mail_version
> mail_version = 3.7.11

# regardons sur le réseau
sudo ss -lnpt | grep master

> LISTEN 0      100          0.0.0.0:25         0.0.0.0:*    users:(("master",pid=9292,fd=13))
> LISTEN 0      100             [::]:25            [::]:*    users:(("master",pid=9292,fd=14))

#  Postfix master écoute bien sur le réseau TCP via le port 25

# penser à débloquer ce port au niveau du par-feu
sudo ufw allow 25/tcp

Vérifier si le port 25 est bien ouvert: port-scan- ipvoid.com

Vérifier si Postfix peut envoyer des emails vers d'autres serveurs SMTP:

# si besoin installer telnet: sudo apt install telnet
# check le outbound TCP port 25
telnet gmail-smtp-in.l.google.com 25

quit

Une response de type 220, c'est ok:
220 mx.google.com ESMTP 6b1f17b2487b1-42e75469ff3si8883905e9.207 - gsmtp

Sinon c'est que le port 25 est bloqué: telnet: Unable to connect to remote host: Connection timed out
Dans ce cas, demander à ouvrir le port, sinon faudra passer par un relaie SMTP.

Configuration de Postfix

Pour le moment nous allons simplement configurer le hostname:

sudo nano /etc/postfix/main.cf

myhostname = mail.example.com

Préparation à l'installation de Dovecot

Afin de pouvoir envoie des e-mails depuis un client mail, comme Thunderbird, il faut activer le service submission de Postfix.

On a besoin d'un server IMAP, ici nous utilisons Dovecot

Aussi afin de chiffrer les communications, on utilisera des certificats généré par Let's Encrypt.

Réglages au niveau du par-feu

On va avoir besoin des ports suivants:

  • 80 <== http
  • 443 <== https
  • 587 <== SMTP
  • 465 <== SMTPS
  • 143 <== IMAP
  • 993 <== IMAPS
Soit pour ufw sudo ufw allow 80,443,587,465,143,993/tcp

Si vous compter utiliser pop3 (récupération des email):

  • 110 <== POP3
  • 995 <== POP3 chiffré
Soit pour ufw sudo ufw allow 110,995/tcp

Obtention du certificats

Ici, on va passer par Nginx pour certifier 'mail.domain.tld' mais on ne l'installera pas en tant que server web, comme on peut le faire habituellement pour un site.

On passera par certbot édité par EFF. Il permet d'automatiser la génération de certificats Let's Encrypt.

# si non installé
sudo apt install nginx 

# install certbot et le plugin pour nginx
sudo apt install certbot python3-certbot-nginx

Configuration Nginx

Il faut configurer Nginx afin que certbot puisse l'utiliser pour l'authentification.

On va créer un virtual host: sudo nano /etc/nginx/conf.d/mail.domain.tld.conf

server {
      listen 80;
      listen [::]:80;
      server_name mail.domain.tld;

      root /usr/share/nginx/html/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

# on créer le répertoire correspondant
sudo mkdir -p /usr/share/nginx/html/

# restart nginx
sudo systemctl reload nginx

Ok, il nous reste à lancer la commande certbot:

sudo certbot certonly -a nginx --agree-tos --no-eff-email --staple-ocsp --email you@domain.tld -d mail.domain.tld

> Successfully received certificate.

Quelques explications sur les options de la commande:

  • certonly <== on est pas dans le cas d'un serveur web, on veux que le certificat TLS
  • -a nginx <== on passe par nginx pour l'authentification
  • --no-eff-email <== on ne veux pas recevoir d'e-mail de la fondation EFF
  • --staple-ocsp <== OCSP:Online Certificate Status Protocol, ça permet de sécurisé la vérification de la validité des certificats numériques - ne m'en demander pas plus xD
  • --email <== nécessaire, en cas de problème on veux recevoir un mail
  • -d <== pour indiquer un domaine à valider, on peut en mettre plusieurs si on a besoin

Postfix: configuration du service Submission

Paramétrons Postfix afin d'activer le service Submission: /etc/postfix/master.cf

Faites attention à l'indentation

Il est important de laisser un espace devant chaque -o

Prenez le temps de lire la section jusqu'au bout pour bien comprendre comment modifier le fichier.

sudo nano /etc/postfix/master.cf

Ici, on active Submission et on demande le chiffrement TLS, soit le port 587 via STARTTLS.

submission     inet     n    -    y    -    -    smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=no
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

Pour Outlook, le support de submission doit passer par du SMTPS soit le port 465. Ce qui necessite l'ajout de smtps:

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

Au final votre fichier ressemble à ça:

...

Postfix: TLS configuration

sudo nano /etc/postfix/main.cf

#Enable TLS Encryption when Postfix receives incoming emails
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.domain.tld/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.domain.tld/privkey.pem
smtpd_tls_security_level=may 
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

#Enable TLS Encryption when Postfix sends outgoing emails
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

#Enforce TLSv1.3 or TLSv1.2
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

Soit la portion suivante dans le fichier:

...

On redémarre le service et on vérifie que Postfix est bien écoute sur les 587 et 465.

# restart de postfix
sudo systemctl restart postfix

# Postfix est-il à l'écoute?
sudo ss -lnpt | grep master

Vous devriez voir quelque chose de similaire à:

LISTEN 0      100          0.0.0.0:587        0.0.0.0:*    users:(("master",pid=14466,fd=18))
LISTEN 0      100          0.0.0.0:465        0.0.0.0:*    users:(("master",pid=14466,fd=22))
LISTEN 0      100          0.0.0.0:25         0.0.0.0:*    users:(("master",pid=14466,fd=13))
LISTEN 0      100             [::]:587           [::]:*    users:(("master",pid=14466,fd=19))
LISTEN 0      100             [::]:465           [::]:*    users:(("master",pid=14466,fd=23))
LISTEN 0      100             [::]:25            [::]:*    users:(("master",pid=14466,fd=14))

Installation du server IMAP Dovecot

Rien de compliqué ici voyez plutôt:

# installation de dovecot et du paquet IMAP daemon
sudo apt install dovecot-core dovecot-imapd

# si vous utilisez POP3
sudo apt install dovecot-pop3d

# vérifie que Dovecot est bien présent:
sudo dovecot --version

> 2.3.19.1 (9b53102964)

Maintenant il faut modifier plusieurs fichiers, 7 pour être précis. Rien de compliqué, mais une erreur est vite arrivée. Prenez le temps de les effectuer et surtout de comprendre ce qu'elles impliquent.

Dovecot: activation du protocol IMAP/POP3

# edit la config. de dovecot
sudo nano /etc/dovecot/dovecot.conf

# ajout de la ligne
protocols = imap

# si vous souhaitez aussi POP3
protocols = imap pop3

# sauvegarder et fermer

Ce qui nous donne:

...

Utiliser Mailbox en lieu et place de Mbox

Le format par défaut pour stocker les emails est mbox. Ici, on va lui préférer le format maildir qui est issue du MTA Qmail.
Pourquoi? Je ne sais pas, il est plus répandu, j'imagine plus pratique à utiliser. J'ai cru comprendre qui c'était lié aux verrouillage des fichiers.

Pour la config. de mailbox c'est par ici:

# edit la config. de dovecot pour mailbox
sudo nano /etc/dovecot/conf.d/10-mail.conf

# rechercher mbox
mail_location = mbox:~/mail:INBOX=/var/mail/%u

# remplacer par maildir
mail_location = maildir:~/Maildir

# sauvegarder et fermer

Ensuite, il faut ajouter Dovecot au groupe mail, afin qu'il puisse lire les mails:

sudo adduser dovecot mail

LMTP Protocol

Par défaut, Postfix utilise sont propre LDA pour déplacer les messages entrant vers les bons dossiers: boîte de reception, envoyé, corbeille, spam, .. le tout au format mbo.

Ici, on va le remplacer par le protocol LMTP, qui est une version simplifiée du SMTP. le tout au format Maildir

LMTP permet l'utilisation de sieve pour filtrer les messages entrant et les répartir dans les différents dossiers.

Installons et configurons le serveur LMTPD pour Dovecot

# installation de Dovecot LMTP Serveur
sudo apt install dovecot-lmtpd

# edit la config.
sudo nano /etc/dovecot/dovecot.conf

# ajouter lmtp à la liste des protocols
protocols = imap lmtp

# sauvegarder et fermer

On va editer la définition du service lmtp dans Dovecot.
Attention aux accolades

service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
   mode = 0600
   user = postfix
   group = postfix
  }
}

Ce qui donne:

...

Indiquons à Postfix que l'on passe maintenant par le serveur Dovecot LMTP.

# edit la config.
sudo nano /etc/postfix/main.cf

# a la fin du fichier ajouter
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no

# sauvegarder et fermer

On désactive SMTPUTF8 car non supporter par par Dovecot-LMPTP.

Il s'agit d'une extension de SMTP pour le support des caractères Unicode dans les adresses mail et les en-têtes de message.

Configuration du mécanisme d'authentification de l'utilisateur

# edit la config. authentification
sudo nano /etc/dovecot/conf.d/10-auth.conf

# décommenter cette ligne
disable_plaintext_auth = yes

# chercher/remplacer
#auth_username_format = %Lu

#par
auth_username_format = %n

# ajout du login comme mecanisme d'authentification
# cette ligne  
auth_mechanisms = plain

#devient 
auth_mechanisms = plain login

# sauvegarder et fermer

Explications pour auth_username_format = %n:

De base Dovecot va chercher les e-mails en utilisant l'adresse complète "username@provider.tld". Ici, on se base sur le nom d'utilisateur uniquement (basé sur l'OS - operating system). On va donc dire à Dovecot d'ingorer le provider. Pour résumer on ne prend en compte que le 'username'.

Dovecot: config. SSL/TLS

# edit la config. ssl/tls
sudo nano /etc/dovecot/conf.d/10-ssl.conf

# changer ssl = yes par ssl = require pour obliger le chiffrement
ssl = required

# chercher/remplacer
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key

#par
ssl_cert = </etc/letsencrypt/live/mail.domain.tld/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.domain.tld/privkey.pem

# chercher/editer
#ssl_prefer_server_ciphers = no

# par 
ssl_prefer_server_ciphers = yes

# chercher/editer
#ssl_min_protocol = TLSv1

# par
ssl_min_protocol = TLSv1.2

# sauvegarder et fermer

Petite explication pour ssl_prefer_server_ciphers = yes. Ici on indique que c'est le serveur qui impose sa liste de chiffrement et non le client.

Dovecot: config. SASL Authentification

SASL: Simple Authentification and Security Layer soit couche d'authentification et de sécurité simple est un cadre pour les services d'authentification et d'autorisation. Il est définit par IETF (Internet Engineering Task Force).

Configurons Dovecot afin que Postfix puisse trouver le serveur d'authentification de Dovecot.

Encore une fois ici, attention aux accolades.

service auth {
    unix_listener /var/spool/postfix/private/auth {
      mode = 0660
      user = postfix
      group = postfix
    }
}

Soit le fichier suivant:

...

On redémarre Dovecot et on vérifie ce qu'il écoute.

# redémarre dovecot et postfix
sudo systemctl restart postfix dovecot

# dovecot écoute quoi?
sudo ss -lnpt | grep dovecot

Vous devriez avoir:

LISTEN 0      100          0.0.0.0:993        0.0.0.0:*    users:(("imap-login",pid=14501,fd=9),("dovecot",pid=14472,fd=38))
LISTEN 0      100          0.0.0.0:143        0.0.0.0:*    users:(("imap-login",pid=14501,fd=7),("dovecot",pid=14472,fd=36))
LISTEN 0      100             [::]:993           [::]:*    users:(("imap-login",pid=14501,fd=10),("dovecot",pid=14472,fd=39))
LISTEN 0      100             [::]:143           [::]:*    users:(("imap-login",pid=14501,fd=8),("dovecot",pid=14472,fd=37))

En cas de problème vérifier d'abord si Dovecot est lancé: sudo systemctl status dovecot.

Configuration du client mail

Un moment important, les tests via un client mail comme Thunderbird.

On va essayer d'envoyer et de recevoir un mail. Attention, faite bien qu'un seul essaie. Car même si le serveur est correctement configurer, on ne montre pas encore "pattes blanche". Ici, il s'agit juste d'un essaie.

On utilise les comptes Unix locaux comme adresse mail. Soit l'utilisateur 'jean' aura pour adresse 'jean@domain.tld' et son mot de passe.

Remarque: On peut également utiliser IMAP:993 et SMTP:465.

Ne pas utiliser le port 25

Il est vivement proscrit de ne pas utiliser SMTP:25.

Exemple de configuration avec Thunderbird:

...

Alors heureux? Moi, j'ad♥re.

Renouvellement automatique des certificats TLS

On va passer par un crontab afin de Renouveller automatiquement les certificats:

# au besoin > sudo apt-get install cron
sudo crontab -e

# si Apache
@daily certbot renew --quiet && systemctl reload postfix dovecot apache2

# si Nginx
@daily certbot renew --quiet && systemctl reload postfix dovecot nginx

Redémarrage automatique du service Dovecot

On va modifier le service de Dovecot.

# création du repertoire responsable du service
sudo mkdir -p /etc/systemd/system/dovecot.service.d/

# création du service
sudo nano /etc/systemd/system/dovecot.service.d/restart.conf

# ajouter
[Service]
Restart=always
RestartSec=5s

# sauvegarder et quitter

# redémarrage du service
sudo systemctl daemon-reload

# on test en tuan le process
sudo pkill dovecot

# et on regarde si Dovecot à redémarré
systemctl status dovecot

> dovecot.service - Dovecot IMAP/POP3 email server
> [...]
> Active: active (running) since Thu 2024-09-19 21:15:22 UTC; 5s ago

Boîte mail virtuelle et PostfixAdmin

On va s'affranchir de l'utilisation des comptes Unix pour gérer nos comptes e-mail. On va passer par une interface web via PostfixAdmin.

Cela necessite d'avoir une base de données: Postgre, MysqlMariaDB ou SQLite. Ici, on utilisera MariaDB.

Installation de MariaDB

# installation mariaDB
sudo apt install mariadb-server mariadb-client

# on vérifie que sa tourne
systemctl status mariadb

#sinon on démarre le service
sudo systemctl start mariadb

# on configure auto-start de MariaDB au reboot du serveur
sudo systemctl enable mariadb

# on securise l'installation

Répondez de la manière suivante:

...

Installation de PostFixAdmin

On va récupérer la dernière version via le dépôt GitHub

# Téléchargement de la dernière version de PostFixAdmin via gitHub
wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.13.tar.gz

# on extrait dans www
sudo tar xvf postfixadmin-3.3.13.tar.gz -C /var/www/

# on renome le dossier
sudo mv /var/www/postfixadmin-postfixadmin-3.3.13 /var/www/postfixadmin

# config. le rep. templates_c via acl <== sudo apt install acl
# creer le dossier
sudo mkdir /var/www/postfixadmin/templates_c

# definit les droits
sudo setfacl -R -m u:www-data:rwx /var/www/postfixadmin/templates_c/

Si ce n'est deja fait donner les droits de lecture au certificat TLS de Let's Encrypt au serveur web:

sudo setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/

Création de la DB pour PostfixAdmin

# on log a mariadb
sudo mysql -u root

# creation de la table
create database postfixadmin;

# ajout de l'utilisateur et de ses privilèges sur la table
grant all privileges on postfixadmin.* to 'postfixadmin'@'localhost' identified by '_mot_de_passe_';

# refresh les droit et exit
flush privileges;
exit;

On configure PostfixAdmin /var/www/postfixadmin/config.local.php

# crer notre fichier de configuration
sudo nano /var/www/postfixadmin/config.local.php

# Avec la configuration suivante
<?php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_port'] = '3306';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = '_mot_de_passe_';
$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
}

#sauvegarder/quitter

A noter l'utilisation ARGON2I comme algo. de hashage de mote de passe.

Oupss, j'ai pas php :o

Je tiens à dire que c'est honteux! Allez hop! On passe par les dépôts de sury.org. Pourquoi? Parce que sury à la vie!

# on va avoir besoin de gpgn gpg est-tu là?
which gpg

# sinon 
sudo apt install gpg

# ajout le dépôt
wget -qO - https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /usr/share/keyrings/sury-php.gpg
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list

# met à jour la liste
apt-get update

# on peut maintenant installer la version que l'on souhaite de php
sudo apt install -y php8.3-fpm

# on vérifie
php -v

# on ajoute les extensions nécessaires/utiles/recommandées
# rip php8.3-json
sudo apt install php8.3-fpm php8.3-imap php8.3-mbstring php8.3-mysql  php8.3-curl php8.3-zip php8.3-xml php8.3-bz2 php8.3-intl php8.3-gmp

On ajout le virtual host pour PostFixAdmin à Nginx.

sudo nano /etc/nginx/conf.d/postfixadmin.conf

server {
   listen 80;
   listen [::]:80;
   server_name postfixadmin.example.com;

   root /var/www/postfixadmin/public/;
   index index.php index.html;

   access_log /var/log/nginx/postfixadmin_access.log;
   error_log /var/log/nginx/postfixadmin_error.log;

   location / {
       try_files $uri $uri/ /index.php;
   }

   location ~ ^/(.+\.php)$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
   }
}
# la config nginx est ok?
sudo nginx -t

>nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
>nginx: configuration file /etc/nginx/nginx.conf test is successful

# on restart
sudo systemctl reload nginx

A noter que normalement pour un site, on passe par l'utilisation de répertoire ites-available et que l'on place un lien symbolique vers sites-enabled. Afin de pouvoir activer/desactiver facilement les configs pour chqaue site.

On demande un certif. à Cerbot pour notre sous-domaine postfixadmin:

sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email username@domain.tld -d postfixadmin.domain.tld

> Successfully deployed certificate for postfixadmin...
> Congratulations! You have successfully enabled HTTPS on https://postfixadmin...

Explication de la commande:

  • --nginx <== passe par nginx pour l'autentification
  • --agree-tos <== oui, on est d'accord avec les condifitions d'utilisation - qu'on ne lit quasi jamais xD
  • --redirect <== une reditection HTTP:301 pour forcer HTTPS
  • --hsts <== HTTP Strict Transport-Security - le navigateur est forcé d'utiliser TLS - prémunir contre le SSL/TLS Stripping
  • --staple-ocsp <== Online Certificates Status Protocol - On vient coller la réponse du CA (Autorité de certification) au certif. pour vérifier que ce dernier n'est pas révoqué - protection contre les attaque "Man-in-the-Middle".

Activation des statistiques dans Dovecot

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

# ajouter les lignes suivantes
service stats {
    unix_listener stats-reader {
    user = www-data
    group = www-data
    mode = 0660
}

unix_listener stats-writer {
    user = www-data
    group = www-data
    mode = 0660
  }
}

#sauvegarder/quitter

On doit ensuite ajouter le serveur web (www-data) au groupe dovecot

sudo gpasswd -a www-data dovecot

# restart dovecot
sudo systemctl restart dovecot

# on permet a www-data d'acceder aux stats
sudo setfacl -R -m u:www-data:rwx /var/run/dovecot/stats-reader /var/run/dovecot/stats-writer

Finalise l'instlattion de PostFixAdmin via UI

Aller sur la page postfixadmin.domain.tld/setup.php

Indiquer un mot de passe d'installation.

Copier et ajouter la variable $CONF['setup_password'] au fichier config.local.php
Par exemple: $CONF['setup_password'] = '$2y$10$ZPTwZ/PktQSYX61X3j5X..aBYz3B0ej1W6V6ifsNtYu5ZcTribb6C';

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

Comme ceci:

...

Actualiser la page et créer le compte administrateur.

Tous doit être au vert et la base mise à jour.

Configuration de Postfix afin qu'il utilise MariaDB

Postfix ne doit plus utliser les comptes utilisation unix mais des utilisateurs virtuels. Ces derniers sont enregistrés dans la base de données et définit via PostfixAdmin. Pour cela postfix à besoin du plugin mysql. Ensuite, on editera la configuration.

# install le plugin mysql
sudo apt install postfix-mysql

# edit la config de Postfix
sudo nano /etc/postfix/main.cf

# ajouter en fin de 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_transport = lmtp:unix:private/dovecot-lmtp

# sauvegarder/quitter

Explications:

  • virtual_mailbox_domains <= via un fichier on va expliquer à Postfix comment chercher un domain dans la DB
  • virtual_mailbox_maps <= via un fichier on va expliquer à Postfix comment chercher une adresse mail dans la DB
  • virtual_alias_maps <= via un fihcer on va expliquer à Postfix comment chercher les alias dans la DB
  • virtual_transport = lmtp:unix:private/dovecot-lmtp <= On veut utiliser Dovecot pour déliver les messages entrant aux utilisateurs virtuels

Du coup il faut bien les créer ces fichier .cf

# creer notre dossier
sudo mkdir /etc/postfix/sql/

# crer mysql_virtual_domains_maps.cf - editer le mot de passe
sudo nano /etc/postfix/sql/mysql_virtual_domains_maps.cf

# ajouter
user = postfixadmin
password = _mot_de_passe_
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

# sauvegarder/quitter

# creer mysql_virtual_mailbox_maps.cf 
sudo nano /etc/postfix/sql/mysql_virtual_mailbox_maps.cf

# ajouter - editer le mot de passe
user = postfixadmin
password = _mot_de_passe_
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100

# sauvegarder/quitter 

# créer mysql_virtual_alias_domain_mailbox_maps.cf
sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

# ajouter - editer le mot de passe
user = postfixadmin
password = _mot_de_passe_
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'

# sauvegarder/quitter

# créer mysql_virtual_alias_maps.c
sudo nano /etc/postfix/sql/mysql_virtual_alias_maps.cf

# ajouter - editer le mot de passe
user = postfixadmin
password = _mot_de_passe_
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#expansion_limit = 100

# sauvegarder/quitter

# créer mysql_virtual_alias_domain_maps.cf
sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf

# ajouter - editer le mot de passe
user = postfixadmin
password = _mot_de_passe_
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'

# sauvegarder/quitter

# créer mysql_virtual_alias_domain_catchall_maps
sudo nano /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

# ajouter - editer le mot de passe
# handles catch-all settings of target-domain
user = postfixadmin
password = _mot_de_passe_
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'

Attend avant de respirer, ce n'est pas finit.

On limite l'accès à ces fichiers vu qu'ils contient les mots de passe hardcoded.

sudo chmod 0640 /etc/postfix/sql/*
sudo setfacl -R -m u:postfix:rx /etc/postfix/sql/

Ensuite il faut changer le paramètre $mydestination dans postfix

sudo postconf mydestination
> mydestination = $myhostname, domain.tld, localhost.$mydomain, localhost

Vu la configuration effectuée plutôt, à savoir l'utilisation des comptes unix en tant que compte e-mail.
Maintenant, que l'on utilise des utilisateurs virtuels, il faut retirer l'apex domaine.

On 'clear' le paramètre.

sudo postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost"

Au niveau de postfix, il faut maintenant définir la localisation des fichiers mail, quel ID user et quel ID group utiliser pour délivrer les messages entrant dans les boîte mails.

sudo nano /etc/postfix/main.cf

# ajouter à la fin
virtual_mailbox_base = /var/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000

# sauvegarder/quitter

# redémarre le service
sudo systemctl restart postfix

On va maintenant créer le user vmail et le groupe en question:

sudo adduser vmail --system --group --uid 2000 --disabled-login --no-create-home

# le rep. où sont stocker les fichiers mails
sudo mkdir /var/vmail/

# definit vmail comme propriétaire du rep.
sudo chown vmail:vmail /var/vmail/ -R

Configuration de Dovecot afin qu'il utilise MariaDB

Dovecot à besoin d'un plugin pour fonctionner avec mysql.

sudo apt install dovecot-mysql

On edit 10-mail.conf afin d'indiquer le rep. pour les utilisateurs virtuels.

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

# chercher
mail_location = maildir:~/Maildir

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

# sauvegarder/quitter

Ce qui donne:

...

On doit éditer la configuration d'authentification.

En effet, on a besoin maintenant de garder le provider lors du login. On va également limiter la connexion au seul domain.tld via auth_default_realm. Ensuite, on désactivera les comptes locaux au profit des utilisateurs virtuels. Enfin, on activera les logs qui seront ici: /var/log/mail.log.

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

# chercher
auth_username_format =

# configurer de la manière suivante:
auth_username_format = %u

# chercher
auth_default_realm

# changer par
auth_default_realm = domain.tld

# chercher  
include auth-sql.conf.ext

# commenter
!include auth-sql.conf.ext

# chercher 
include auth-system.conf.ext

# décommenter
include auth-system.conf.ext

# ajouter en fin de fichier 
auth_debug = yes
auth_debug_passwords = yes

# sauvegarder/quitter

La fin du fichier ressemble à ceci:

...

Enfin, il faut indiquer à Dovecot le sql pour utiliser la DB:

sudo nano /etc/dovecot/dovecot-sql.conf.ext

# ajouter en fin de fichier - editer le mote de passe - se sera plus simple
driver = mysql

connect = host=localhost dbname=postfixadmin user=postfixadmin password=_mot_de_passe

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

# sauvegarder/quitter 

# on redémarre Dovecot
sudo systemctl restart dovecot

Ajout du domaine et création d'un compte mail via PostfixAdmin

Rien de particulier ici, l'interface est assez intuitive.

Au niveau de thunderbird, la configuration est normalement détectée automatiquement:

...

Supprimer automatiquement le contenu de la Corbeille et le répertoire 'junk'

Une bonne pratique et de vider régulièrement ces répertoires: corbeille et 'junk'. On va ici passer par un cron pour supprimer ces élements, en particulier ceux qui ont plus de deux semaines.

Pour cela on va avoir besoin de permettre a www-data de lire les certif. Aussi, en cas de problème on s'envoie un e-mail.

sudo crontab -e

# ajouter
MAILTO="_adress_@domain.tld"

# Nettoie les dossiers Junk et Trash chaque jour
@daily doveadm expunge -A mailbox Junk savedbefore 2w
@daily doveadm expunge -A mailbox Trash savedbefore 2w

# Autorise l'utilisateur www-data à lire les fichiers de certificat tous les jours
@daily setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/

# sauvegarder/quitter

Restreindre Sendmail

Par défaut, les utilisateurs locaux peuvent envoyer des mail via sendmail. Depuis qu'on utilise les boîtes mails vituelles, on va souhaiter restreindre webmail à ne faire confiance qu'aux utilisateurs locaux de 'confiance'. Si un utilisateur méchant

veux spam et nuire à la réputation du serveur, il sera bloqué.

sudo nano /etc/postfix/main.cf

# ajouter en fin de fichier
authorized_submit_users = root,www-data,vmail

# sauvegarder/quitter

# restart postfix
sudo systemctl restart postfix

Postfix: SPF et DKIM

Nous avons un serveur mail qui fonctionne. Mais, on vient de mettre tout ça en place, il faut donc montrer "pattes blanches".

SPF (Sender Policy Framework) et DKIM (DomainKeys Identified Mail) sont des méthodes d'authentification qui aide à luttre contre les spammers en établissant une sorte de "règlement" de bonne conduite.

Cela se matérialise par l'ajout d'enregistrement au niveau des DNS

SPF spécifie quel host ou IP sont autorisés à envoyer des mail au nom du domaine.

DKIM utiliser un clé privé pour singner les e-mails envoyés par le par le domaine. Sachant que la clé publique se trouve dans les DNS

Créer un enregistrement SPF

Cela conciste par ajouter un enregistrement TXT dans la table DNS.

HOSTNAME            CLASS             RECORD TYPE          VALUE
-----------------------------------------------------------------
@                   IN                TXT                  v=spf1 mx ip4:_P8DU_SERVEUR_ ~all

Explications:

  • @ <= représente le domain.tld
  • TXT <= le type d'enregistrement 'text'
  • v=spf1 <= la version de SPF
  • mx <= indique que tous host listés dans les enregistrement mx sont autorisés à envoyer des mail via le domain.tld. Les autres host sont de facto interdit.
  • ~all <= spécifie que les e-mails provenant du domain.tld ne doivent provenir que des host spécifies dans l'enregistrement SPF. Les autres e-mails sont 'marqués' comme indigne de confiance.

A savoir que dans un enregistrement SPF ont peut indiquer une adresse IP.

Pour vérifier la propagation de l'enregistrement:

dig domain.tld txt

L'enregistrement SPF doit apparaître.

Pour vérifier la syntax de l'enregistrement: spf-survey - dmarcian.com

Configurer le SPF Policy Agent

Il faut indiquer au serveur SMTP de Postfix de vérifier l'enregistrement des e-mails entrant. Cela permet de détecter des e-mail falsifiés.

# on a besoin des paquets suivant
sudo apt install postfix-policyd-spf-python

# edit la conf master
sudo nano /etc/postfix/master.cf

# ajouter en fin de fichier, afin  de démarer SPF policy daemon en même tant que le serveur SMTP
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

# sauvegarder/quitter 

# edit la conf de postfix
sudo nano /etc/postfix/main.cf

# a la fin, ajouter
policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   reject_unauth_destination,
   check_policy_service unix:private/policyd-spf

# sauvegarder/quitter 

# restart le service
sudo systemctl restart postfix

Ainsi on rejette et restreint les courriels entrant non autorisés en 'chekant' l'enregistrement SPF.

On peut remarquer dans l'en-tête d'un courriel si l'email vient d'un host de autorisé: Received-SPF: Pass (sender SPF authorized).

Installer DKIM

On va installer OpenDKIM qui permet d'utiliser DKIM.

Ici, on indiquera à OpenDKIM plusieurs serveurs DNS pour les requêtes. La rededance c'est bien, la robustesse aussi. Du coup on ajoute:

  • 8.8.8.8 <= Google
  • 1.1.1.1 <= Cloudflare

# on récupère OpenDKIM
sudo apt install opendkim opendkim-tools

# ajout postfix au groupe opendkim
sudo gpasswd -a postfix opendkim
> Adding user postfix to group opendkim

# edit la conf. OpenDkim
sudo nano /etc/opendkim.conf

# décommenter 
Canonicalization   relaxed/simple
Mode               sv
SubDomains         no

# chercher la ligne/remplacer
Nameservers   127.0.0.1

# par
Nameservers     8.8.8.8,1.1.1.1

# en fin de fichier ajouter
# Map domains in From addresses to keys used to sign messages
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts

# A set of internal hosts whose mail should be signed
InternalHosts       /etc/opendkim/trusted.hosts

# sauvegarder/quitter

Créer les tables de signatures et de clé et le fichier trusted.host

On doit maintenant créer les tables de signatures et de clés, ainsi que le fichier 'trusted.hosts'.

Pour cela il faut donner les droits à opendkim et lui seul, l'accès en lecture/ecriture au répertoire?

Et dire que l'on souhaite que l'expediteur qui utilise domain.tld, doit signé avec la clé privé default._domainkey.your-domain.tld. Et que ceci est valable pour les sous-domaines également.

Enfin, on n'effectura pas de vérification DKIM pour les mails provenant de localhost ou ayant le même domaine.

sudo mkdir -p /etc/opendkim/keys

# on donne les droits à opendkim
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys

# créer la table de signatures
sudo nano /etc/opendkim/signing.table

# ajouter  - editer domain.tld
*@domain.tld      default._domainkey.domain.tld
*@*.domain.tld    default._domainkey.domain.tld

# sauvegarder/quitter 

# créer la table des clés
sudo nano /etc/opendkim/key.table

# ajouter l'emplacement de la clé privé - editer domain.tld
default._domainkey.domain.tld     domain.tld:default:/etc/opendkim/keys/domain.tld/default.private

# sauvegarder/quitter 

# créer le fichier trusted.hosts  
sudo nano /etc/opendkim/trusted.hosts

# ajouter - editer domain.tld
127.0.0.1
localhost

.domain.tld

# sauvegarder/quitter

Génération des clés

Comme vu précédement on a beson d'une paire clés privée/publique.

On doit ensuite définit opendkim comme propriétaire des clés

# editer domain.tld
sudo mkdir /etc/opendkim/keys/domain.tld

# gen keys - editer domain.tld
sudo opendkim-genkey -b 2048 -d domain.tld -D /etc/opendkim/keys/domain.tld -s default -v

> opendkim-genkey: generating private key
> opendkim-genkey: private key written to default.private
> opendkim-genkey: extracting public key
> opendkim-genkey: DNS TXT record written to default.txt

# définit openskim comme le propriétaire des clés avec les "bons" droits - editer domain.tld
sudo chown opendkim:opendkim /etc/opendkim/keys/domain.tld/default.private
sudo chmod 600 /etc/opendkim/keys/domain.tld/default.private

Publier la clé

Il faut maintenant ajotuer la clé public dans un enregistrement txt au niveau des DNS

Pour la clé, copier tout ce qui se trouve entre les parenthèses. Pensez à concatener et trimer la valeur.

# afficher la clé - editer domain.tld
sudo cat /etc/opendkim/keys/domain.tld/default.txt

Créer l'enregistrement DNS:

HOSTNAME               CLASS             RECORD TYPE        VALUE
--------------------------------------------------------------------------
default._domainkey     IN                TXT                v=DKIM1;h=sha256;s=email;p=_votre_clé_publique_base_64_

Tester la clé

# tester la cle - editer domain.tld
sudo opendkim-testkey -d domain.tld -s default -vvv

> opendkim-testkey: using default configfile /etc/opendkim.conf
> opendkim-testkey: checking key > 'default._domainkey.domain.tld>'
> opendkim-testkey: key secure
> opendkim-testkey: key OK

Pour tester la clé publique et sa propagation: dkim-check - mimecast.com
Pour le selector indiquer default. Vous n'êtes pas obligé d'indiquer vos infos. Perso. fermer simplement la fenêtre pour lire les résulats.

Postfix et OpenDkim

Pour 'connecter' Postfix à OpendDkim, cela passe par un socket (un socket est un mécanisme de communication inter-processus IPC - Berkeley 1980')

Postfix, sur Debian est configuré pour s'executer dans un chroot jail. Ce qui permet de restreindre le processus dans un sous-ensemble limité du système de fichier.

De par ce mécanisme, Posfix, ne 'voit' le socket d'OpenDkim qu'à 'travers' cette prison. Ce qui demande de reconfigurer le socket d'OpenDkim.

# création du rep. pour le socket
sudo mkdir /var/spool/postfix/opendkim

# on définit les droits
sudo chown opendkim:postfix /var/spool/postfix/opendkim

# edit la config. OpendDKIM
sudo nano /etc/opendkim.conf

# chercher/remplacer 
Socket    local:/run/opendkim/opendkim.sock

# par
Socket    local:/var/spool/postfix/opendkim/opendkim.sock

#sauvegarder/quitter

# ouvrir
sudo nano /etc/default/opendkim

# chercher/remplacer
SOCKET=local:$RUNDIR/opendkim.sock

# par
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

# sauvegarder/quitter 

# on edit la config. de postfix
sudo nano /etc/postfix/main.cf

# ajouter à la fin
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

# sauvegarder/quitter 

# redemarer opendkim et postfix
sudo systemctl restart opendkim postfix

SPF and DKIM Check

Vérifier si le SPF et DKIM sont OK.

Dans thunderbird, envoyé un mail à une autre adresse ayant un provider différents et regardez les en-têtes du courriel:

...

Utiliser le service mail-tester pour tester l'envoie (uniquement).

...

Pour tester comment sont reçus vos mails Glock Apps offre deux tests.
Il test beaucoup de pays et donne quelques conseils, comme les
guidelines de google, ou les recommandations de yahoo pour les liens de désincription.
Ainsi que des conseils concernant Aol, Outlook et Gmail pour éviter de finir dans les spams.
Pour le reste, je vous laisse découvire leur service.

...

Le résultat est mitigé en ce qui me concerne. Normal, DMARC, n'est pas ecnore configuré. Aussi je vous conseils d'attendre de tout mettre en place avant d'effectuer ce genre de tests, vu qu'ils sont limités.
Aussi mon IP n'a pas une grande réputation et ça malheureusement à ma connaissance actuelle, je ne peux pas y faire grand chose.

Je vous laisse explorer cet article sur le sujet: éviter de finir dans les spams (en) - linuxbabe.com

Utiliser DMARC

Comme nous l'avons vu précemdement, les serveurs analysent si DMARC est présent.

DMARC (Domain-based Message Authentification, Reporting, and Conformance), c'est une spécification technique, qui va utiliser SPF et DKIM, pour standardiser la manière de s'authentifier. Encore une fois, c'est normalisé par IETF

Ainsi DMARC permet de:

  • détecter les fraude <== modification de l'en-tête du mail comme le from, cela participe à la lutte contre le phishing.
  • la livraison des mails est simplifiée <= la standardisation permet la simplification des règles de filtrage
  • favorise la réputation du domaine <= ce n'est pas une science exacte, mais implémenter DMARC augmente les chances d'avoir une meilleurs réputation.
  • Obtention de rapport <= cela permet de recevoir des rapports afin de connaitre le nombre d'emails légitimes envoyés depuis le domaine. Et aussi les courriels qui echouent à l'authentification. C'est cruciale, car sans informations on ne sait pas s'améliorer sur ce niveau.
Bon super! Comment on fait?

Il faut absolument vérifier que SPF et DKIM soient correctement configuré au préalable (voir précédement).

Créer l'enregistrement DMARC

Au niveau de la zone DNS ajouter l'enregistrement suivant:

HOSTNAME               CLASS             RECORD TYPE        VALUE
--------------------------------------------------------------------------
_marc                  IN                TXT                v=DMARC1; p=none; pct=100; rua=mailto:_votre_adresse_mail_,mailto:_autre_adress_mail_si_on_veut_

Attention ici, il faut adapter suivant la situation:

  • v=DMARC1 <= vesion utilisée du protocol DMARC
  • p=none<= règle pour le domaine
  • pct=100<= 100% des mails du domaine sont concernés
  • rua<= où envoyer les rapports DMARC
  • sp<= procédure en cas d'échec: none, quarantine ou reject (pour les sous-domaine)
  • aspf<= Alignment SPF - mode de cohérence des noms de domaine pour SPF (s - pour strict ou r pour relaxed) - le From doit correpondre exactement au domaine, ou le domaine SPF peut être un sous-domaine du domaine
  • fo<= conditions pour l'envoi d'un rapport: 1 -> DKIM et/ou SPF, d -> DKIM, s -> SPF, 0 -> DKIM et SPF
Par la suite vous serez amener à adapter ces valeurs en fonction de la situation.

Pour vérifier que DMARC est bien en place:

# via dig editer domain.tld
dig txt +short _dmarc.domain.tld

> cela doit vous retourner votre DMARC

Vous pouvez également tester via mail-tester.

Analyser les rapports est difficile pour nous aider on peut utiliser le service de Postmark.

Ils fournissent des rapports plus lisisbles, merci XML.

Cela ne vous empêche pas de recevoir vous aussi les rapports en indiquant votre adresse mail séparé via une virgule.

Il faudra du temps et de la patience pour expertiser ces rapports et s'adapter.

Conclusion

Si en soit il n'y a rien de compliqué dans l'édition de fichiers pour configurer Postfix et Dovecot. En vrai, Postfix c'est deux fichiers principaux et Dovecot on a un peu plus mais moins d'une dizaine. Rien de bien méchant, mais il faut aussi, configurer PostfixAdmin, la base de données. Sans oublier d'implémenter les protocols SPF, DKIM et DMARC qui sont un minium. Aussi, il faut vérifier les différents ports en écoute, la propagation des DNS...

C'est bien cet ensemble d'éléments qui demande de la patience, une compréhension de l'imbrication des différents acteurs qui est complexe.

Surtout lors qu'un problème survient, il faut identifier à quel niveau ce situe le problème, client de messagerie, Postfix, Dovecot, la DB, une IP blacklistée? Quels paramètres, quel fichier est concerné?

C'est en forgeant qu'on devient forgeron... alors forger!

Bref, il reste encore des éléments à travailler, installer un web mail comme Roundcube, définir les règles de base pour le firewall, parler de la réputation et du problème où le courrier finit en spam.

La principale source de cet article: LinuxBabe - Build Email Server From Scratch on Debian - <= Merci