URL: https://linuxfr.org/news/opensmtpd-premiers-pas Title: OpenSMTPD : Premiers Pas Authors: Zwordi ZeroHeure, Florent Zara, palm123, bubar🦥, patrick_g, Benoît Sibaud et claudex Date: 2014年02月17日T12:01:24+01:00 License: CC By-SA Tags: openbsdopensmtpd, opensmtpd et smtp Score: 60 Nous utilisons tous des services de messagerie en ligne tel que Gmail, Outlook, Yahoo, ... Mais si vous vouliez prendre le contrôle de vos courriels ? Comment faire ? Comparons la technologie Exchange de Microsoft avec ses CAL's, et ses licences, et son budget, avec les technologies open-source comme Sendmail, Postfix ou dans notre cas OpenSMTPD. Afin d'avoir un service aussi complet que Gmail, il faudra mettre en place plusieurs briques et OpenSMTPD en fait partie. OpenSMTPD est un service SMTP libre utilisant le-dit protocole comme défini dans la [RFC 5321](http://tools.ietf.org/search/rfc5321). Il permet d'échanger des e-mails avec d'autres systèmes utilisant ce protocole comme Sendmail, Postfix, Exchange, etc. ![OpenSMTPD](http://www.opensmtpd.org/images/opensmtpd.png) OpenSMTPD est un service "jeune" qui a voulu reprendre la simplicité de compréhension et de configuration du firewall Packet Filter (PF) d'OpenBSD. Ce service est implémenté depuis OpenBSD 4.6 dans la branche "unstable" et depuis OpenBSD 5.3 en tant que stable. Une dépêche avait été [publiée](https://linuxfr.org/news/opensmtpd-le-nouveau-serveur-smtp-pour-openbsd) ici, fin 2009, à ce sujet. _Plus d'informations sur la configuration d'OpenSMTPD dans la suite de la dépêche._ ---- [Site d'OpenSMTPD](http://www.opensmtpd.org/fr/) [Dépêche LinuxFR sur la sortie de la version 5.3 en 2013](https://linuxfr.org/news/opensmtpd-5-3-est-de-sortie) [Liste de diffusion d'OpenSMTPD](http://www.opensmtpd.org/fr/list.html) [Manpage SMTPD(8)](http://www.openbsd.org/cgi-bin/man.cgi?query=smtpd&sektion=8) ---- Configuration =========== OpenSMTPD fournit plusieurs pages de man : - `smtpd` - Simple Mail Transfer Protocol daemon - `smtpd.conf` - Simple Mail Transfer Protocol daemon configuration file - `smtpctl` - control the Simple Mail Transfer Protocol daemon - `newaliases` - generate aliases mappings for the Simple Mail Transfer Protocol daemon - `makemap` - generate mappings for the Simple Mail Transfer Protocol daemon - `aliases` - aliases files format - `forward` - forwarding files format - `table` - format description for smtpd tables - `sendmail` - a mail enqueuer for smtpd Le `man smtpd` est la première phase de l'approche pour utiliser ce service, il fournit les premières étapes pour un déploiement propre. ``` smtpd is not enabled by default.In order to use it as the system mailer, ensure the mail queue is empty, then stop sendmail(8): # /etc/rc.d/sendmail stop Modify the current mailwrapper(8) settings by editing /etc/mailer.conf: sendmail /usr/sbin/smtpctl send-mail /usr/sbin/smtpctl mailq /usr/sbin/smtpctl makemap /usr/libexec/smtpd/makemap newaliases /usr/libexec/smtpd/makemap Disable the sendmail clientmqueue entry in crontab(1). Rebuild the aliases database, and enable the daemon: # newaliases # echo "sendmail_flags=NO">> /etc/rc.conf.local # echo "smtpd_flags=">> /etc/rc.conf.local # /etc/rc.d/smtpd start ``` Maintenant que le paramétrage du service au niveau du système est fait, nous allons passer à la configuration du fichier `smtpd.conf`. ``` listen on all table aliases db:/etc/mail/aliases.db # Uncomment the following to accept external mail for domain "example.org" # # accept from any for domain "example.org" alias deliver to mbox accept from any for domain "dev.unix-experience.fr" alias deliver to maildir accept for local alias deliver to maildir accept for any relay ``` Le service est à présent configuré, il nous reste à accepter les connections externes sur le port 25 avec Packet Filter (cf. plus loin) et à redémarrer le service `smtpd` avec la commande `/etc/rc.d/smtpd restart`. Comme pour Packet Filter (PF), on vérifie la configuration d'OpenSMTPD avec `smtpd -n`. Pour lancer smtpd en mode debug lancer la commande `smtpd -dv`. Configurez maintenant Packet Filter (rappel: fichier `/etc/pf.conf`) ``` pass in proto tcp to self port smtp ``` Vérifiez maintenant la syntaxe et chargez le jeu de règles: ``` # Pour vérifier la syntaxe pfctl -nf /etc/pf.conf # Pour charger les nouvelles règles pfctl -f /etc/pf.conf ``` Pour conclure cette partie, réalisons un test: ``` telnet dev.unix-experience.fr 25 Connected to dev.unix-experience.fr. Escape character is '^]'. 220 hermes.my.domain ESMTP OpenSMTPD ``` Ajout d'une couche sécurité ----------- Allons un peu plus loin dans notre configuration et renforçons la sécurité. Chiffrement TLS: ``` listen on pcn0 port 25 tls-require hostname Hermes ``` Analysons cette ligne de configuration du fichier `smtpd.conf`: - **listen on pcn0 port 25** : le service écoutera sur l'interface pcn0 sur le port 25 (si le paramètre "all" est actif, le service écoutera sur toutes les interfaces) - **tls-require** force les clients à établir une connexion sécurisée avant d'être autorisés à dialoguer avec le SMTP ; l'option tls seule peut suffire mais tls-require renforce globalement. Il faut noter que l'utilisation de ces options nécessite la création de certificats. Ces certificats peuvent être spécifiés par l'ajout de l'option certificate **.crt**, **.key**, **.dh**, présent(s) dans le répertoire **/etc/mail/certs/**. Néanmoins si cette option n'est pas présente, le service recherchera des certificats sous la forme **pcn0.crt** et **pcn0.key** , qui correspondent au nom de l'interface sur laquelle nous écoutons. Il est utile de noter que si nous ne créons qu'un certificat et sa clé, et non le CA ainsi que le DH, alors le service utilisera ces paramètres par défaut. - **hostname Hermes** permet de spécifier un nom pour la bannière smtpd. Test d'envoi ----------- Nous allons à présent réaliser un test d’envoi d'email via la commande `mail`, en ayant lancé smtpd en mode debug, ainsi nous pourrons comprendre ce qui se passe en consultant les logs. ``` echo "Ceci est un message de test" |mail -v -s "TEST MAIL" root@localhost ``` ``` <<< 220 hermes.my.domain ESMTP OpenSMTPD>>> EHLO localhost <<< 250-hermes.my.domain Hello localhost [local], pleased to meet you <<< 250-8BITMIME <<< 250-ENHANCEDSTATUSCODES <<< 250-SIZE 36700160 <<< 250 HELP>>> MAIL FROM: <<< 250 Ok>>> RCPT TO: <<< 250 Recipient ok>>> DATA <<< 354 Enter mail, end with "." on a line by itself>>> . <<< 250 e636d771 Message accepted for delivery>>> QUIT <<< 221 Bye ``` Ceci est le détail des interactions qui ont eu lieu pendant la communication avec le serveur OpenSMTPD. On y retrouve les champs du destinataire et de l'émetteur. Si on regarde les logs de plus près, nous pouvons observer que le service est extrêmement verbeux : ``` smtp-in: New session 000000001f305e85 from host 0@localhost [local] debug: aliases_get: returned 1 aliases debug: 0x12ad371d0000: end of message, msgflags=0x0000 smtp-in: Accepted message e636d771 on session 000000001f305e85: from=, to=, size=245, ndest=1, proto=ESMTP debug: scheduler: evp:e636d771a30c37cc scheduled (mda) debug: lka: userinfo :unixexperience smtp-in: Closing session 000000001f305e85 debug: mda: new session 000000002962b8f8 for user "unixexperience" evpid e636d771a30c37cc debug: smtp: 0x12ad371d0000: deleting session: done debug: mda: no more envelope for "unixexperience" debug: mda: got message fd 3 for session 000000002962b8f8 evpid e636d771a30c37cc debug: mda: querying mda fd for session 000000002962b8f8 evpid e636d771a30c37cc debug: smtpd: forking mda for session 000000002962b8f8: "/home/unixexperience/Maildir" as unixexperience debug: mda: got mda fd 4 for session 000000002962b8f8 evpid e636d771a30c37cc debug: mda: end-of-file for session 000000002962b8f8 evpid e636d771a30c37cc debug: mda: all data sent for session 000000002962b8f8 evpid e636d771a30c37cc debug: smtpd: mda process done for session 000000002962b8f8: exited okay delivery: Ok for e636d771a30c37cc: from=, to=, user=unixexperience, method=maildir, delay=1s, stat=Delivered debug: mda: session 000000002962b8f8 done debug: mda: user "unixexperience" becomes runnable debug: mda: all done for user "unixexperience" ``` Nous pouvons alors décrire les étapes de réception de l'email par le [MTA](https://fr.wikipedia.org/wiki/Mail_Transfer_Agent) qui a recherché un alias liant le destinataire (root@localhost). Une fois identifié comme l'utilisateur "unixexperience", le MTA transmet le message au [MDA](http://fr.wikipedia.org/wiki/Mail_Delivery_Agent) interne de OpenSMTPD en attribuant alors _l'evpid_ que l'on peut interpréter comme _envelope identifier_ au MDA. Ensuite une session interne s'initialise où le message va être délivré dans l'emplacement Maildir correspondant à l'utilisateur "unixexperience". Configuration d'un relais ------------------------- Nous pouvons vouloir faire relayer nos emails par notre service SMTP lorsque les ports ou la destination de notre serveur OpenSMTPD sont bloqués à notre emplacement géographique, ou tout simplement pour en faire un relais. Nous allons donc ajouter une règle qui relaiera nos emails via Gmail. Voici à quoi ressemble notre fichier smtpd.conf: ``` listen on pcn0 port 25 tls-require auth hostname Hermes listen on pcn0 port 465 smtps auth hostname Hermes table secrets db:/etc/mail/secrets.db table aliases db:/etc/mail/aliases.db accept from local for any relay via tls+ auth://label@smtp.gmail.com:587 auth ``` Pour arriver à cette configuration nous avons dû réaliser plusieurs actions. ``` echo "label IDGOOGLE@gmail.com:PASSWD">> /etc/mail/secrets makemap /etc/mail/secrets chmod 640 /etc/mail/secrets* chown root:_smtpd /etc/mail/secrets* ``` Nous avons donc créé un fichier contenant les informations d'identification pour utiliser le relais de Gmail. Ensuite nous avons créé le fichier `secrets.db` qui sera utilisé par smtpd, nous avons restreint les permissions sur ce fichier et changé son propriétaire et son groupe pour que celui-ci puisse être lisible par le daemon smtpd d'OpenSMTPD. Nous avons renseigné ce fichier sous cette forme dans `smtpd.conf`. ``` table secrets db:/etc/mail/secrets.db ``` Maintenant la règle du relais : ``` accept from local for any relay via tls+auth://label@smtp.gmail.com:587 auth ``` - **accept from local for any** : nous acceptons les envois d'email localement pour n'importe quelle destination. - **relay via tls+auth://label@smtp.gmail.com:587 auth ** : nous relayons via une authentification TLS en utilisant les informations d'authentification correspondant à l'étiquette label sur le service SMTP de Gmail sur le port 587 en utilisant la table "secrets". Ce qu'il faut retenir de OpenSMTPD =========== - produit en cours de développement (ajout de nouvelles fonctionnalités dans le futur); - facilité de compréhension de la configuration. Ce qui est valable aujourd'hui pour son utilisation ne le sera sans doute plus demain. Merci à la [liste de discussion d'OpenSMTPD](http://www.opensmtpd.org/fr/list.html) pour m'avoir éclairé sur le fonctionnement des étiquettes et pour une relecture de l'article.

AltStyle によって変換されたページ (->オリジナル) /