The Daily Shaarli
Sur mes infrastructures persos, j'essaye de diversifier les implémentations d'un même service. J'ai Apache httpd et nginx, BIND et nsd, etc. Objectifs : résilience et compétence.
Pour mes courriels, ce n'est pas vrai, j'utilise uniquement postfix (MTA), dovecot (IMAP et, sur un seul de mes domaines, MDA + Sieve), saslauthd (authentification SASL), et OpenDKIM (signature et vérification DKIM). Récemment, sur l'un de mes domaines, je suis passé de saslauthd à dovecot pour l'auth SASL.
J'utilisais policyd-spf-perl pour vérifier SPF, mais, en cas d'erreur dans la résolution de noms, ça rejette des expéditeurs légitimes dès la phase EHLO d'une transactions SMTP, et il n'est pas possible de débrayer cela. Il y a longtemps, sur l'un de mes domaines, j'utilisais procmail comme MDA et langage de filtre, mais la syntaxe est reloue et je n'ai pas besoin d'un filtrage poussé, donc je l'ai viré (postfix est MTA et MDA).
Sur l'un de mes domaines, j'ai décidé de remplacer Postfix par OpenSMTPD, sans d'autres motivations que les objectifs sus-mentionnés.
Pour ce faire, il y a le très complet tuto de Solène. Pour la signature DKIM, on peut utiliser dkimsign plutôt que rspamd. Pour la syntaxe des filtres, notamment pour FCrDNS, c'est ici. Comme pour les autres produits OpenBSD, les autres réponses sont dans le manuel.
Sur un système Debian, les paquets postfix et opensmtpd sont mutuellement exclusifs, mais la suppression de postfix ne purge pas sa configuration.
Pour inspiration, voici mon /etc/smtpd.conf :
# Taille max d'un courriel. Par défaut : 35M.
smtp max-message-size 15M
# Emplacement certifs et clé x509, et ré-activation de l'échange de clé DHE
pki "example.com" cert "/chemin/vers/chaîne/certificats.pem"
pki "example.com" key "/chemin/vers/clé/privée.pem"
pki "example.com" dhe auto
# Emplacement des alias
table aliases file:/etc/aliases
# Définition des filtres
filter "dkimsign" proc-exec "filter-dkimsign -d example.com -s <SELECTEUR> -k /chemin/vers/clé/privée/dkim.pem" user _dkimsign group _dkimsign
filter "check_FCrDNS" phase connect match !fcrdns disconnect "450 No FCrDNS"
filter "check_sender_isFQDN" phase mail-from match !mail-from regex ".+@.+" disconnect "500 FQDN required"
filter "check_sender_notMe" phase mail-from match mail-from regex ".+@example.com$" disconnect "550 Wrong domain"
# Écoute
listen on eth0 port 25 tls pki "example.com" filter { "check_FCrDNS", "check_sender_isFQDN", "check_sender_notMe" }
listen on eth0 port 587 tls-require pki "example.com" auth mask-src filter "dkimsign"
# listen on socket filter "dkimsign"
# actions possibles
action "local" maildir alias <aliases>
# action "local" mda "/usr/lib/dovecot/dovecot-lda -f %{sender} -a %{dest} -d %{user.username}" alias <aliases>
action "smtp" relay
# en entrée
match from any for domain "example.com" action "local"
match from local for local action "local"
# en sortie
match from mail-from spam@example.com auth tartempion for any action "smtp"
#match from local for any action "smtp"
Commentaires :
filter-dkimsign est dans le paquet logiciel opensmtpd-filter-dkimsign ;
Voyons les différences avec Postfix.
Avec Postfix, je passe beaucoup de temps à définir la configuration TLS. OpenSMTPD se repose sur la libtls (libressl) qui prend en charge uniquement les versions 1.2 et 1.3 (source). De même, par défaut, les suites cryptographiques sont uniquement les suites AEAD de TLS 1.3 et 1.2 (sources : 1, 2, 3). Ça s'applique au serveur et au client SMTP. Depuis sa version 3 (empaquetée dans Debian 12), OpenSSL désactive aussi TLS < 1.2 au niveau du système, donc c'est cohérent, même si ça augmente la probabilité de courriels livrés en clair à cause d'exigences TLS trop élevées…
OpenSMTPD ne prend pas en charge le pipeling, donc pas de vulnérabilité SMTP smuggling à contrer. Idem pour l'absence de prise en charge de la commande VRFY et de l'exigence qu'un client se présente avec la commande EHLO (ou HELO) avant toute autre chose : c'est natif.
J'utilise OpenDKIM également pour vérifier la signature des courriels entrants. OpenSMTPD délègue aussi cela (mais, a priori, la syntaxe des échanges n'est pas la même, donc un programme pour Postfix ne fonctionne pas directement avec OpenSMTPD). Soit à rspamd, soit à un programme dédié. Pareil pour la vérification SPF. Au final, je ne regarde pas le résultat de ces validations, donc je décide de ne rien mettre en œuvre.
Avec Postfix, j'utilise « header_checks » et « body_checks » pour filtrer sommairement le spam. Cela me suffit. Il n'y a pas d'équivalent avec opensmtpd car il est conçu pour manipuler uniquement les enveloppes, pas les courriels eux-mêmes. C'est pour cela que j'ai déjà préparé dovecot comme MDA : pour faire rapidement du Sieve en cas de pic de spam.
Les autres restrictions de Postfix sur l'émetteur ou le destinataire sont natives avec OpenSMTPD : « smtpd_reject_unlisted_sender » est englobée dans ma vérification d'une auth SASL ou d'un compte local ; « reject_unknown_sender_domain » ne s'applique que si Postfix n'est pas la destination finale ; Etc.
Commandes utiles :
smtpd -n ;smtpctl show queue ;smtpctl schedule all ;smtpctl remove all ;smtpctl update table aliases.