Relais nomade

Il nous manque juste une fonctionnalité intéressante : celle de pouvoir utiliser notre cyrus.nain-t.net pour envoyer nos messages, lorsque nous sommes en errance.

Les fournisseurs d'accès en effet, ont l'habitude (légitime) de réserver leur SMTP à leurs clients. Si bien que lorsque nous sommes en déplacements, nous devons reconfigurer notre MUA en fonction de fournisseur dont on utilise les services. Ce n'est pas bien pratique. Si notre SMTP cyrus pouvait accepter de faire le relais pour nous, quel que soit le fournisseur par lequel nous nous connectons, sans pour autant devenir un « open relay » ce serait parfait.

Le RFC 2476 va venir à notre secours. Nous allons ouvrir un MSA (Message Submission Agent) sur notre Postfix qui est prévu pour.

Le principe, assez tortueux, va être le suivant. Nos utilisateurs disposent d'un couple « login/password » pour accéder à leur boite aux lettres via dovecot-imapd. Nous allons utiliser SASL, de manière à faire authentifier les utilisateurs sur le SMTP par le même couple login/password, en s'appuyant sur dovecot-auth. SASL est une grande chose que nous manipulerons de manière plus musclée dans la solution suivante.

Simple Authentication and Security Layer porte assez mal son nom. Nous n'allons que l'effleurer ici en demandant à Dovecot d'assurer le rôle de serveur SASL et à Postfix celui du client. Normalement Postfix sait parler SASL avec Dovecot :

# postconf -a
cyrus
dovecot

Configuration de Dovecot

Nous devons avoir dans 10-master.conf le service auth:

service auth {
  unix_listener auth-userdb {
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

Ce qui veut dire que le serveur SASL implémenté dans Dovecot va écouter sur un socket unix placé dans la cage de Postfix (/var/spool/postfix), et que ce socket sera accessible en lecture comme en écriture par l'utilisateur « postfix ».

Relancez Dovecot.

Configuration de Postfix

Il va falloir agir sur les deux fichiers main.cf et master.cf.

Sur « main.cf »

Nous devons préciser le type sasl employé (dovecot), ainsi que l'emplacement du socket du daemon d'authentification de Dovecot (que nous avons placé dans /var/spool/postfix/private/auth). Ceci se traduit par l'ajout de ces deux lignes :

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

(Le chemin vers le socket est donné de façon relative de manière à ce qu'il soit indépendant du chemin de mise en cage de Postfix).

Nous avons donc finalement :

smtpd_banner = $myhostname ESMTP Experimental
disable_vrfy_command = yes
smtpd_helo_required = yes

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_sender_restrictions = 
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    permit

smtpd_client_restrictions = 
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_rbl_client blackholes.easynet.nl,
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client proxies.blackholes.wirehub.net,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client sbl.spamhaus.org,
    reject_rbl_client dnsbl.njabl.org,
    permit

content_filter=smtp-amavis:[127.0.0.1]:10024

biff = no
append_dot_mydomain = no
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
myhostname = cyrus.nain-t.net
myorigin = $myhostname
mydestination = $mydomain, $myhostname, localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
relayhost = 
mynetworks = 127.0.0.0/8 192.168.0.0/24 192.168.10.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/

Sur « master.cf »

Nous devons activer la « submission » qui ne l'est pas par défaut, en décommentant les lignes correspondantes et en ajoutant une option :

...
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o smtpd_enforce_tls=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
...

Les options transmises au service smtpd vont surcharger pour ce service, dont le nom est « submission » (et celui-ci seulement) celles qui seraient fournies dans main.cf. Nous avons ici 3 options :

  1. oblige à utiliser TLS (commande STARTTLS) avant l'authentification.
  2. active l'authentification en utilisant SASL.
  3. seuls les clients authentifiés par SASL peuvent se connecter.
  4. surcharge pour la « submission » les options par défaut qui sont : smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination. Postfix n'acceptera de relayer les message que pour les clients authentifiés.

En effet, il ne s'agit pas dans ce cas d'autoriser « my nesworks » mais uniquement les utilisateurs authentifiés par SASL et de rejeter tous les autres, non selement pour le relais mais aussi pour les destinations locales. En bref, le MTA ne sera utilisable que pour les personnes qui disposent d'un compte local.

Après avoir relancé Postfix, si nous configurons notre oiseau comme ceci.

Une fois les formalités d'acceptation du certificat du serveur (qui n'est toujours pas signé par une racine de confiance), et de fourniture du mot de passe de l'utilisateur « lambda », cyrus devrait accepter de relayer n'importe où.

Vérification (de routine) :

Jun  5 16:22:09 cyrus postfix/smtpd[26816]: connect from LSt-Amand-152-32-18-95.w82-127.abo.wanadoo.fr[82.127.57.95]
Jun  5 16:22:09 cyrus postfix/smtpd[26816]: C92D967DA4: client=LSt-Amand-152-32-18-95.w82-127.abo.wanadoo.fr[82.127.57.95], sasl_method=PLAIN, sasl_username=lambda
Jun  5 16:22:10 cyrus postfix/cleanup[26811]: C92D967DA4: message-id=<4847F690.1020505@eme-enseignement.fr>
Jun  5 16:22:10 cyrus postfix/qmgr[26780]: C92D967DA4: from=, size=590, nrcpt=1 (queue active)
Jun  5 16:22:10 cyrus postfix/smtpd[26813]: connect from localhost[127.0.0.1]
Jun  5 16:22:10 cyrus postfix/smtpd[26813]: 1CC6167DA5: client=localhost[127.0.0.1]
Jun  5 16:22:10 cyrus postfix/smtpd[26816]: disconnect from LSt-Amand-152-32-18-95.w82-127.abo.wanadoo.fr[82.127.57.95]
Jun  5 16:22:10 cyrus postfix/cleanup[26811]: 1CC6167DA5: message-id=<4847F690.1020505@eme-enseignement.fr>
Jun  5 16:22:10 cyrus postfix/smtpd[26813]: disconnect from localhost[127.0.0.1]
Jun  5 16:22:10 cyrus amavis[25917]: (25917-05) Passed CLEAN, [82.127.57.95] [82.127.57.95]  -> , Message-ID: <4847F690.1020505@eme-enseignement.fr>, mail_id: l3UEHAo7xlK9, Hits: -, queued_as: 1CC6167DA5, 130 ms
Jun  5 16:22:10 cyrus postfix/smtp[26812]: C92D967DA4: to=, relay=127.0.0.1[127.0.0.1]:10024, delay=0.46, delays=0.32/0/0.01/0.13, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=25917-05, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 1CC6167DA5)
Jun  5 16:22:10 cyrus postfix/qmgr[26780]: C92D967DA4: removed
Jun  5 16:22:10 cyrus postfix/qmgr[26780]: 1CC6167DA5: from=, size=1038, nrcpt=1 (queue active)
Jun  5 16:22:20 cyrus postfix/smtp[26818]: 1CC6167DA5: to=, relay=mail.grenouille.com[213.186.35.33]:25, delay=10, delays=0.07/0.01/6.8/3.6, dsn=2.0.0, status=sent (250 ok 1212675740 qp 4369)
Jun  5 16:22:20 cyrus postfix/qmgr[26780]: 1CC6167DA5: removed