Configurer un serveur mail sous OpenSMTP

Publié le 23/01/2024 et écrit par Vincent Finance, dans la catégorie : #infra

OpenSMTP est un logiciel d'envoi de courriels conçu par des membres du projet OpenBSD. Au même titre que LibreSSL ou OpenSSH, ce logiciel a été conçu pour le système d'exploitation OpenBSD et porté sur plusieurs distributions par la suite. Son objectif est de gérer l'envoi de courriels vers l'extérieur tout en utilisant une syntaxe simple à comprendre et à utiliser. Il peut convenir comme alternative à Postfix, Exim ou encore Sendmail.

Ayant plusieurs machines avec OpenSMTPD, le but de cet article de vous donner quelques exemples d'usages pour ce logiciel et quelques commandes utiles pour son administration au quotidien. Ces exemples sont compatibles avec OpenBSD et plusieurs distributions GNU/Linux (Debian notamment).

Configuration type sur OpenSMTPD

Faisons un peu de théorie avant de passer aux exemples. OpenSMTPD utilise plusieurs types d'instructions pour savoir quoi utiliser et comment réagir dans toutes les situations :

Ce jeu d'options permet d'obtenir un fichier lisible et simple à comprendre. La syntaxe a d'ailleurs été retravaillée en ce sens pour que l'utilisateur soit plus à l'aise.

Exemples de configuration

Serveur mail complet

Dans cet exemple, j'ai choisi de configurer directement un serveur mail complet et qui est capable de supporter plusieurs noms de domaine (ce qui est assez courant chez ceux qui gèrent le courrier de plusieurs personnes ou qui gèrent des plateformes d'hébergement). Il utilise Dovecot pour gérer la partie réception du courrier et Rspamd pour la gestion du spam.
Je me suis grandement inspiré de la configuration proposée par @prx dans son guide pour installer un serveur OpenBSD et c'est typiquement celle qui est en production sur mon serveur mail secondaire :

## Tables
table aliases file:/etc/mail/aliases
table passwd "/etc/mail/passwd"
table virtuals "/etc/mail/virtuals"
table domains "/etc/mail/domains"

## Certificats
pki domaine.tld key "/chemin/vers/la/cleducert.pem"
pki domaine.tld cert "/chemin/vers/le/cert.pem"

## Filtrage
filter senderscore proc-exec "filter-senderscore -blockBelow 10 -junkBelow 70 -slowFactor 2000"
filter rspamd proc-exec "filter-rspamd"

## Ecoute
### Reception
listen on all tls pki domaine.tld filter { senderscore, rspamd } hostname "domaine.tld"

### Envoi
listen on all port submission tls-require pki domaine.tld auth <passwd> filter rspamd hostname "domaine.tld"

## Actions
action "relay" relay
action "local_mail" maildir alias <aliases>
action "virtual_maildir" lmtp "/var/run/dovecot-lmtp" rcpt-to virtual <virtuals>

## Envoi et reception des mails
match from any for local action local_mail
match from any for domain <domains> action virtual_maildir
match from any auth for any action "relay"
match for any action "relay"

Avoir un serveur SMTP de secours (backup relay)

Une bonne pratique à avoir quand on gère du mail est d'avoir un serveur de secours qui va se charger de récupérer les mails non distribués si votre serveur principal tombe en panne. C'est ce qu'on appelle un backup relay : il récupère les mails à distribuer et tente de les renvoyer jusqu'à ce que le serveur principal réponde à nouveau.
Sur mon infrastructure, un de mes VPS sert notamment de système de secours pour mes propres domaines et ceux de mon ami @prx.

Sous OpenSMTPD, cela se fait directement avec les options relay backup, comme ci-dessous :

action "backup" relay backup tls helo "autredomaine.tld"
match from any for domain "autredomaine.tld" action "backup"

Dans mon cas, j'ai donc rajouté ces lignes dans la configuration fournie dans la section du dessus pour obtenir cet exemple :

## Tables
table aliases file:/etc/mail/aliases
table passwd "/etc/mail/passwd"
table virtuals "/etc/mail/virtuals"
table domains "/etc/mail/domains"

## Certificats
pki domaine.tld key "/chemin/vers/la/cleducert.pem"
pki domaine.tld cert "/chemin/vers/le/cert.pem"

## Filtrage
filter senderscore proc-exec "filter-senderscore -blockBelow 10 -junkBelow 70 -slowFactor 2000"
filter rspamd proc-exec "filter-rspamd"

## Ecoute
### Reception
listen on all tls pki domaine.tld filter { senderscore, rspamd } hostname "domaine.tld"

### Envoi
listen on all port submission tls-require pki domaine.tld auth <passwd> filter rspamd hostname "domaine.tld"

## Actions
action "relay" relay
action "local_mail" maildir alias <aliases>
action "backup" relay backup tls helo "autredomaine.tld"
action "virtual_maildir" lmtp "/var/run/dovecot-lmtp" rcpt-to virtual <virtuals>

## Envoi et reception des mails
match from any for local action local_mail
match from any for domain "autredomaine.tld" action "backup"
match from any for domain <domains> action virtual_maildir
match from any auth for any action "relay"
match for any action "relay"

Relais interne vers des serveurs externes

Ici, je me suis inspiré d'une configuration en place sur une des machines de solene. L'idée est d'utiliser plusieurs relais SMTP pour envoyer des mails vers plusieurs destinations différentes, le tout en écoutant que sur l'interface locale de la machine.
Cela peut notamment servir à faire le tri entre les envois ou répartir la charge sur plusieurs services :

## /etc/mail/smtpd.conf

listen on lo0

table aliases file:/etc/mail/aliases
table secrets file:/etc/mail/secrets

action "local" mbox alias <aliases>
action "relay" relay
action "monserveur" relay host smtps://login@domaine.tld auth <secrets>
action "unautreserveur" relay host localhost:2525

match mail-from "@domaine.tld" for any action "monserveur"
match mail-from "@domaine2.tld" for any action "unautreserveur"
match for local action "local"
match for any action "relay"

Relais SMTP pour un réseau local

Par rapport à la configuration précédente, on cherche ici à écouter sur toutes les interfaces et on rajoute une règle qui permet à tout ordinateur situé dans le même réseau local que notre machine de l'utiliser pour envoyer des mails vers l'extérieur. Ainsi, cet exemple correspond tout à fait au rôle d'un routeur qui redirige des mails de notifications vers une boîte mail en ligne :

## /etc/mail/smtpd.conf

listen on all

table aliases file:/etc/mail/aliases
table secrets file:/etc/mail/secrets

action "local" mbox alias <aliases>
action "relay" relay host smtps://login@domaine.tld auth <secrets>

match for local action "local"
match from local for any action "relay"
match from src 10.10.0.0/16 for action "relay"

Commandes de base pour un usage quotidien

S'occuper de la queue et la visualiser

Les commandes suivantes permettent de gérer la queue, c'est-à-dire la file d'attente des mails que le logiciel doit traiter. Elles sont à lancer en mode administrateur (avec sudo ou doas par exemple).

Générer les fichiers associés à la configuration

Pour générer les fichiers comme /etc/mail/aliases ou /etc/mail/secrets, vous pouvez utiliser les commandes ci-dessous. Il est important de bien attribuer les bonnes permissions pour qu'OpenSMTPD (et lui seul) soit capable de lire les fichiers et assurer la bonne confidentialité des infos contenues.

mkdir -p /etc/mail/ ## Si ce dossier n'existe pas (Linux)
touch /etc/mail/secrets
chmod 640 /etc/mail/secrets

## Sous OpenBSD
chown root:_smtpd /etc/mail/secrets

## Sous Linux (ici Debian)
chown root:opensmtpd /etc/mail/secrets

En cas de modification d'un de ces fichiers, on peut indiquer à OpenSMTPD de se mettre à jour en lançant une commande update : smtpctl update table nomdelatable

En cas d'ajout d'utilisateurs dans le fichier secrets, on peut demander à l'utilitaire de générer des hashs des mots de passe choisis avec la commande encrypt : smtpctl encrypt mot_de_passe. Cette commande affichera simplement un hash du mot de passe et il faudra le recopier pour l'ajouter dans le fichier correspondant.

Conclusion

Si besoin d'une version plus détaillée pour utiliser un serveur mail sous OpenSMTPD, je peux vous citer une référence de confiance sur le sujet, même si elle est dédiée au système OpenBSD : https://si3t.ch/w/doku.php?id=ah:fr:05-mail
L'objectif de cet article est surtout de donner des exemples pour configurer rapidement un serveur OpenSMTPD sans se préoccuper des autres éléments constitutifs d'un service de messagerie électronique.


Sources utilisées :


Un commentaire à ajouter ?

Pour ajouter votre commentaire, envoyez directement un mail ici