8.2. Configuration

Le defaut de Postfix est probablement le nombre incalculable de directives de configuration qu'il accepte. Et même si le logiciel fait des efforts particuliers pour être tolérant dans la syntaxe de son fichier de configuration, il n'en reste pas moins que le foisonnement des mots clefs utilisables et parfois leur ambiguïté rendent les configurations souvent complexes et délicates.

[Note]Note

Postfix, compilé avec le support TLS, comporte 525 directives de configuration ! (voir root@ubuntu:~# postconf | wc -l). On pourra prendre connaissance de leur signification dans la pages de man de postconf(5).

Le package Ubuntu embarque des scripts qui facilitent la configuration initiale. On en a eu un apercu lors de l'installation, mais ils permettent aussi d'aller un peu plus loin.

8.2.1. Reconfiguration de base

dpkg peut être invoqué pour reconconfigurer Postfix avec quelques paramètres de base. Il faudra appeller dpkg-reconfigure avec l'option --priority=low.

L'appel de cette commande fera apparaître des écrans de configuration, identiques à ceux affichés lors de l'installation. Mais maintenant, grâce à l'option --priority=low, quelques paramètres supplémentaires pourront être renseignés :

  1. Type de configuration : même chose que dans la configuration initiale. On conservera le choix Système satellite

  2. Destinataire du courrier destiné au superutilisateur : on donnera une adresse email complète qui recevra tous les emails destinés à root

  3. Nom de courrier : même chose que pour l'installation. On veillera à bien rentrer le nom d'hôte complet (FQDN) de la machine.

  4. Serveur relais SMTP : paramètre déja vu à l'installation; c'est le serveur auquel nous allons envoyer tous les messages reçus, afin qu'ils soient acheminés à leur destination finale.

  5. Autres destinations pour lesquelles le courrier sera accepté : liste des domaines (en dehors de notre propre FQDN pour lesquels nous accepterons des messages. On peut laisser ce champ vide.

  6. Faut-il forcer des mises à jour synchronisées de la file d'attente des courriels : on peut répondre no si le répertoire data de Postfix est en ext3. Ce n'est pas un paramètre propre à Posfix, mais plutôt lié au système de fichiers. Lorsque l'on choisit yes, certains répertoires verront leur attribut synchrone modifié (avec chattr +S), indiquant à l'OS que toutes les opérations d'entrée sortie impliquant ce répertoire (ou un objet contenu dans ce répertoire) ne doivent pas être bufferisées mais écrits sur le disque de manière synchrone.

  7. Réseaux internes : liste des réseau pour lesquels on accepte de relayer le courrier. On saisira le réseau de loopback (127.0.0.0/8), notre subnet (192.168.17.0/24) et on y ajoutera celui prévu pour le déploiement du serveur OpenVPN (192.168.18.0/24).

  8. Taille maximale des boîtes aux lettres : on peut laisser la valeur par défaut puisque nous n'utilisons pas de « livraison locale » de message.

  9. Caractère d'extension des adresses locales : même chose ici. On peut laisser ce champ vide puisque nous n'avons pas de « livraison locale ».

  10. Protocoles internet à utiliser : choisir le protocole IP à utiiser. Nous n'utilisons qu'IPv4.

Lorsque tous les écrans de configuration sont passés, dpkg-reconfigure termine la configuration et redémarre le service.

root@ubuntu:~# dpkg-reconfigure --priority=low postfix
 * Stopping Postfix Mail Transport Agent postfix                          [ OK ] 
setting synchronous mail queue updates: false
setting myorigin
setting destinations: ubuntu.ath.cx, localhost.ath.cx, localhost
setting relayhost: smtp.free.fr
setting mynetworks: 127.0.0.0/8, 192.168.17.0/24, 192.168.18.0/24
setting mailbox_size_limit: 
setting recipient_delimiter: 
setting inet_interfaces: loopback-only
setting inet_protocols: ipv4
/etc/aliases does not exist, creating it.
adding root: alice@gmail.com alias
adding postmaster: alice@gmail.com alias

Postfix is now set up with the changes above.  If you need to make changes, edit
/etc/postfix/main.cf (and others) as needed.  To view Postfix configuration
values, see postconf(1).

After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.

Running newaliases
postalias: warning: /etc/aliases.db: duplicate entry: "postmaster"
 * Stopping Postfix Mail Transport Agent postfix                          [ OK ] 
 * Starting Postfix Mail Transport Agent postfix                          [ OK ]
root@ubuntu:/etc/postfix# 

8.2.2. Fichiers

Les fichiers de configuration de Postfix sont situés sous /etc/postfix. Deux fichiers sont nécessaires à la configuration : /etc/postfix/main.cf et /etc/postfix/master.cf.

Le premier contient la configuration de Postfix, tandis que le second définit le comportement des divers dæmons qui constituent la suite Postfix. En effet, Postfix n'est pas un simple serveur, mais une suite de dæmons et d'utilitaires qui se partagent la gestion des messages. C'est la volonté d'avoir une suite logicielle faite de composants bien cloisonnés[22] qui a conduit Wietse Venema à développer Postfix.

/etc/postfix/master.cf n'est modifié que dans le cas ou l'on utilise la livraison de message locaux ou quand on veut mettre en place un nouveau composant s'insérant dans la chaîne de messagerie (antivirus ou antispam par exemple), ce qui n'est pas notre cas ici. On s'interessera donc surtout à /etc/postfix/main.cf.

D'autres fichiers de configuration interviennent dans le fonctionnement de Postfix sans être directement des fichiers de configuration de Postfix. Le fichier /etc/mailname, par exemple, contient le nom de messagerie visible de notre système. Si l'on désire, par exemple, que tous les utilisateurs Unix de la machine puissent envoyer des emails en « @exemple.com », on mettra cette valeur dans le fichier.

root@ubuntu:~# cat /etc/mailname 
exemple.com
root@ubuntu:~# 

Le fichier /etc/aliases, lui aussi un peu à part, sera vu un peu plus loin (Section 8.2.4, « Alias »).

8.2.3. Principales directives

Les directives de main.cf peuvent être changées en éditant directement le fichier, mais on pourra préférer la méthode utilisant la commande postconf qui permet à la fois de lire et d'écrire les directives de mail.cf :

postconf en lecture :

postconf [clef]

postconf en écriture :

postconf -e clef = valeur

Appellé sans option, postconf affiche la totalité des valeurs de configuration (celles données dans /etc/postfix/main.cf et celles par défaut), tandis qu'en utilisant l'option -n, on ne verra que les valeurs modifiées explicitement dans le fichier de configuration.

root@ubuntu:~# postconf  
2bounce_notice_recipient = postmaster
access_map_reject_code = 554
address_verify_default_transport = $default_transport
...
519 lignes supprimées
...
virtual_transport = virtual
virtual_uid_maps = 
root@ubuntu:~#  postconf -n 
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = loopback-only
inet_protocols = ipv4
mailbox_size_limit = 
mydestination = localhost
myhostname = exemple.com
mynetworks = 127.0.0.0/8, 192.168.17.0/24, 192.168.18.0/24
myorigin = /etc/mailname
recipient_delimiter = 
relayhost = smtp.free.fr
smtp_generic_maps = hash:/etc/postfix/generic
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtpd_use_tls = yes
root@ubuntu:~# 

Chaque directive se présente sous la forme directive = valeur. La valeur peut utiliser d'autres directives définies ailleurs en précédant leur nom par « $ » :

mydestination = $myhostname

Quelques un de ces paramètres méritent d'être passés en revue dans le cadre de notre configuration. Pour connaître le détail de toutes les directives, on se réfèrera aux différents pages de man de Postfix (en particulier postconf(5)) ou au site officiel.

8.2.3.1. Pour qui sommes nous relais : mydestination et mynetworks

Lorsque l'on déploie un serveur de messagerie, on doit lui donner au minimum deux informations :

  • pour quels domaines acceptons nous des messages ?

  • depuis quels subnets acceptons nous des messages qui ne vont pas vers nos domaines ?

Cet aspect est fondamental : on n'accepte un message que s'il nous est destiné ou s'il provient d'une adresse IP pour laquelle nous relayons des messages. Si ces deux paramères ne sont pas renseignées correctement, notre serveur de messagerie peut se transformer en relais ouvert[23]. Postfix permet de configurer ces valeurs respectivement dans mydestination et mynetworks.

8.2.3.2. Protocole IP : inet_interfaces et inet_protocols

Postfix permet bien sûr de contrôler les interfaces sur lesquelles le dæmon smtpd sera à l'écoute, grâce à la directive inet_interfaces. On pourra utiliser la valeur all pour écouter sur toutes les interfaces (valeur par défaut), ou spécifier une liste d'adresses IP correspondant aux interfaces auxquelles on désire binder le dæmon.

root@ubuntu:~# postconf -e "inet_interfaces = all"

Lorsque nous avons demandé à ne faire que de l'IPv4 dans les écrans de configuration, la variable affectée était inet_protocols. Les valeurs permises sont all, ipv6 et ipv4.

8.2.3.3. Noms : myhostname et myorigin

La directive myhostname contient le nom FQDN de la machine. Cette valeur est renseignée par les écrans de configuration initiaux. Par défaut, Postfix utilise le nom obtenu avec l'appel système gethostname().

myorigin contient le nom qui doit être ajouté derrière un nom d'utilisateur lorsqu'un mail est envoyé localement. Si Alice (utilisateur : alice) envoie un courriel avec la commande mail sur le système, le contenu de myorigin sera ajouté après « @ » pour consituer son adresse.

Lors de l'installation, nous avons donné un nom de courrier. Ce nom a été utilisé pour remplir le fichier /etc/mailname. Et c'est ce même fichier qui est utilisé par Postfix dans la configuration pour affecter une valeur à myorigin :

root@ubuntu:~# postconf myorigin
myorigin = /etc/mailname
root@ubuntu:~# cat /etc/mailname 
exemple.com
root@ubuntu:~# 

8.2.3.4. Notre relais : relayhost

Le paramètre relayhost est particulièrement important dans notre configuration. En effet, c'est lui qui contrôle à quel serveur nous allons transmettre tout le courrier reçu pour qu'il soit livré à destination. Si ce paramètre n'est pas présent, Postfix essaiera lui-même de livrer les messages à destination. C'est donc un choix que l'on doit faire au déploiement, mais ce choix est très souvent dicté par au moins deux contraintes :

  • filtrage du port 25 : la plupart des fournisseurs d'accès bloquent l'accès au port 25 en sortie (en dehors de l'accès à leur propre serveur SMTP). Il ne sera donc pas possible de se connecter à un autre serveur SMTP que celui de son prestataire. Free Télécom fait exception à la règle car même si le port 25 est filtré par défaut, on peut le désactiver sur l'interface web d'administration de la FreeBox

  • blacklisting des pools d'IP client : beaucoup de serveurs de messagerie bloquent le traffic SMTP provenant d'adresses IP considérées comme des adresses de pools client dynamiques. On ne pourra donc pas envoyer de courriel aux domaines utilisant ce système de liste noire si notre adresse IP est dans cette liste.

[Attention]Attention

Si l'on désire tout de même se passer de relais, on devra surveiller l'activité du serveur de messagerie et en particulier les messages rejetés. On pourra ensuite déployer un mecanisme de transport alternatif pour les sites concernés. Mais on rentre alors dans un schéma d'exploitation très actif du serveur de messagerie.

8.2.4. Alias

Les alias permettent de réécrire l'adresse d'un courriel adressé à la machine locale. Même si nous n'acceptons pas de mail de l'extérieur à destination de la machine, beaucoup d'applications unix envoient des courriels à des utilisateurs locaux. crond, par exemple, essaie d'envoyer le resultat des commandes exécutées par email.

En utilisant les alias, nous pourrons envoyer les courriels de root vers une adresse externe (alice@gmail.com par exemple), nous évitant ainsi de lire les mails en local sur la machine.

Le fichier contenant les alias est en général /etc/aliases et son format est très simple :

utilisateur: nouveau_destinataire

Par exemple, si l'on veut envoyer les mails de root à alice@gmail.com, on ajoutera une ligne :

root: alice@gmail.com

On pourra utiliser des redirections multiples, elles seront correctement résolues :

postmaster: root
root: alice@gmail.com

Cette configuration enverra les mails de root et de postmaster à alice@gmail.com.

[Attention]Attention

La RFC 2142 (voir [RFC2142]) rend obligatoire la mise en place d'un certain nombre d'adresses (postmaster, abuse, ...), dépendant des services mis en place. Pas de problème dans le cas d'un système isolé qui ne prend pas d'email entrant, mais il faudra considérer ce point lors du déploiement d'un serveur public.

Le chemin fichier d'alias est défini par la directive de configuration alias_maps. Après avoir modifié ce fichier, il faudra le mettre à jour le fichier de base de données utilisé par postfix (/etc/aliases.db) avec la commande newaliases. Cette commande essaiera de mettre à jour la base avec le fichier pointé par la variable alias_database. On pourra donc utiliser la configuration suivante :

alias_database = $alias_maps
alias_maps = hash:/etc/aliases

8.2.5. Réécriture d'adresse

Notre système servira essentiellement de relais de messagerie sortant pour des utilisateurs du réseau local ou de la machine locale. Pour les clients locaux qui veulent réécrire complètement leur adresse (et pas seulement ajouter un nom de domaine à la fin comme avec myorigin, Section 8.2.3.3, « Noms : myhostname et myorigin »), on devra utiliser une table générique de réécriture. Cette table de réécriture change uniquement les adresses de destination. Les adresses locales sont réécrites par la table /etc/aliases

Cette table peut se trouver n'importe ou, mais il est souhaitable de la mettre dans /etc/postfix. Elle contiendra des entrées sous la forme :

adresse_initiale   adresse_finale

Les adresses initiales utilisées s'entendent :

  • après l'utilisation des alias (pour les destinataires locaux uniquement)

  • après l'ajout de myorigin

Par exemple, avec la configuration ci-dessous :

root@ubuntu:~# cat /etc/aliases
# See man 5 aliases for format
root:   eve
postmaster:     bob@exemple.com
root@ubuntu:~# cat /etc/postfix/generic
root@exemple.com        mallaury@gmail.com
oper@exemple.com        bob@gmail.com
root@ubuntu:~# 

un email envoyé par l'utilisateur oper à destination de root terminera sa course dans la boite de eve@gmail.com et semblera provenir de bob@gmail.com.

Transformations appliqués à l'adresse de l'expéditeur :

oper              --[ myorigin ]--> oper@exemple.com
oper@exemple.com  --[ generic  ]--> bob@gmail.com

Transformations appliqués à l'adresse du destinataire local :

root              --[ aliases  ]--> eve
eve               --[ myorigin ]--> eve@exemple.com

Si l'adresse cible n'a pas de domaine, postfix ajoute $myorigin

Si le message avait été envoyé à postmaster, c'est bob@exemple.com qui l'aurait reçu.

Afin de pourvoir utiliser le fichier /etc/postfix/generic, nous devons ici aussi le transformer en base de données, mais cette fois avec la commande postmap :

root@ubuntu:~# postmap /etc/postfix/generic

Enfin, on indiquera à Postif que l'on souhaite mettre en place la réécriture d'adresse avec les éléments de ce fichier avec la directive smtp_generic_maps :

postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic'



[22] Par opposition à l'historique Sendmail d'Eric Allman

[23] Même si dans notre cas cette probabilité est faible puisque la configuration utlisée concerne un relais interne.