Relai avec Exim et courier

Quand je me suis acheté un laptop et que je l’ai utilisé ailleurs que chez moi, j’ai réalisé que je ne pouvais pas facilement envoyer de courriels, parce qu’il fallait que je change ma configuration de serveur sortant selon le fournisseur d’accès internet où je me trouvais. Ceci, parce qu’Exim refusait de faire le relai de mes courriels si je tentais d’utiliser mon serveur SMTP à la maison, évitant ainsi d’être un « relai ouvert » (open relay).

Récemment, j’ai donné des adresses courriel à des membres de ma famille, et j’ai eu un problème semblable, quoique plus frustrant: le fournisseur d’accès internet refuse de faire le relai quand l’adresse de l’envoyeur n’est pas reconnue. Avec Vidéotron, je ne pouvais pas envoyer un courriel prétendant provenir de marchildon.net, alors qu’un envoyeur@videotron.ca fonctionne.

Ça fait longtemps que je savais ce que je devais faire: activer l’authentification SMTP. Voici donc comment j’y suis parvenu.

Premièrement, j’ai testé une authentification très simple, avec un nom d’usager et un mot de passe fixes. J’ai pu tester sur mon serveur en production car j’étais le seul qui l’utilisait comme serveur sortant pour mon réseau local privé.

Dans /etc/exim4/conf.d/auth/30_exim4-config_examples, j’ai ajouté:

fixed_plain:
  driver = plaintext
  public_name = PLAIN
  server_advertise_condition = *
  server_prompts = :
  server_condition = \
    ${if and {{eq{$2}{username}}{eq{$3}{mysecret}}}}
  server_set_id = $2

Puis j’ai activé cette configuration avec /etc/init.d/exim4 reload, et j’ai voulu tester ça avec une session telnet. J’ai converti l’usager et le mot de passe en base64 pour ensuite passer le résultat à la commande AUTH d’une session SMTP:

vesicule:~# cat bin/encode
#!/usr/bin/perl
use MIME::Base64;
printf ("%s", encode_base64(eval "\"$ARGV[0]\""));
vesicule:~# bin/encode '\username\mysecret'
AHVzZXJuYW1lAG15c2VjcmV0
vesicule:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mail.marchildon.net ESMTP Exim 4.50 Mon, 31 Mar 2008 20:59:54 -0400
EHLO marchildon.net
250-mail.marchildon.net Hello localhost [127.0.0.1]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN   <----------- yes!
250 HELP
AUTH PLAIN asdf
535 Incorrect authentication data
AUTH PLAIN AHVzZXJuYW1lAG15c2VjcmV0
235 Authentication succeeded
QUIT
221 mail.marchildon.net closing connection

J’ai vérifié ci-haut qu’en passant n’importe quoi à AUTH (« asdf »), j’obtenais un échec, et qu’en passant le bon usager et mot de passe (la ligne « AUTH PLAIN AHVzZXJuYW1lAG15c2VjcmV0 »), j’obtenais un succès.

Ensuite, j’ai voulu faire en sorte que les mots de passe soient les mêmes que pour les connexion POP et IMAP fournies par courier-imap. J’ai donc modifié ma configuration dans 30_exim4-config_examples pour ceci:

plain_courier_authdaemon:
  driver = plaintext
  public_name = PLAIN
  server_advertise_condition = *
  server_prompts = :
  server_condition = ${extract {address} {${readsocket{/var/run/courier/authdaemon/socket} \
      {AUTH ${strlen:exim\nlogin\n$2\n$3\n}\nexim\nlogin\n$2\n$3\n} }} {yes} fail}
  server_set_id = $2

J’ai répété le test avec un session telnet, cette fois-ci avec mon nom d’usager et mon vrai mot de passe (toujours encodé base64).

Satisfait, j’ai voulu mentionner dans les en-têtes du message le nom de l’usager qui a été authentifié. J’ai donc ajouté ceci à main/02_exim4-config_options:

received_header_text = Received: \
  ${if def:sender_rcvhost {from $sender_rcvhost\n\t}\
  {${if def:sender_ident \
  {from ${quote_local_part:$sender_ident} }}\
  ${if def:sender_helo_name {(helo=$sender_helo_name)\n\t}}}}\
  by $primary_hostname \
  ${if def:received_protocol {with $received_protocol}} \
  ${if def:tls_cipher {($tls_cipher)\n\t}}\
  (Exim $version_number)\n\t\
  ${if def:sender_address \
  {(envelope-from )\n\t}}\
  id $message_id\
  ${if def:received_for {\n\tfor $received_for}}\
  ${if def:authenticated_id {\n\tauthenticated $authenticated_id}}

La ligne importante est ${if def:authenticated_id {\n\tauthenticated $authenticated_id}}.

J’aurais pu terminer ici, mais j’étais conscient que mon mot de passe aurait été transmis pratiquement en clair sur internet. J’ai donc entrepris de configurer TLS, d’abord en générant un certificat auto-signé:

# cd /etc/exim4
# /usr/share/doc/exim4-base/examples/exim-gencert
# ls -l exim.*
-rw-r-----  1 root Debian-exim 721 2008-03-31 22:18 exim.crt
-rw-r-----  1 root Debian-exim 887 2008-03-31 22:18 exim.key
# openssl x509 -noout -text -in /etc/exim4/exim.crt | head -n 14
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            b8:35:2c:e2:2f:8c:95:f7
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=CA, ST=Qu\xC3\xA9bec, CN=mail.marchildon.net
        Validity
            Not Before: Apr  1 02:21:52 2008 GMT
            Not After : Apr  1 02:21:52 2011 GMT
        Subject: C=CA, ST=Qu\xC3\xA9bec, CN=mail.marchildon.net
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)

Notez que j’ai spécifié mail.marchildon.net parce que je spécifie la même chose dans la configuration du serveur sortant dans Thunderbird. Si je mets autre chose, j’obtiens un avertissement de sécurité de la part de Thunderbird.

Comme dernière configuration pour activer TLS, j’ai créé le fichier /etc/exim4/conf.d/main/00_local:

MAIN_TLS_ENABLE = true

Après un /etc/init.d/exim4 reload, j’ai vérifié que Exim annonce son support de connexions TLS:

# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mail.marchildon.net ESMTP Exim 4.50 Mon, 31 Mar 2008 22:20:20 -0400
EHLO marchildon.net
250-mail.marchildon.net Hello localhost [127.0.0.1]
250-SIZE 52428800
250-PIPELINING
250-STARTTLS   <------------- Yes!
250 HELP
QUIT
221 mail.marchildon.net closing connection

J’ai ensuite forcé Thunderbird à utiliser TLS pour le serveur sortant SMTP, et j’ai testé l’envoi d’un courriel à partir de mon réseau privé. Le log d’Exim montre que la connexion était encryptée (X=TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32) et que j’étais authentifié (A=plain_courier_authdaemon:nicolas):

# tail -n 1 /var/log/exim4/mainlog
2008-03-31 22:22:05 1JgW8T-0005HZ-GQ <= nicolas@marchildon.net H=cortex [192.168.1.50] P=esmtpsa X=TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32 A=plain_courier_authdaemon:nicolas S=870 id=47F1A467.8000509@marchildon.net

J’ai ensuite testé le relai d’un courriel en provenance d’internet avec un tunnel SSH et Thunderbird se connectant au port 2500 de localhost:

# ssh -L2500:marchildon.net:25 nicolas@remote-host.org

Le relai est accepté, comme prévu:

# tail -n 1 /var/log/exim4/mainlog
2008-03-31 22:28:00 1JgWDj-0005Hz-3w <= nicolas@marchildon.net H=nagios.solucorp.qc.ca ([127.0.0.1]) [207.253.4.248] P=esmtpsa X=TLS-1.0:DHE_RSA_AES_256_CBC_SHA:32 A=plain_courier_authdaemon:nicolas S=1545 id=47F1A5A1.6050108@marchildon.net

Enfin, j’ai désactivé TLS et vérifié que le relai est refusé, parce que ma configuration ne permet pas l’authentification sur une connexion non-encryptée:

# tail -n 1 /var/log/exim4/mainlog
2008-03-31 22:31:39 H=nagios.solucorp.qc.ca ([127.0.0.1]) [207.253.4.248] F= rejected RCPT : relay not permitted
Cet article a été publié dans Configuration, Courriel, Recette. Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s