Postfix est un serveur de mails. Il est (et sera) installé sur toutes les machines.

Installation

Lors de l'installation de Postfix, il est souvent nécessaire de désinstaller Exim4 (le MTA par défaut de Debian). Pour ce faire, et afin d'éviter d'avoir des paquets cassés, il est préférable d'utiliser l'Interface Utilisateur (UI) d'aptitude plutôt qu'un outil moins interactif en ligne de commande (aptitude ou apt-get). Sur l'ensemble des machines, on a installé le paquet Debian officiel (pour Wheezy, v2.9.6-2 au moment de l'installation) :

  • sur bulbe : le 16 avril 2013
  • sur marcuse : le 11 novembre 2013
  • sur ekumen : le 16 novembre 2013

Configuration

La configuration est (principalement) centralisée dans trois fichiers :

/etc/postfix/main.cf
contient la configuration de Postfix proprement dite. Ses options de configuration sont décrites dans la page de manuel de postconf(5).
/etc/postfix/master.cf
est le fichier de configuration du programme principal (master) de Postfix. Il contient des règles relatives à des protocoles ou des modes de transport du courrier, et les commandes à appliquer pour chacun de ces protocoles.
/etc/aliases
contient les déclarations des redirections des users locaux et autres scripts.

Configuration sur bulbe

  1. Le hostname et domaine par défaut (mydomain) sont bulbe.nos-oignons.net.
    Les mails sont acceptés à destination de

    • {bulbe.,}nos-oignons.{net,org,fr}
    • bulbe.tetaneutral.net
    • localhost.
  2. Les extensions d'adresse de la forme user+foo@nos-oignons.net sont autorisées : recipient_delimiter = +

  3. Seuls les alias peuvent recevoir des mails, que ce soit en @nos-oignons.{net,org,fr} ou @bulbe.nos-oignons.{net,org,fr}.

Modification cosmétique

La bannière SMTP (smtpd_banner) est devenue

bulbe.nos-oignons.net ESMTP Postfix (Debian GNU/Oignons)

TLS et STARTTLS

SSMTP (connexion entière chiffrée) et STARTTLS (chiffrement après l'initiation de la connexion) sont tous deux supportés.

  1. Les certificats auto-signés utilisés sont ceux produits par le paquet ssl-cert. Ils sont choisis avec les paramètres smtpd_tls_cert_file et smtpd_tls_key_file, et peuvent être regénérés avec la commande sudo make-ssl-cert generate-default-snakeoil --force-overwrite.

  2. Les connexions TLS utilisent un cache de session persistant, ce qui évite de renégocier une session TLS à chaque connexion. Cf smtpd_tls_session_cache_database (pour les connexions entrantes) et smtp_tls_session_cache_database (connexions sortantes).

  3. Lorsqu'un mail est envoyé, Postfix chiffre si possible, et vérifie le certificat présenté (si il existe dans DNS). smtp_tls_security_level = dane et smtp_dns_support_level = dnssec
    Cf http://www.postfix.org/TLS_README.html#client_tls_dane pour plus d'info.

  4. Lorsqu'un MTA distant délivre un mail, Postfix propose l'utilisation de STARTTLS. smtpd_tls_security_level = may

Cf http://www.postfix.org/TLS_README.html pour plus de détails.

aliases

  1. La plupart des users système sont redirigés vers root.

  2. Les mails pour root sont transmis à une mailing-list chiffrée : machines@nos-oignons.net.

greylisting

Le greylisting est assuré par Bley. La politique est de ne greylister que les hôtes signalés par des listes noires (RBL).

On interroge Bley via l'option check_policy_service de la directive smtpd_recipient_restrictions.

Attention, la documentation précise bien qu'il faut mettre reject_unauth_destination avant check_policy_service, sous peine de risquer de devenir un relai ouvert.

Intégration avec Mailman

Pour les listes de discussions, Mailman maintient un fichier d'aliases, /var/lib/mailman/data/aliases. On demande à Postfix de l'utiliser en l'indiquant dans la liste des alias_maps.

Intégration avec Schleuder

Schleuder dispose de son propre transport (schleuder) configuré dans /etc/postfix/master.cf.

Les adresses qui l'utilisent sont référencées dans la table au format hash /etc/postfix/schleuder. Cette table est utilisée grâce à la directive transport_maps.

Afin que ces adresses fonctionnent pour les domaines qui font partie de mydestination il est également nécessaire d'avoir cette table dans la liste de la directive local_recipient_maps.

Script répondeur

Un script Ruby tout simple est relié aux addresses dons@, donner@ et donate@. Il se contente de répondre avec un message tout fait, contenant l'IBAN de l'association.

Le script est installé sur bulbe (/usr/local/bin/repondeur-dons.rb) et requiert le paquet ruby-mail. Son code est disponible dans le wiki

slow transports

En raison de certaines limitations imposées par certaines sociétés, des slow transports sont configurés dans

/etc/postfix/master.cf :
slow unix - - n - 5 smtp
yahoo unix - - n - 5 smtp
/etc/postfix/main.cf :
slow_destination_concurrency_limit = 2
slow_destination_recipient_limit = 20
slow_destination_rate_delay = 2s
yahoo_initial_destination_concurrency = 1
yahoo_destination_concurrency_limit = 4
yahoo_destination_recipient_limit = 2
yahoo_destination_rate_delay = 1s
default_destination_concurrency_limit = 10
/etc/postfix/transports (et éventuellement /etc/postfix/transports.regexp) :

liste les domaines auxquels seront appliquées les règles définies ci-dessus, par exemple :

orange.fr   slow:
yahoo.com   yahoo:

Configuration sur les nœuds Tor

Lors de l'installation, debconf demande le type d'usage qu'on veut faire de Postfix : on choisit « smarthost ». Les nœuds Tor ne sont pas destinés à recevoir du courrier, mais seulement à en émettre vers le serveur principal (bulbe).

Dans /etc/aliases :

  1. La plupart des users système sont redirigés vers root.

  2. Les mails pour root sont transmis à une mailing-list chiffrée, gérée par Schleuder, en l'occurence machines@nos-oignons.net.

Dans /etc/postfix/main.cf :

On prendra ici marcuse en exemple, à adapter pour les autres machines. Dans ce premier bloc, la plupart des options sont celles par défault. relayhost désigne la seule machine avec laquelle Postfix va communiquer :

mydomain      = nos-oignons.net
myhostname    = marcuse.$mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
myorigin      = $myhostname
relayhost     = bulbe.$mydomain

Ici, on interdit tout courrier venant de l'extérieur (c'est à dire que Postfix ne traitera que le courrier généré par les applications locales) :

mynetworks       = 127.0.0.0/8 [::ffff:127.0.0.0]/124 [::1]/128
mynetworks_style = host
inet_interfaces  = loopback-only

On va demander à Postfix de s'assurer que le serveur auquel il s'adresse (relayhost) n'est pas un usurpateur : il va vérifier que l'empreinte du certificat ssl/tls présenté par le serveur correspond bien à celle qui se trouve en dur dans son fichier de configuration :

smtp_tls_security_level         = fingerprint
smtp_tls_fingerprint_digest     = sha1
smtp_tls_fingerprint_cert_match = ac:ad:75:7f:58:c3:cf:53:ef:a0:d2:e3:0a:64:3d:e9:a2:c4:58:28
NOTE :

pour obtenir cette empreinte sha1 de la clef publique pour bulbe.nos-oignons.net, on exécute (sur bulbe donc) :

openssl x509 -in /var/lib/acme/live/bulbe.nos-oignons.net/cert -pubkey | \
    openssl pkey -pubin -outform DER                                   | \
    openssl dgst -sha1 -c

On pin la clef publique, parce que le certificat lui-même change régulièrement.

Ça devrait se faire tout seul, mais on demande quand même que le chiffrement de l'échange soit de bonne qualité :

smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1
smtp_tls_exclude_ciphers     = NULL, MD5, DES, RC4
smtp_tls_mandatory_ciphers   = high

Enfin, pour avoir un peu de traces dans /var/log/mail.info :

smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes

Et ne pas oublier : sudo etckeeper commit

Test de Postfix

L'utilitaire SWAKS permet de tester simplement et rapidement un certain nombre d'aspects du serveur mail.

Exemple d'utilisation :

swaks -t nicoo@nos-oignons.net --server bulbe.nos-oignons.net --protocol smtp --tls