Envoyer des mails signĂ© avec Postfix ! đ§
Postfix est un logiciel de serveur de messagerie Ă©lectronique OpenSource. Il est utilisĂ© principalement pour le transfert d'e-mails sur Internet. Il fonctionne comme un agent de transfert de courrier (MTA), acheminant les e-mails entre les serveurs de messagerie. Postfix est conçu pour ĂȘtre rapide, sĂ©curisĂ© et modulaire, offrant une solution fiable pour la gestion du courrier Ă©lectronique. Il permet aux utilisateurs de configurer des serveurs de messagerie robustes, d'assurer la livraison efficace des e-mails et de mettre en Ćuvre des fonctionnalitĂ©s de sĂ©curitĂ© avancĂ©es telles que le filtrage anti-spam et la gestion des listes de diffusion. En rĂ©sumĂ©, Postfix facilite la gestion et le transfert des e-mails dans les environnements de serveurs de messagerie.
Dans cet article, nous allons voir comment configurer un serveur Postfix afin d'envoyer des mails de maniÚre sécurisé. Nous ne traiterons pas la reception de mail. Pour cela nous allons mettre en place plusieurs mécanisme de sécurité tels que DKIM/SPF/DMARC ...
C'est partie ! đ
Comme dans tout projet il y a des prérequis nécessaire ... Nous allons donc les lister:
- Avoir un serveur linux đ§ qui a accĂšs Ă internet (J'utilise dans cet article un Debian 12)
- Avoir un nom de domaine (Pour ma part inframinds.fr đ)
- Avoir une IP publique liée a votre serveur
Installation de Postfix
gael@lab-smtp-srv:~$ apt-get update && apt-get install postfix mailutils
Lors de l'installation de postfix, celui-ci va ouvrir un panneau interractif afin que vous puissiez faire une premiĂšre phase de configuration.
Voici les différents parametre à renseigner
- No configuration: Ne change rien Ă la configuration courrante.
- Internet Site: C'est le cas le plus commun qui permet d'avoir une partie de la configuration pour l'envoie de mails
- Internet with smarthost: J'ai absolument aucune idĂ©e de ce que ça fait đ
- Satellite system: Utilisation de Postfix en mode relay vers un autre serveur SMTP.
- Local only: Utile uniquement si l'on souhaite envoyer des mails dans aux utilisateur systĂšme via /var/spool/mail/.
Le mail name est votre nom de domaine, dans mon cas inframinds.fr
La premiÚre partie de la configuration Postfix est faite, maintenant, nous allons continuer cette configuration de maniÚre plus précise.
gael@lab-smtp-srv:~$ dpkg-reconfigure postfix
Cela va de nouveau ouvrir le panneau interactif de la configuration de Postfix, mais avec plus d'option Ă renseigner.
Les 2 premiers Ă©crans sont les mĂȘme que les prĂ©cĂ©dents avec les valeurs que vous avez dĂ©jĂ renseignĂ©e. Nous allons donc les valider afin d'arriver aux nouveaux Ă©crans:
Vous pouvez laisser ce champs vide, par défaut un alias postmaster enverra les mail vers root.
Dans cette section, on définie les domains auxquels Postfix décide de ne pas transférer les mails et de les garder pour lui. Nous ajouterons donc notre domaine dans cette liste inframinds.fr. Il se peut également que votre premiÚre entrée ne soit pas $myhostname mais le nom de votre hostname, cela n'a pas d'importance pour le moment, Postfix remplace cette variable par ça valeur lors du pré-remplissage.
Alors en lisant attentivement le message on se rend compte que c'est plus "safe" de l'activer, alors pourquoi s'en privĂ© đ Un mail est fait pour ĂȘtre lu en asynchrone, le temps d'envoi m'importe peu ..
Cette section permet de configurer la liste de nos réseaux pouvant envoyer des mails. Si vous allez contacter votre Postfix via un réseau privé, pensez à l'ajouter dans la liste (cf: 172.16.16.0/22 pour moi).
Comme son nom l'indique cette partie permet de mettre une sécurité dans la taille d'une boite mail. Dans notre cas, nous avons décidé de configurer Postfix pour uniquement envoyer des mails. On peut donc laisser la valeur par défaut sans risque (illimité).
Le dĂ©limiteur, permet d'avoir plusieurs e-mail virtuelle qui pointe sur la mĂȘme adresse, par exemple: tom+inframinds@gmail.com renverra les mails sur votre boite tom@gmail.com. Cela peut permettre Ă©galement de connaitre la source de l'email si vous vous ĂȘtes enregistrer avec une adresse en +.
Bref, dans notre cas cela n'est pas nécessaire car comme nous l'avons dit précédemment, nous ne faisons pas de réception de mail ! On laissera donc la valeur par défaut.
Ici nous allons choisir le protocol sur lequel notre service Postfix va écouter ! Pour ma part, je n'ai pas encore passé le cap de l'IPv6 (Comme plein de monde malheureusement). Donc je vais choisir uniquement IPv4.
C'Ă©tait la derniĂšre Ă©tape de la configuration avec le mode "Interactif". Maintenant, il nous reste Ă modifier le fichier de configuration.
Editer le fichier /etc/postfix/main.cf et modifier/ajouté les lignes suivantes:
# Donner le nom de votre enregistrement DNS et non celui de votre machine
myhostname=smtp.inframinds.fr
# On écoute uniquement sur les IP internes pour plus de sécurité
inet_interfaces = 127.0.0.1, 172.16.16.2
On relance le service Postfix & on regarde si celui-ci est bien UP et Ă©coute sur les bonnes interfaces.
# Relance du service Postfix
gael@lab-smtp-srv:~$ sudo systemctl restart postfix
# On regarde si la relance a bien fonctionnée
gael@lab-smtp-srv:~$ sudo systemctl status postfix
â postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/lib/systemd/system/postfix.service; enabled; preset: enabled)
Active: active (exited) since Thu 2023-12-21 10:40:00 UTC; 2h 32min ago
Docs: man:postfix(1)
Process: 1893 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 1893 (code=exited, status=0/SUCCESS)
CPU: 1ms
Dec 21 10:40:00 lab-smtp-srv systemd[1]: Starting postfix.service - Postfix Mail Transport Agent...
Dec 21 10:40:00 lab-smtp-srv systemd[1]: Finished postfix.service - Postfix Mail Transport Agent.
# On regarde si le service Ă©coute bien sur les bonnes IP/port
gael@lab-smtp-srv:~$ sudo ss -lputen | grep postfix
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=1890,fd=13)) ino:20866 sk:10 cgroup:/system.slice/system-postfix.slice/postfix@-.service <->
tcp LISTEN 0 100 172.16.16.2:25 0.0.0.0:* users:(("master",pid=1890,fd=14)) ino:20867 sk:11 cgroup:/system.slice/system-postfix.slice/postfix@-.service <->
C'est bon đ on a notre service postfix Up et bien configurĂ© đ. Bon actuellement on pourrait s'en servir en interne, mais si l'on veut envoyer un mail sur une boite externe Google ou autre il va falloir ajoutĂ© de la sĂ©curitĂ© pour prouvĂ© que notre mail est lĂ©gitime...
Si vous me croyez pas vous n'avez cas essayer đ
# Envoie d'un email via la CLI sur mon gmail perso
gael@lab-smtp-srv:~$ echo "This is the body of the email" | mail -s "Test sans SPF" -a "From: Someone <gael@inframinds.fr>" mon_adresse_perso@gmail.com
# Si vous vĂ©rifier sur google, vous n'avez rien reçu mĂȘme dans les Spam ...
# Si vous vérifier dans les logs de Postfix..
gael@lab-smtp-srv:~$ sudo cat /var/log/mail.log | grep SPF
2023-12-18T13:42:39.229504+00:00 lab-smtp-srv postfix/smtp[52395]: D8C344D4B9: to=<xxx@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.71.26]:25, delay=0.35, delays=0.1/0/0.09/0.16, dsn=5.7.26, status=bounced (host gmail-smtp-in.l.google.com[74.125.71.26] said: 550-5.7.26 This mail has been blocked because the sender is unauthenticated. 550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM. 550-5.7.26 550-5.7.26 Authentication results: 550-5.7.26 DKIM = did not pass 550-5.7.26 SPF [lab-smtp-srv] with ip: [163.172.187.243] = did not 550-5.7.26 pass 550-5.7.26 550-5.7.26 For instructions on setting up authentication, go to 550 5.7.26 https://support.google.com/mail/answer/81126#authentication fa18-20020a05600c519200b0040c37ebc73bsi11179202wmb.168 - gsmtp (in reply to end of DATA command))
Configuration du SPF
Le SPF (Sender Policy Framework) est une norme de validation des e-mails conçue pour prĂ©venir la falsification de l'expĂ©diteur dans les messages Ă©lectroniques. Il fonctionne en spĂ©cifiant les serveurs de messagerie autorisĂ©s Ă envoyer des e-mails au nom d'un domaine spĂ©cifique. Lorsqu'un serveur de messagerie reçoit un e-mail, il vĂ©rifie si l'adresse IP de l'expĂ©diteur est autorisĂ©e par le SPF du domaine indiquĂ©. Si c'est le cas, le message est considĂ©rĂ© comme lĂ©gitime, sinon, il peut ĂȘtre marquĂ© comme potentiellement frauduleux.
Comme expliqué au dessus, le SPF permet via des enregistrements DNS de déclarer les serveurs "autorisé" a délivrer des mails pour un domaine. La configuration va donc ce faire au niveau des enregistrements DNS.
Il s'agit d'un record DNS de type TXT, vous pouvez utiliser des outils tel que https://easydmarc.com/tools/spf-record-generator afin de générer le contenu de ce champs
Nous déclarons l'IPs autorisé à envoyer des mails. Dans notre cas nous pouvons utilisé ip4 avec notre ip publique. Le champs policy donne une directive en cas de conformité du SPF (Dans la plupart des cas le message vas dans les SPAM). Le résultat donne un enregistrement du type:
v=spf1 ip4:<publiqueIP> -all
Avec cette enregistrement, il suffira d'ajouter une entré TXT dans votre DNS (Gandi, Godaddy, 1&1, Scaleway, OVH ...) en spécifiant la valeur généré juste avant.
Vous pouvez vĂ©rifier si votre enregistrement est correct Ă©galement avec le mĂȘme site https://easydmarc.com/tools/spf-lookup?domain=votredomaine.fr vous devriez avoir un status Ă valide â avec la liste des IP autorisĂ©es a envoyer des mails pour votre domaine.
Maintenant il reste a vĂ©rifier si votre mail arrive enfin chez google... Nous allons faire le mĂȘme test que prĂ©cĂ©demment
# Envoie d'un email via la CLI sur mon gmail perso
gael@lab-smtp-srv:~$ echo "This is the body of the email" | mail -s "Test avec SPF" -a "From: Someone <gael@inframinds.fr>" mon_adresse_perso@gmail.com
Et đ on a bien un mail dans les SPAM avec un SPF qui PASS (vous pouvez voir cela en cliquant sur le mail puis les ... puis afficher l'original)
Afin de rendre notre message moins "suspicieux". Nous pouvons encore rajouter une couche de sécurité, pourquoi pas du DKIM ..
Configuration du DKIM
Le DKIM (DomainKeys Identified Mail) est une technique d'authentification des e-mails qui vise Ă garantir l'intĂ©gritĂ© et l'origine lĂ©gitime des messages Ă©lectroniques. Lorsqu'un expĂ©diteur utilise DKIM, une signature cryptographique est ajoutĂ©e Ă l'en-tĂȘte de l'e-mail. Cette signature est gĂ©nĂ©rĂ©e Ă l'aide d'une clĂ© privĂ©e dĂ©tenue par l'expĂ©diteur.
Lorsque le serveur de messagerie du destinataire reçoit le message, il peut utiliser la clé publique du DKIM, publiée dans le DNS (Domain Name System) du domaine de l'expéditeur, pour vérifier la signature. Si la signature est valide, cela indique que le message n'a pas été altéré en transit et qu'il provient réellement du domaine indiqué.
Pour ce faire, il faudra lié notre Postfix a un autre service qui va géré la partie signature avec une clé privée -> Opendkim et ajouté un enregistrement dans notre DNS.
# Installation des packets pour faire du dkim
gael@lab-smtp-srv:~$ sudo apt-get install opendkim opendkim-tools
# Création des répertoires de travail
gael@lab-smtp-srv:~$ sudo mkdir -p /var/spool/postfix/opendkim/
gael@lab-smtp-srv:~$ sudo chown -R opendkim: /var/spool/postfix/opendkim/
gael@lab-smtp-srv:~$ sudo mkdir -p /etc/opendkim/
# Il faut donner Ă Postfix les permissions de communiquer avec opendkim
gael@lab-smtp-srv:~$ sudo adduser postfix opendkim
Il faut maintenant commencer la configuration d'opendkim, pour cela Ă©diter le fichier /etc/opendkim.conf
Commenter la ligne
#Socket local:/run/opendkim/opendkim.sock
DĂ©commenter la ligne afin que postfix qui est chroot puisse avoir accĂšs au socket de opendkim
Socket local:/var/spool/postfix/opendkim/opendkim.sock
DĂ©commenter Ă©galement Mode sv afin de permettre Ă Opendkim de faire de la signature et de la validation.
Mode sv
Et ajouter les lignes suivantes Ă la fin du fichier de configuration
# Keytable permet de Mapper les clé privée avec les domaines
KeyTable /etc/opendkim/KeyTable
# Signingtable permet de definir avec quel clée quel adresse doit utilisé
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts
Les 3 fichiers suivant n'existent pas pour le moment, il va falloir les créer.
/etc/opendkim/KeyTable
default._domainkey.inframinds.fr inframinds.fr:default:/etc/opendkim/default.private
- default est notre selector
- inframinds notre domaine
- /etc/opendkim/default.private l'emplacement de notre clé privée
/etc/opendkim/SigningTable
*@inframinds.fr default._domainkey.inframinds.fr
- *@inframinds.fr signifie que toute les adresses mail vont utilisé le domaine default._domainkey.inframinds.fr
/etc/opendkim/TrustedHosts
127.0.0.1
::1
*.inframinds.fr
localhost
172.16.16.0/22
Une fois ces 3 fichiers de configuration créés, il faudra généré la clé privée que l'on utilisera pour signer nos mails. Opendkim fourni un utilitaire pour cela
# On donne en parametre, la longeur de la clé 2048, notre domaine, le dossier ou l'on veut écrire la clé ainsi que le selector choisi
gael@lab-smtp-srv:~$ sudo opendkim-genkey -b 2048 -d inframinds.fr -D /etc/opendkim/ -s default -v
# Donner les bonnes permissions au dossier
gael@lab-smtp-srv:~$ sudo chown -R opendkim:opendkim /etc/opendkim/
Cette commande gĂ©nĂšre 2 fichier, /etc/opendkim/default.private et /etc/opendkim/default.txt le premier contient la clĂ© privĂ©, le second l'enregistrement DNS Ă ajouter chez votre fournisseur DNS. Il s'agit d'un record TXT qui doit avoir pour domaine <selector>._domainkey.votredomaine.fr (pour nous default._domainkey.inframinds.fr) le contenu de celui-ci doit ĂȘtre
v=DKIM1; h=sha256; k=rsa; p=<Votre clé RSA>
L'output du fichier domain.txt est sur plusieurs ligne avec des guillemets si l'on utilise une clé de 2048. Il faudra tout mettre sur une ligne et coller les 2 parties de votre clé RSA dans l'enregistrement pour en faire une seule.
v=DKIM1; h=sha256; k=rsa; p=<Votre_clé_rsa_par1><Votre_clé_rsa_par2>
Une fois l'enregistrement DNS fait, vous pouvez vérifier que celui-ci est fonctionnel via la commande suivante
gael@lab-smtp-srv:~$ sudo opendkim-testkey -d inframinds.fr -s default -k /etc/opendkim/default.private -v
opendkim-testkey: key not secure # Ce message la est normal :)
OpenDKIM est officiellement configuré, vous devez donc le redémarrer pour prendre en compte tout nos changements
gael@lab-smtp-srv:~$ sudo systemctl restart opendkim
Il nous reste à lier OpenDKIM et Postfix. Pour cela rien de plus simple, il suffit d'ajouté ces 4 lignes de configurations à notre service Postfix /etc/postfix/main.cf et à le relancer
milter_protocol = 6
milter_default_action = accept
smtpd_milters = unix:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
systemctl restart postfix
Aller ! C'est le moment de tester si notre configuration fonctionne sur notre compte google đ€
# Envoie d'un email via la CLI sur mon gmail perso
gael@lab-smtp-srv:~$ echo "This is the body of the email" | mail -s "Test avec DKIM" -a "From: Someone <gael@inframinds.fr>" mon_adresse_perso@gmail.com
đ On voit bien le champ DKIM dans notre mail (qui est toujours dans les SPAM car l'on utilise la CLI et que aucun formatage du mail n'est fait .. ).
Il reste une derniĂšre Ă©tape pour avoir un serveur mail parfait qui est le DMARC, celui-ci sera notre Ă©tape final !
Configuration du DMARC
DMARC (Domain-based Message Authentication, Reporting, and Conformance) est une norme de sĂ©curitĂ© des e-mails qui renforce l'authentification des messages Ă©lectroniques. Elle utilise SPF (Sender Policy Framework) et DKIM (DomainKeys Identified Mail) pour vĂ©rifier l'authenticitĂ© des expĂ©diteurs. DMARC permet aux propriĂ©taires de domaines de spĂ©cifier comment les messages non authentifiĂ©s doivent ĂȘtre traitĂ©s.
Il s'agit pour résumer de donner une instruction si le SPF ou le DKIM sont faux. Cela ce fait au niveau du DNS ou il faudra ajouter une entrée TXT
_dmarc.inframinds.fr
Type : TXT
v=DMARC1; p=reject;
La configuration au dessus est la plus basique et la plus strict, il est possible aussi de ce servir de DMARC pour recevoir un rapport des IP/Serveurs qui envoie des mail avec votre domaine en configurant un rua.
Let's try it
# Envoie d'un email via la CLI sur mon gmail perso
gael@lab-smtp-srv:~$ echo "This is the body of the email" | mail -s "Test avec DMARC" -a "From: Someone <gael@inframinds.fr>" mon_adresse_perso@gmail.com
On voit notre champ DMARC đș
Durant cette article je viens de m'apercevoir qu'il existe Ă©galement un nouveau standard pour renforcer notre identification. Il s'agit de đ„ .......
Bimi ! Voyons comment l'on peut configurer cela
Configuration de BIMI
(SPOILER ALERT đš: ça ne fonctionne pas sans certificat đ°)
BIMI est une initiative visant à renforcer la confiance des destinataires en affichant visuellement les logos des marques dans les boßtes de réception, contribuant ainsi à réduire les risques de phishing en permettant aux utilisateurs de mieux distinguer les e-mails légitimes des e-mails malveillants.
Pour pouvoir utilisĂ© BIMI il faut configurer SPF/DKIM et DMARC, ça tombe bien nous venons de faire ça juste avant đ
Actuellement BIMI n'est pas supporter par tout les fournisseurs de messagerie (notamment Microsoft ...)
Pour le mettre en place, il suffit juste d'ajouter un record du type suivant avec un logo au format svg. Attention, le logo doit avoir des spĂ©cificitĂ© ... J'ai utilisĂ© https://easydmarc.com/tools/bimi-logo-converter pour gĂ©nĂ©rĂ© le miens avec la bonne version et les bonnes en-tĂȘte.
default._bimi IN TXT "v=BIMI1; l=https://inframinds.fr/content/images/2023/12/logo.svg"
Puis tester avec un mail qui va pas dans les SPAM ... (Dans mon cas je vais le faire avec le mail de registration Ă mon blog Ghost)
Bon alors ... Il semblerai qu'il faille également acheter un certificat VMC pour que ça fonctionne afin d'éviter les usurpations de logo ce qui est logique en soit. Je ne compte pas en acheter un pour le moment, on verra par la suite...
Score de notre serveur mail
MĂȘme si la mise en place de BIMI n'est pas effective, notre serveur SMTP doit ĂȘtre bien configurer !
Mais avant de lancer ce test, il reste deux Ă©tapes que vous n'avez surement pas fait đ. La configuration de votre reverse DNS sur l'IP de votre domaine du serveur mail ainsi que la crĂ©ation d'un champ MX.
La configuration du DNS permet de liĂ© un domaine Ă une IP (smtp.inframinds.fr) dans notre cas. Mais il est recommender Ă©galement de faire la rĂ©ciproque c-a-d configurer le reverse de l'ip pour le faire pointĂ© sur le mĂȘme nom de domaine.
Vous pouvez voir si c'est bien fait en lançant la commande
gael@lab-smtp-srv:~$ dig -x <votre_ip_publique> +short
smtp.inframinds.fr.
Cela doit vous retourner votre nom de domaine.
Pour la partie configuration du champs MX, dans notre article nous avons choisi de ne pas configurer de serveur Mail entrant. Mais il faut quand mĂȘme crĂ©er une entrĂ©e afin que tout le monde đ soit au courant.
Pour cela, il suffit d'ajouter un champs de type MX dans votre DNS avec pour valeur un point '.'
Une fois cela fais, vous pouvez tester que la configuration est bien prise en compte avec la commande:
gael@lab-smtp-srv:~$ dig +short MX inframinds.fr
0 .
Maintenant on peut tester la configuration de votre serveur mail grùce à l'outil https://www.mail-tester.com/ . Celui ci vous permet de lui envoyer un mail a une adresse spécifique et il va vous générer un rapport sur votre configuration.
# Envoie d'un email via la CLI sur mail-tester.com
gael@lab-smtp-srv:~$ echo "This is the body of the email" | mail -s "Test avec DMARC" -a "From: Someone <gael@inframinds.fr>" test-xyzzaede@srv1.mail-tester.com
Et voila ! đ Nous avons un beau score de 10/10 avec une amĂ©lioration sur le contenu du message (normal avec l'envoi en CLI)