--- categories: ['OpenBSD','Réseau','Client'] date: 2018-11-03T21:38:54+01:00 description: "Comment configurer le service smtpd avec authentification mail sous OpenBSD (>= v6.4), pour permettre l'accès à vos services de messagerie mails." draft: false tags: ['OpenBSD','smtpd','auth','mail'] title: "OpenBSD : Configurer smtpd.conf pour l'authentification (depuis OpenBSD 6.4 & ≥)" translationKey: "openbsd-smtpd-auth-client" --- ## Description Ou, **comment configurer sa machine locale pour envoyer un mail depuis votre console, depuis OpenBSD, actuellement dans sa version 6.4, en se connectant à un service nécessitant une identification ?** ## Présentation **OpenSMTPD** est une libre implémentation du protocole SMTP côté serveur, tel que défini dans la {{< rfc 5321 >}}, avec quelques extensions standards additionnels. Il permet à des machines ordinaire d'échanger des mails avec d'autres systèmes parlant le protocole SMTP. Informations : * Site web : https://www.opensmtpd.org * Version fournie : 6.4.0 → **6.7** * OS : OpenBSD 6.4 → **7.3** *Testé avec efficacité auprès des services de [Gandi][1], de l'association [L'autre.net][2], puis sur mes propres serveurs MX.* ## Installation OpenBSD, depuis sa version 6.4, embarque nativement la nouvelle version d'OpenSMTPD… il n'y a donc rien de plus à installer, cela fait partie du système de base. Donc, un coup de `# rcctl start smtpd` et c'est partie le service SMTP fonctionnera normalement sur votre machine ! Une petite précision sur les fichiers : * le fichier de configuration est : `/etc/mail/smtpd.conf`. * le fichier log est `/var/log/maillog` et permet de surveiller toute l'activité liée à SMTP, vous y retrouverez aussi les erreurs d'envois. ## Configuration Pour envoyer un mail par SMTP à un service de mails nécessitant une identification, tel que celui de Gandi, il est nécessaire de créer dans un premier temps, un fichier `secrets` avec les droits adéquats sur votre système, ensuite il nous reste à configurer le fichier `smtpd.conf`. Le manpage nous donne un [exemple](https://man.openbsd.org/smtpd.conf#EXAMPLES) de ce qu'il faut faire - regardez le premier exemple, si besoin, mais je le restitue ici - : ### Fichier secrets Il nous faut créer ce fichier `/etc/mail/secrets` : `# touch /etc/mail/secrets` **Donnons lui les droits adéquats pour le "sécuriser", selon la section "Exemples" du manpage** : ```sh # chmod 640 /etc/mail/secrets # chown root:_smtpd /etc/mail/secrets ``` Ensuite, il est nécessaire de le remplir de telle manière :
`identifiant username:password`
{{< color red >}}n'écrivez pas TEXTUELLEMENT cette information{{}}, remplacez-là par les informations ci-dessous : * où `identifiant` est l'identifiant que vous choisissez soigneusement, et qui vous servira plus tard dans la configuration du fichier `smtpd.conf` ; *admettons pour l'exemple que ce sera la chaine de caractères : **perso**.* * `username` est votre identifiant de connexion mail au service mail de votre fournisseur - *généralement votre adresse mail* - ; * `password` étant le mot de passe lié à votre identification mail. {{< note warning >}} Il est possible de nommer autrement ce fichier secrets, et de le mettre ailleurs dans votre système de fichier ; comprenez-le principe et modifier en conséquence. De même, je vous encourage fortement à ne mettre QUE des droits **0400** sur le fichier. Même si l'accès au fichier par smtpd peut sans soucis être fait avec vos droits personnels `$USER:$USER`, si vous l'avez mis ailleurs, tel que dans votre `$HOME`, il est préférable de mettre à minima les droits avec le groupe `_smtpd`. {{< /note >}} ### Fichier `smtpd.conf` Maintenant modifions le fichier `/etc/mail/smtpd.conf` ```cfg # $OpenBSD: smtpd.conf,v 1.14 2019/11/26 20:14:38 gilles Exp $ # This is the smtpd server system-wide configuration file. # See smtpd.conf(5) for more information. table aliases file:/etc/mail/aliases table secrets file:/etc/mail/secrets queue compression # To accept external mail, replace with: listen on all # ## add on 6.7 listen on socket listen on lo0 action "local_mail" mbox alias action "unbound" relay host smtp+tls://identifiant@serveur auth mail-from "@your-domain.tld" # Uncomment the following to accept external mail for domain "example.org" # # match from any for domain "example.org" action "local" ### 6.6 writings #match for local action "local_mail" #match for any action "unbound" ### 6.7 writings match from local for local action "local_mail" match from local for any action "outbound" ``` --- **Explications** Par rapport à la version originale, nous avons donc rajouté : * la ligne `table secrets` qui appelle le fichier `/etc/mail/secrets` - *ou son équivalent, si vous l'avez personnalisé*… * la ligne `action unbound` qui nous permet de définir l'action nécessaire vers l'hôte relais par lequel nous enverrons les mails… * REMARQUEZ l'écriture `identifiant@serveur` : * c'est justement là qu'il faut remplacer la chaîne `identifiant` par celle que vous avez créée dans votre fichier `secrets`. *Dans le contexte de notre exemple, il faudra écrire la chaine de caractères **perso**.* * quant à la chaîne `serveur`, c'est le nom du serveur SMTP qu'il faut renseigner. * *dans le cas de Gandi, il faut la remplacer par l'adresse de l'hôte mail de Gandi, à savoir :
`mail.gandi.net`*. * la chaîne [smtp+tls](https://man.openbsd.org/smtpd.conf#host) est le protocol que nous utilisons pour nous connecter au service de l'hôte mail relais…
*si vous avez besoin d'utiliser un autre protocole, je vous renvoie à la liste de ceux gérés par OpenSMTPD…* * la chaîne [auth](https://man.openbsd.org/smtpd.conf#auth) permet de spécifier la table `secrets` fournissant les données d'identification mail nécessaires. * la chaîne [mail-from](https://man.openbsd.org/smtpd.conf#mail_-from) nous permet de spécifier le nom de domaine - ce qui permet d'éviter l'erreur `Sender address rejected: Domain not found` ;
*il faut bien sûr que ce domaine vous appartienne…* * la ligne `match … action "unbound"` est l'action qui sera déclenchée lors de l'envoi de mails à l'extérieur ! #### Changements 6.7 La v6.7 d'OpenBSD a apporté de légers changements de syntaxe : - ajout de `listen on socket` *{{< man smtpd.conf 5 "listen~2" >}}* - modification de actions de correspondances du gestionnaire de queues **local** *{{< man smtpd.conf 5 match >}}* :
`match from local for local action "local_mail"`
`match from local for any action "outbound"`
#### Changements 6.4 > 6.6 La syntaxe des noms d'actions a légèrement changé entre les versions 6.4 et 6.6 : * `local` devient `local_mail` * `relay` devient `unbound` ### Gestion des alias Il est intéressant de gérer l'alias relatif à votre compte `root` voire celui de votre utilisateur principal… Éditez le fichier `/etc/mail/aliases`, et vers la fin du fichier, modifiez `root` en lui indiquant vers quelle adresse mail, vous désirez que les messages systèmes adressés au compte root vous soit envoyés ! Faites de même pour votre utilisateur système ;) N'oubliez pas de recharger la base des aliases, grâce à l'usage de la commande `newaliases`… avec des droits administrateurs ! ## Utilisation {{< note warning >}} Avant de redémarrer le service smtpd pour qu'il prenne en compte les modifications faites, il nous faut tester l'écriture de la configuration : `# smtpd -n` qui devrait réponde par : `configuration OK` informant ainsi que tout va bien… Sinon, rééditez le fichier de configuration à la ligne indiquée en premier ; c'est d'elle que vient l'erreur principale ! {{< /note >}} Partons du principe que tout est bon, il suffit de redémarrer le service : ```sh # rcctl restart smtpd smtpd(ok) smtpd(ok) ``` Le journal quant à lui indiquera le bon redémarrage par une ligne d'information semblable à la suivante :
`Apr 3 07:17:05 sh1 smtpd[68810]: info: OpenSMTPD 7.0.0 starting` De même, pensez à utiliser le contrôleur `smtpctl`… je vous renvoie à son manpage qui est très complet ! ### Tests d'envois Soit : * `echo "Test d'envois de mail on $(hostname); date: $(date)" | mail -s "Test de mail" adresse_mail_à_qui_envoyer` * `echo "Test d'envois de mail on $(hostname); date: $(date)" | mail -s "Test de mail" root` Dans un cas, comme dans l'autre, le journal vous indiquera l'équivalent, en cas de réussite, d'un tel message, par exemple : ```log Apr 3 07:20:20 sh1 smtpd[56183]: 2cda1df4efff97f2 mta connecting address=smtp+tls://89.234.141.148:587 host=mail2.automario.eu Apr 3 07:20:20 sh1 smtpd[56183]: 2cda1df4efff97f2 mta connected Apr 3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta tls ciphers=TLSv1.3:AEAD-CHACHA20-POLY1305-SHA256:256 Apr 3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta cert-check result="valid" fingerprint="SHA256:17af91bcb27a530cc278cd8be90551593bee38ebaf6ade68053a508b14a8f817" Apr 3 07:20:21 sh1 smtpd[56183]: 2cda1df4efff97f2 mta delivery evpid=4138560f4bd626cf from=<***@huc.fr.eu.org> to=<***@stephane-huc.net> rcpt=<-> source="46.23.90.29" relay="89.234.141.148 (mail2.automario.eu)" delay=1s result="Ok" stat="250 2.0.0 eb1a48cf Message accepted for delivery" ``` ## Gestion des erreurs Retrouvez ci-dessous les erreurs communes liées à une mauvaise configuration : ### Error: authentication failed Vérifiez, re-vérifiez votre couple d'identification `username`, `password` écrits dans votre {{< anchor "fichier secret" "fichier-etc-mail-secrets" >}} ! ### Error: Cannot parse smarthost Ce message d'erreur est adressé parce que le service SMTP n'arrive pas à comprendre l'ensemble `identifiant@serveur` dans votre règle action. Vérifiez vos écritures, afin que : * votre `table secrets` renseigne bien le bon nom de fichier à interroger ! * vous avez bien écrit une écriture de type `identifiant username:password` dans votre fichier `secrets` * vous avez bien remplacez la chaîne `identifiant` par celle que vous avez créée… * idem pour la chaîne `serveur` : assurez-vous de l'existence du nom de l'hôte relais. ### Error: Sender address rejected: Domain not found Ce message d'erreur vous est adressé lorsque le service SMTP ne trouve pas de correspondance avec le nom de domaine. L'astuce est d'utiliser le paramètre [mail-from](https://man.openbsd.org/smtpd.conf#mail_-from), dans la règle action, de manière à cibler votre nom de domaine, tel que : `mail-from "@votre-domaine.tld"`
**n'oubliez pas la présence du symbole `@` *(arobase)*.** ## Documentations Le protocol SMTP est défini par la RFC 5321 : {{< rfcdoc 5321 >}} ### Manpages * {{< man "smtpd.conf" 5 >}}, {{< man "smtpctl" 8 >}} ### Autres informations * L'annonce de la sortie d'[OpenSMTPD 6.4.0][3] * Retrouvez les différents changements de syntaxe induits par la nouvelle version d'OpenSMTPD : en [Anglais][4], en [Français][5]. --- [1]: https://gandi.net [2]: https://lautre.net [3]: https://blog.openbsd.fr.eu.org/index.php?article61/opensmtpd-6-4-0 [4]: https://www.openbsd.org/faq/upgrade64.html [5]: https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/upgrade64#changement-de-configuration-et-de-syntaxe ---