Le but du MTA-STS est de ne pas faire confiance et augmenter sa résilience au détournement de dns. Le serveur de mail du destinataire sait qu’il doit interroger un sous-domaine précis avec une arborescence bien définie : https://mta-sts.[votre-domaine.net]/.well-known/mta-sts.txt. Cela joue un rôle important pour la sécurité mail.

Création du fichier mta-sts

La première chose à faire est de récupérer vos champs MX, pour cela :

dig @1.1.1.1 -t mx monlinux.net

Prenez la réponse, ici mta-gw.infomaniak.ch

monlinux.net.           300     IN      MX      5 mta-gw.infomaniak.ch.

Ensuite créer le fichier mta-sts.txt en format UTF8 linux avec les données suivantes, si vous avez plusieurs entrées mx, ajouter autant de ligne « mx: votre-2e-serveur" que nécessaire :

version: STSv1
mode: testing
mx: mta-gw.infomaniak.ch
max_age: 2592000
  • la version est actuellement STSv1
  • le mode testing permet à des serveurs non encore prêts de communiquer avec vous, il est possible d’être strict en utilisant le mode enforce pour que seuls des serveurs supportant TLS n’échange avec vos serveurs mails
  • max_age est le temps en secondes de validité de l’autorisation. Au début partez sur 1h et une fois tout en place, vous pouvez mettre 1jour ou 1 mois si vous ne changez pas vos MX souvent.

Un article complet avec des détail sur dmarcadvisor en parle.

Création du docker

Le plus light étant de faire un container docker sur votre serveur ou votre cluster. Voici un exemple pour un docker simple avec nginx derrière un reverse proxy Traefik. Ce nginx est donc configuré en http étant donné que c’est Traefik qui gère la partie TLS HTTPS.

Créé l’arborescence nécessaire :

mkdir -p mta-sts.monlinux.net/src/.well-known
cd mta-sts.monlinux.net
vim src/.well-known/mta-sts.txt
vim docker-compose.yml

Le contenu du fichier docker-compose.yml :

Suite à mon article sur Traefik, je rappelle que le réseau partagé pour toutes les applications webs externes sont sur proxy-net. Sans cluster, je lui donne un nom et une limite de mémoire et ensuite des règles Traefik avec le resolver let’s encrypt.

version: '3.7'

networks:
  proxy-net:
    external: true

services:
  nginx:
    image: nginx:latest
    mem_limit: 100m
    container_name: mta_sts_monlinux
    networks:
      - proxy-net
    labels:
        - traefik.enable=true
        - "traefik.http.routers.mta_sts_monlinux.rule=Host(`mta-sts.monlinux.net`)"
        - traefik.http.routers.mta_sts_monlinux.tls.certresolver=le
        - traefik.http.routers.mta_sts_monlinux.entrypoints=websecure
        - traefik.frontend.passHostHeader=true
    volumes:
      - ./src:/usr/share/nginx/html
    restart: unless-stopped

Création des noms de domaine

Ne pas oublier de créer le domaine mta-sts.monlinux.net et de faire pointer sur votre Traefik ou autre hébergement web.

Ensuite il faut tester l’accessibilité via curl :

$ curl https://mta-sts.monlinux.net/.well-known/mta-sts.txt
version: STSv1
mode: testing
mx: mta-gw.infomaniak.ch
max_age: 2592000

Maintenant il faut créer un record DNS de type TXT « _mta-sts.monlinux.net » avec comme valeur la version et un id unique qui s’incrémentera au moment d’un changement de politique. Personnellement je prend le même format que pour les dns, la date et 2 chiffres YYYYMMDDNN. Dans mon cas la valeur sera « v=STSv1;id=2024050601;« 

Vérification du champ mta-sts

Vérifiez que tout est correcte avec votre outil favori. Dans mon cas, j’utilise mxtoolbox. Vous mettrez votre domaine et vous choisissez le type « MTA-STS Lookup« 
Vous aurez droit à un rapport complet sur votre champ dns, le contenu de votre fichier et les vérifications des serveurs MX présents.

Voici l’exemple sur mon domaine :

Summary
Se protéger du spoof DNS avec MTA-STS
Article Name
Se protéger du spoof DNS avec MTA-STS
Description
Méthode simple pour mettre en place le MTA-STS afin d'augmenter la sécurité mail et se protéger d'un éventuel spoof DNS
Author