Hi all, As i wrote few months ago i have write an article in French about Opensmtpd and i don't want to write some bullshits about it. Could you please have a look to it and make me know about mistake i could make. Thanks a lots.
The article is not posted yet so i put the corpus right here. Olivier Calzi Article Start: Nous utilisons tous des services de messagerie en ligne tel que Gmail, Outlook, Yahoo... Mais si vous vouliez prendre le contrôle de vos mails? comment faire? Comparons la technologie Exchange de Microsoft avec ces CAL's et ces licences et son budget ou 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. Il permet d'échanger des e-mails avec d'autres systèmes utilisant ce protocole. OpenSMTPD est un service "jeune" qui a voulu reprendre la simplicité de compréhension et de configuration du firewall Packet Filter d'OpenBSD. Ce service est implémenté depuis OpenBSD 4.6 dans la branche "unstable" et depuis OpenBSD 5.3 en tant que stable. Le MAN est la premières 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) <http://www.openbsd.org/cgi-bin/man.cgi?query=sendmail&sektion=8&arch=&apropos=0&manpath=OpenBSD+Current>: # /etc/rc.d/sendmail stop Modify the current mailwrapper(8) <http://www.openbsd.org/cgi-bin/man.cgi?query=mailwrapper&sektion=8&arch=&apropos=0&manpath=OpenBSD+Current> 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) <http://www.openbsd.org/cgi-bin/man.cgi?query=crontab&sektion=1&arch=&apropos=0&manpath=OpenBSD+Current>. 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étrages du service au niveau du système est faite 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 <aliases> deliver to mbox accept from any for domain "dev.unix-experience.fr" alias <aliases> deliver to maildir accept for local alias <aliases> 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 et à redémarrer le service smtpd avec la commande */etc/rc.d/smtpd restart*. Pour vérifier votre configuration Opensmtpd comme pour PF il existe la commande* 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 jeux de règles: #Pour verifier la syntaxe pfctl -nf /etc/pf.conf #Pour charger les nouvelles regles 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 Allons un peux plus loin dans notre configuration et renforçons la sécurité: Chiffrement TLS listen on pcn0 port 25 tls-require hostname Hermes Accordons une analyse de 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 au SMTP, l'option *tls* seule peux 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 *<name>.crt, <name>.key, <name>.dh présent 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 correspond 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 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 de mail via la commande *mail*, en ayant lancé smtpd en mode debug, ainsi nous pourrons comprendre les interactions par 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: <r...@hermes.my.domain> <<< 250 Ok >>> RCPT TO: <root@localhost> <<< 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 interaction qui ont eu lieu pendant la communication avec le serveur SMTP. 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=<r...@hermes.my.domain>, to=<root@localhost>, size=245, ndest=1, proto=ESMTP debug: scheduler: evp:e636d771a30c37cc scheduled (mda) debug: lka: userinfo <getpwnam>: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=<r...@hermes.my.domain>, to=<root@localhost>, 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 du mail par dans un premier par le MTA qui à rechercher un alias liant le destinataire (root@localhost), une fois identifié comme l'utilisateur "unixexperience", le MTA transmet le message au MDA interne de opensmtpd en attribuant alors l'"evpid" que l'on peux interprété comme "enveloppe identifer" au mda. Ensuite une session interne s'initialise ou le message va être délivré dans l'emplacement Maildir correspond à l'utilisateur unixexperience. Configuration d'un relai Nous pouvons considérer vouloir faire relayer nos mail par notre service smtp dans le cadre ou les ports ou la destination de notre smtp est bloquée à notre emplacement géographique ou tout simplement pour en faire un relais Nous allons donc ajouter une règle qui relaierons nos mails 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 # Uncomment the following to accept external mail for domain "example.org"http://www.unix-experience.fr/wp-admin/post.php?post=2889&action=edit&message=10 # # accept from any for domain "example.org" alias <aliases> deliver to mbox accept from local for any relay via tls+ auth://la...@smtp.gmail.com:587 auth <secrets> Pour arriver à cette configuration nous avons dût réaliser plusieurs actions. touch "label idgoo...@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ée un fichier contenant les informations d'identification pour utiliser le relais de google. Ensuite nous avons crée le fichier "secrets.db" qui sera utililsé par smtpd, nous avons restreints les permission sur ce fichier ainsi que son propriétaire et le groupe auxquels ils appartiennent pour que ceux-ci puissent être lisible par le daemon 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 relai: accept from local for any relay via tls+auth://la...@smtp.gmail.com:587 auth <secrets> *accept from local for any *: Nous acceptons les envoie de mail localement pour n'importe quel destination. *relay via tls+auth://la...@smtp.gmail.com:587 <http://la...@smtp.gmail.com:587> auth <secrets> *: Nous relayons via une authentification TLS en utilisant les information d'authentification correspondant à l'étiquette label sur le smtp de Gmail sur le port 587 en utilisant la table secrets. Conclusion: Nous reprendrons OpenSMTPD dans un article consacré à la mise en place d'un serveur mail complet avec la technologie de virtualisation libvirt. Ce qu'il faut retenir de OpenSMTPD: - Produit en cours de développement- Ajout de nouvel fonctionnalité 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. Source: Merci à la Mailing List d'OpenSMTPD pour m'avoir éclaircit sur le fonctionnement des étiquettes. http://www.opensmtpd.org/fr/list.html http://www.openbsd.org/cgi-bin/man.cgi?query=smtpd&sektion=8 END Cordialement Olivier Calzi