Aller au contenu

Architecture de référence messagerie

Vue d'ensemble

L'architecture cible repose sur Stalwart Mail Server comme composant central, avec un reverse proxy TLS en frontal, un backend d'authentification LDAP/OIDC et un DNS correctement configure.

graph TD
    subgraph Internet["Internet / DMZ"]
        Exp["Expediteurs externes"]
        Clients["Clients email<br/>(Thunderbird, etc.)"]
        Web["Clients web<br/>(navigateur)"]
    end
    Exp -->|SMTP:25| Proxy
    Clients -->|IMAP:993 / JMAP:443| Proxy
    Web -->|HTTPS:443| Proxy
    Proxy["Reverse Proxy (Caddy / Nginx)<br/>Terminaison TLS, Let's Encrypt<br/>mail.company.io"]
    Proxy -->|SMTP:25| Stalwart
    Proxy -->|IMAP:993 / JMAP:8080| Stalwart
    Proxy -->|HTTPS:8080 admin UI| Stalwart
    subgraph Stalwart["Stalwart Mail Server"]
        SMTP["SMTP<br/>MTA/MDA"]
        IMAP["IMAP<br/>serveur"]
        JMAP["JMAP<br/>serveur"]
        CalDAV["CalDAV<br/>CardDAV"]
        subgraph Core["Core Engine"]
            AntiSpam["Anti-spam"]
            DKIM["DKIM<br/>SPF/DMARC"]
            Sieve["Sieve<br/>filtres"]
            Queue["Queue<br/>manager"]
        end
        Storage["Storage Layer<br/>RocksDB | PostgreSQL | S3"]
    end
    Stalwart --> Keycloak["Keycloak<br/>LDAP/OIDC"]
    Stalwart --> DNS["CoreDNS<br/>MX/SPF/DKIM/DMARC"]
    Stalwart --> Monitoring["Prometheus<br/>+ Grafana"]

Composants Stalwart

Binaire unique, multi-protocoles

Stalwart est compile en un seul binaire Rust qui expose tous les protocoles nécessaires :

Protocole Port par defaut Usage
SMTP 25 Reception des emails entrants
SMTP soumission 587 (STARTTLS), 465 (TLS implicite) Envoi des emails par les clients
IMAP 993 (TLS), 143 (STARTTLS) Consultation des boites aux lettres
JMAP 8080 (HTTP) Consultation moderne (HTTP/JSON)
ManageSieve 4190 Gestion des filtres Sieve
CalDAV/CardDAV 8080 (HTTP) Calendriers et contacts
Admin API 8080 (HTTP) Administration REST + Web UI

Moteur anti-spam integre

Stalwart integre un filtre anti-spam compatible avec les regles rspamd. Il effectue les verifications suivantes a la reception de chaque email :

  1. Vérification SPF : l'IP de l'expéditeur est-elle autorisee ?
  2. Vérification DKIM : la signature cryptographique est-elle valide ?
  3. Vérification DMARC : SPF et/ou DKIM sont-ils alignes avec le domaine From ?
  4. ARC : si l'email a ete relaye, la chaîne ARC est-elle valide ?
  5. DNS blocklists : l'IP de l'expéditeur est-elle listee dans des RBL ?
  6. Analyse du contenu : scoring bayesien, patterns de spam
  7. Rate limiting : limitation du débit par expéditeur

Couche de stockage

Stalwart supporte plusieurs backends de stockage, choisis en fonction du volume :

Backend Cas d'usage Données stockees Performance
RocksDB < 500 boites, déploiement simple Tout (index + blobs) Tres elevee (local)
PostgreSQL > 500 boites, HA Index, metadonnees Elevee
MySQL Existant MySQL Index, metadonnees Elevee
S3 Stockage blob deporte Corps des emails, pieces jointes Variable (réseau)
SQLite Développement, test Tout (fichier unique) Moyenne

Combinaison recommandee pour la production

Pour un déploiement de production avec HA : PostgreSQL pour les index et metadonnees + S3 (MinIO auto-heberge) pour les blobs (corps des emails et pieces jointes). RocksDB pour les déploiements simples < 500 boites.

Configuration DNS pour la messagerie

Ensemble complet des enregistrements

Un domaine de messagerie correctement configure necessite les enregistrements DNS suivants :

; === Enregistrements MX ===
company.io.    300  IN  MX  10  mail.company.io.
company.io.    300  IN  MX  20  mail-backup.company.io.

; === Enregistrements A/AAAA du serveur mail ===
mail.company.io.         300  IN  A     203.0.113.10
mail.company.io.         300  IN  AAAA  2001:db8::10
mail-backup.company.io.  300  IN  A     203.0.113.11

; === SPF — IP autorisees a envoyer ===
company.io.  300  IN  TXT  "v=spf1 mx a:mail.company.io -all"

; === DKIM — cle publique de signature ===
default._domainkey.company.io.  300  IN  TXT  (
    "v=DKIM1; k=ed25519; p=<base64-public-key>"
)

; === DMARC — politique d'authentification ===
_dmarc.company.io.  300  IN  TXT  (
    "v=DMARC1; p=reject; "
    "rua=mailto:dmarc-reports@company.io; "
    "ruf=mailto:dmarc-forensic@company.io; "
    "adkim=s; aspf=s; pct=100"
)

; === MTA-STS — forcer TLS pour les connexions SMTP entrantes ===
_mta-sts.company.io.     300  IN  TXT  "v=STSv1; id=20260416"
mta-sts.company.io.      300  IN  A    203.0.113.10

; === TLSRPT — rapports TLS ===
_smtp._tls.company.io.   300  IN  TXT  (
    "v=TLSRPTv1; rua=mailto:tls-reports@company.io"
)

; === Autoconfig / Autodiscover ===
autoconfig.company.io.   300  IN  CNAME  mail.company.io.
_autodiscover._tcp.company.io.  300  IN  SRV  0 0 443 mail.company.io.

; === Reverse DNS (PTR) — critique pour la deliverabilite ===
; Configure chez le fournisseur d'hebergement/IP
10.113.0.203.in-addr.arpa.  300  IN  PTR  mail.company.io.

Vérification des enregistrements

# Verifier MX
dig company.io MX +short
# Attendu : 10 mail.company.io.

# Verifier SPF
dig company.io TXT +short | grep spf
# Attendu : "v=spf1 mx a:mail.company.io -all"

# Verifier DKIM
dig default._domainkey.company.io TXT +short
# Attendu : "v=DKIM1; k=ed25519; p=..."

# Verifier DMARC
dig _dmarc.company.io TXT +short
# Attendu : "v=DMARC1; p=reject; ..."

# Verifier reverse DNS
dig -x 203.0.113.10 +short
# Attendu : mail.company.io.

Reverse proxy et terminaison TLS

Pourquoi un reverse proxy ?

Le reverse proxy assure la terminaison TLS et la distribution du trafic vers Stalwart :

Flux Port entrant Reverse proxy Port Stalwart
SMTP entrant 25 Pass-through 25
SMTP soumission TLS 465 Pass-through 465
SMTP soumission START 587 Pass-through 587
IMAP TLS 993 Pass-through 993
JMAP / Admin / CalDAV 443 TLS → HTTP 8080

TLS pour les protocoles mail

Pour SMTP et IMAP, le reverse proxy fonctionne en TCP pass-through (layer 4) car Stalwart gère lui-même le TLS pour ces protocoles. Seul le trafic HTTP (JMAP, CalDAV, Admin) est termine par le reverse proxy.

Configuration Caddy

# Caddyfile
mail.company.io {
    # JMAP, CalDAV/CardDAV, Admin UI
    reverse_proxy localhost:8080
}

Pour les protocoles mail (SMTP, IMAP), utiliser un load balancer TCP (HAProxy, Caddy L4) ou exposer directement les ports de Stalwart.

Dimensionnement

Guide de sizing

Profil Utilisateurs CPU RAM Stockage Backend
Petit (startup) 1-50 2 vCPU 2 Go 50 Go SSD RocksDB
Moyen (PME) 50-500 4 vCPU 4 Go 200 Go SSD RocksDB
Grand (entreprise) 500-5000 8 vCPU 8 Go 1 To SSD PostgreSQL + S3
Tres grand (multi-site) 5000+ 16+ vCPU 16+ Go S3 illimité PostgreSQL + S3 + clustering

Estimation du stockage

Facteur Valeur typique
Taille moyenne d'un email 75 Ko (sans pieces jointes)
Avec pieces jointes 500 Ko en moyenne
Emails reçus par jour 50-100 par utilisateur
Croissance annuelle ~15-20 Go par utilisateur
Retention typique 3-7 ans (selon politique)
# Estimation pour 200 utilisateurs, 5 ans de retention
200 users x 17.5 Go/an x 5 ans = 17.5 To
+ 30% overhead (index, logs) = ~23 To

Prevoir la croissance

Le stockage email croit lineairement et ne diminue jamais (sauf politique de retention active). Prevoir 2x le volume estime pour absorber les pics et les imprevisibles (migrations, archives).

Flux réseau

Ports a ouvrir

Source Destination Port Protocole Direction Remarque
Internet Reverse proxy 25/TCP SMTP Entrant Reception des emails
Internet Reverse proxy 443/TCP HTTPS Entrant JMAP, CalDAV, Admin
Réseau interne Stalwart 993/TCP IMAPS Entrant Consultation des boites
Réseau interne Stalwart 465/TCP SMTPS Entrant Soumission des emails
Réseau interne Stalwart 587/TCP SMTP+STARTTLS Entrant Soumission (legacy)
Réseau interne Stalwart 4190/TCP ManageSieve Entrant Gestion des filtres
Stalwart Internet 25/TCP SMTP Sortant Livraison des emails
Stalwart Keycloak 443/TCP HTTPS Sortant Authentification OIDC/LDAP
Stalwart CoreDNS 53/UDP DNS Sortant Résolution MX, SPF, DKIM
Stalwart PostgreSQL 5432/TCP PostgreSQL Sortant Stockage (si externe)
Stalwart MinIO (S3) 9000/TCP HTTPS Sortant Stockage blobs (si S3)
Prometheus Stalwart 8080/TCP HTTP Entrant Collecte des metriques

Zones réseau

graph LR
    subgraph DMZ
        Proxy["Reverse proxy<br/>(SMTP in, HTTPS)"]
    end
    subgraph Interne["Reseau interne"]
        Stalwart["Stalwart<br/>(tous ports)"]
        Services["Keycloak,<br/>PostgreSQL,<br/>CoreDNS"]
        Stalwart --> Services
    end
    Proxy --> Stalwart

SMTP entrant en DMZ uniquement

Le port 25 entrant (reception des emails depuis Internet) doit etre expose exclusivement dans la DMZ via le reverse proxy. Les clients internes utilisent les ports 465/587 pour la soumission, jamais le port 25 directement.

Synthese

L'architecture Stalwart se distingue par sa simplicité : un seul binaire qui expose SMTP, IMAP, JMAP, CalDAV et l'administration. Le reverse proxy assure la terminaison TLS pour le trafic HTTP, tandis que Stalwart gère lui-même le TLS pour les protocoles mail. Le dimensionnement depend principalement du nombre d'utilisateurs et de la politique de retention. Le chapitre suivant detaille l'installation et la configuration.