POSTFIX : LA DOCUMENTATION

SOMMAIRE

I. Présentation générale
II. Anatomie
III.
Installation et configuration de base
IV. Lutte anti-SPAM
V. Contrôle des taux
VI. Contrôle des ressources
VII. Manipulation des adresses


Adaptation française Cyril Jovet (cjovet@free.fr)
Site officiel www.postfix.org
Dernière mise à jour : 23 juillet 2002
   I. Présentation générale
Postfix est le système de courrier crée par Wietse Venema, également auteur des TCP wrappers, reconnus pour leur intérêt dans le domaine de la sécurité, et pour la qualité du code par toute la communauté des logiciels libres.
Nommé Secure Mailer lors de la première version en 1998, il fut publié comme logiciel libre (IBM public licence) sous le nom de Postfix.

Avec près de 100 millions d'utilisateurs, ce sont des milliards de méls qui circulent chaque jour. L'objectif à la conception de Postfix était de réaliser un système de courrier alternatif à Sendmail (environ 70% des serveurs de messagerie), qui soit rapide, facile à administrer et sécurisé tout en étant autant que possible compatible avec Sendmail.
   I.1 Objectifs principaux

Large diffusion

Postfix doit être largement diffusé et utilisé afin d'avoir un impact sensible sur les performances et la sécurité des systèmes de messagerie sur l'Internet.
C'est pourquoi Postfix est un logiciel libre sans aucune restriction.

Performance

Postfix est au moins trois fois plus rapide que son plus proche « rival » (Qmail de D.Bernstein).
Un serveur Postfix sur un PC de bureau peut envoyer et recevoir quotidiennement un million de méls différents.
Postfix utilise les « trucs » utilisés sur les serveurs Web pour réduire la création de processus, et d'autres types de « trucs » permettent de réduire l'utilisation du système de fichiers, tout ça sans compromettre les performances.

Compatibilité

Postfix a été conçu pour être compatible avec Sendmail afin de facilité la migration. Les fichiers /var[/spool]/mail, /etc/aliases, NIS, et ~/.forward sont utilisés.
Toutefois, l'administration devant être simple, Postfix n'utilise pas de fichier sendmail.cf :-).

Sûreté et robustessse

Postfix se comporte de façon rationnelle face aux nombre de tâches demandées. Si le système n'a plus de mémoire ou d'espace disque, Postfix n'endommagera pas les choses d'avantage, il a été conçu pour rester sous contrôle.

Flexibilité

Postfix est conçu de façon modulaire, une douzaine de petits programmes effectent des tâches bien précises.
Il est possible de remplacer les programmes par défaut par des produits maison, voire de supprimer certains programmes inutiles dans certains cas (un firewall ou une station de travail n'a pas besoin de livrer localement des méls).

Sécurité

Postfix utilise plusieurs niveaux de défence afin de protéger le système de toute intrusion. Chaque programme est enfermé dans sa cage (chrooté), il n'y a aucun lien direct entre le réseau et les programmes sensibles comme la livraison du courrier local. Postfix ne fait même pas confiance à ses propres files de courier. De plus, aucun des programmes n'est SUID.

   I.2 Autres fonctionnalités intéressantes

Différentes solutions de transport

Outre smtp, il est possible d'implémenter d'autres solutions de transport des messages comme uucp, ²DECnet ou X400 sans avoir recours à d'autres systèmes.

Domaines virtuels

Le changement d'une seule table suffit à ajouter un domaine virtuel au système de courrier, là où plusieurs niveaux d'alias et de redirections sont nécessaires avec d'autres systèmes.

Contrôle UCE

L'accès au système Postfix est contrôlé. Les suspects usuels sont reconnus : requêtes rbl et dns sur les adresses expéditeurs, expéditeur de la commande HELO, listes noires. Le contrôle du contenu n'est pas encore implémenté.

Tables

Postfix ne possède pas encore de langage pour la réécriture des adresses mél, à la place un usage extensif de requêtes sur des tables db, dbm
et nis est réalisé. D'autres systèmes de gestion de bases de données peuvent être ajoutés de façon relativement simple (mysql).

   I.3 Architecture globale

Introduction

Certains systèmes de courrier comme Sendmail fonctionnent sous la forme d'un seul programme monolithique qui se charge de tout.
Il est facile dans cette configuration de partager les données entre différentes parties du programme, mais il est aussi facile de faire des erreurs fatales.

D'autres systèmes utilisent une hiérarchie rigide de programmes qui permet leur utilisation dans un ordre clairement défini.
Cette approche permet une meilleure isolation des éventuels problèmes au prix d'un plus grand nombre de processus et d'une communication inter-processus plus importante.

Ce prix peut être maintenu dans une marge acceptable en tronçonnant la fonction globale assez finement.

Architecture

Postfix est basé sur des programmes semi-residents, coopérant, assurant chacun une tâche bien précise, sans relation père-fils entre eux.
L'un des avantages est de rendre chaque service, comme la réécriture des adresses par exemple, disponible à tous les proccessus sans augmenter le nombre de processus.

Un démon-maître (master) résident se charge de lancer les différents programmes en fonction des besoins. Ces processus peuvent être dupliqués un nombre configurable de fois, sont réutilisables un nombre configurable de fois et s'arrêteront au bout d'un temps configurable également.
Cette méthode réduit de manière drastique la création de processus, tout en fournissant une bonne isolation entre les programmes.

   I.4 Gestion des files

Files de courrier

Postfix utilise quatre files d'attentes :

maildrop
contient les messages locaux ;

incoming
contient les messages qui ont été prélevés dans maildrop par le démon pickup, puis qui ont été traités par le démon cleanup.
Cette file contient aussi les messages venant de l'extérieur. En bref, elle contient les messages qui n'ont pas encore été traités par
le gestionnaire de file d'attente qmgr ;


active est une file contenant les messages en cours de délivrance par qmgr ;

deferred
contient les messages qui n'ont pas pu être délivrés (il y en a 10 dans notre exemple ci-dessous).
De plus, le répertoire /var/spool/postfix/defer contient les mails en attente plus longue et des répertoires qui sont « hachés » afin de ne pas
avoir des répertoires contenant trop de fichiers : ainsi, le fichier 7B345AC0B1, par exemple, sera dans defer/7/B/7B345AC0B1.

Le contenu de la file d'attente peut être consulté avec la commande mailq (les habitués de sendmail ne seront pas dépaysés...) normalement celle-ci ne doit produire que les messages dont la délivrance n'a pas encore eu lieu.

Le gestionnaire de files ne garde en mémoire que les informations concernant la file active.
La taille de cette file est limitée car le gestionnaire de files ne devrait jamais se trouver à cours de mémoire à cause d'un pic du trafic de courrier.
Dès qu'il y a de la place dans la file active, le gestionnaire de files y laisse entrer un message de la file incoming, puis un message de la file deferred.
Cette méthode garantit le passage des nouveaux même lorsque la file deferred est particulièrement longue.

Gentillesse et équitabilité

Postfix essaye d'être un bon voisin. Quand il délivre un mél à un site distant, Postfix n'établiera pas plus de deux connexions pour commencer.
Tant que les livraisons réussissent, le nombre de connexions augmente jusqu'à une limite configurable (ou que le réseau soit saturé) et diminue en cas de problèmes.

Le gestionnaire de files d'attente trie les messages par groupe et effectue un roulement afin d'expédier les messages suivant leur destination.
Postfix enverra plusieurs messages simultanément au même domaine seulement s'il n'y a pas assez de traffic pour maintenir tous les canaux de sortie SMTP occupés. Ainsi, lorsque AOL se coupe puis redevient disponible, le système continue à livrer les autres messages.

Quand les messages arrivent plus vite qu'ils ne partent, Postfix donne la priorité aux nouveaux messages. L'idée est que les messages les plus récents doivent être délivrés avec le plus court délai, alors que les messages les plus anciens sont délivrés lorsque l'activité réduit

Archivage exponentiel

Postfix effectue un archivage exponentiel. Quant un message n'est pas envoyé à la première tentative, le gestionnaire de files marque ce message à une date future (le décalage est paramètrable). Les messages ayant cette date future sont ignorés par le gestionnaire de files.

Si la deuxième tentative échoue, une nouvelle marque est posée, le décalage correspondant au double de l'âge du message. Ainsi, le temps écoulé entre deux tentatives double à chaque échec. Cette méthode qui s'appelle l'archivage exponentiel.

Sauvegarde du statut des destinations

Le gestionnaire de files maintient une liste limitée, à court-terme, de destinations inaccessibles. Cette liste permet d'éviter des tentatives de livraison qui échoueraient. Cette fonctionnalité montre tout son intérêt lorsque les messages archivés pour cette destination sont nombreux.

Exemple :
# tree /var/spool/postfix/
/var/spool/postfix/
|-- active ...
|-- deferred
|     |-- 048ED779D1
|     |-- 09085779E0
|     |-- 17101779D6
|     |-- 31DE0779DA
|     |-- 3D15D779D4
|     |-- 4D2BD779D7
|     |-- 7BFA6779D3
|     |-- 7C65D779CF
|     |-- B10C3779D0
|     `-- C3272779D2 ...
|-- incoming ...
|-- maildrop ...

 

   I.5 Communication inter-processus

À des fins de confidentialité, les processus communiquent via des piles fifo ou des sockets du type unix-domain, placés dans un répertoire protégé.

La quantité d'information passée entre les processus se limite bien souvent au nom d'un fichier file et à une liste de destinataires, ou à une information sur le statut du programme.

Pour éviter tout perte d'informations, Postfix utilise les mécanismes habituels pour s'assurer de la transmission des données, flush, fsync(), analyse des résultats d'appels système.

   I.6 Sécurité

Introduction

Par définition, les programmes de courrier traitent des informations provenant de sources potentiellement dangeureuses.
Un système de courrier doit donc être écrit avec une grande attention quand il utilise les droits d'un utilisateur, cela même s'il n'est pas directement connecté à un réseau.

Postfix est un système complexe. La première version comprenait 30000 lignes de code, sans compter les commentaires.
Avec un programme aussi complexe, la sécurité du système ne doit pas dépendre d'un seul mécanisme. Sinon, une seule suffirait à rendre vulnérable l'ensemble du logiciel.
Postfix utilise donc plusieurs couches de défense contre des erreurs logicielles ou autres.

Moindre privilège

La plupart des démons de Postfix peuvent être lancés avec de moindres privilèges et dans un environnement fermé (chroot).
Cela est plus particulièrement vrai pour les programmes directement exposés au réseau, comme les serveurs et clients smtp.
Bien que l'enfermement et les privilèges les plus bas ne soient pas suffisants pour assurer une sécurité absoluement parfaite, cela y contribue fortement.

Isolation

Postfix utilise des processus différents afin d'isoler les activités de chacun. En particulier, il n'y a aucun lien entre le réseau et les programmes de livraison local particulièrement sensibles en terme de sécurité. Un intrus devra passer au travers de plusieurs programmes pour arriver à ce niveau.
Certaines parties du système Postfix sont multi-threadées, toutefois, aucune des parties en contact direct avec le réseau ne l'est.
La séparation des processus fournit une bien meilleure isolation que le multi-thread utilisant un espace de nom commun.

Environnement controlé

Aucun des programmes de livraison de Postfix ne nécessite de droits utilisateur. Au lieu de cela, la majorité des programmes Postfix fonctionne sous le contrôle du démon-maître (master) résident qui lui-même est dans un environnement controlé, sans aucune relation père-fils avec un quelconque processus utilisateur. Cette méthodologie permet d'exclure tout exploit utilisant les fichiers ouverts, les signaux, les variables d'environnement que les systèmes Unix passent de pères éventuellement mal-intentionnés à leurs processus fils.

Programme SUID

Aucun programme postfix n'est SUID.
L'introduction de ce concept a été la plus grosse erreur de l'histoire d'Unix. Le positionnement du bit UID pose bien plus de problèmes qu'il n'en résoud.
Chaque fois qu'une nouvelle fonctionnalité a été ajoutée au système Unix, set-uid a entrainé un problème de sécurité : librairies partagées, système de fichiers /proc, support multi-langage, pour n'en mentionner que quelques-unes. De plus, set-uid rend impossible l'utilisation de fonctionnalités qui ont rendus les successeurs d'Unix si attractifs, comme plan9 et les espaces de noms du système de fichiers par processus.

Par défaut, le répertoire de la file maildrop est accessible en écriture au monde entier, afin que les différents processus locaux puissent poster leurs courriers sans requérir l'assistance d'une commande set-uid ou du démon serveur de courrier. Ce répertoire n'est pas utilisé pour les messages venant du réseau et les fichiers de files ne peuvent pas être lus par les autres utilsateurs.

Un répertoire accessible en écriture offre des possibiltés en terme de vulnérabilité : un utilisateur local peut faire des liens durs vers les fichiers de file d'un autre utilisateur afin que cette file ne soit jamais libérée et/ou que ses messages soient livrés plusieurs fois ; un utilisateur local peut remplir le répertoire de la file maildrop de cochoneries et essayer de faire planter le système ; un utilisateur local peut aussi faire des liens durs vers les fichiers de quelqu'un d'autre pour se les faire délivrer par mél. Toutefois, les fichiers de files Postfix ont un format particulier ; la probabilité qu'un fichier non-Postfix soit reconnu comme tel est de moins d'un sur 10 puissance 12.

Si le fait que le répertoire de la file maildrop soit accessible en écriture au monde entier vous semble inacceptable, vous pouvez ne pas utiliser cette solution, révoquez les droits sur le répertoire et préférez l'activation des privilèges set-gid à un petit programme fourni (postdrop) pour permettre aux processus locaux d'envoyer leurs messages.

Confiance

Les fichiers de files ne sont pas écrits sur le disque lorsque la destination est sensible, comme pour des fichiers ou des commandes.
Au lieu de cela, les programmes tel que l'agent de livraison local essayent de prendre leurs décisions avec le souci de la sécurité sur la base des informations reçues initialement.

Bien sûr, les programmes Postfix ne font pas confiance aux données reçues du réseau. En particulier, Postfix filtre les données fournies par l'utilisateur avant de les exporter via des variables d'environnement. S'il y a une leçon à tirer de ce que les administrateurs ont appris des désastres de la sécurité des sites web, c'est bien ceci : ne laissez jamais des données reçues du réseau approcher de l'interpréteur de commandes.
Le filtrage est la meilleure des possibilités possibles.

Données volumineuses

La mémoire pour les chaînes de caractères et les tampons est affectée dynamiquement afin d'éviter tous problèmes de dépassement de tampon.

Les lignes longues dans les messages sont fractionnées en morceaux de taille raisonnable et réassemblées à la livraison.

Les diagnostics sont également fractionnés (en un seul endroit !) avant d'être passés au démon syslog afin d'éviter des dépassements de tampons sur les plateformes les plus anciennes. Toutefois, le tronçonnement des données passées aux appels système ou aux librairies n'est pas généralisé.
Sur certaines plateformes, le programme peut entraîner des problèmes de dépassements de tampon, à cause du logiciel utilisé dans les couches inférieures.

Aucun dispositif de défense contre les lignes de commande anormalement longues n'est réalisé, les noyaux Unix imposant leur propre limite, suffisante pour bloquer les programmes ou les utilisateurs mal-intentionnés.

Autres défenses

Le nombre d'instances d'un objet donné en mémoire est limité, afin d'éviter au système de devenir instable en cas de charge importante.

En cas de problème, le programme se mettra en veille avant d'envoyer un message d'erreur au client, avant de se planter sur une erreur fatale,
ou avant d'essayer de redémarrer un logiciel défaillant. L'objectif est d'éviter de détériorer davantage une éventuelle situation de problème.

    II. Anatomie de Postfix
Le logiciel libre Postfix est un gestionnaire de messagerie simple à mettre en place et conçu pour une sécurité optimale.
Contrairement aux autres systèmes de messagerie, Postfix est composé de nombreux petits programmes réalisant chacun une tâche bien définie.
Pour la pluspart, ces programmes ne sont pas vus par l'utilisateur mais directement appelés par le système.

Il est peu gourmand en ressources système et constitue donc une véritable alternative à son concurrent direct Sendmail.
Le choix de Postfix est légitime tant pour le traitement de flux importants de messages que pour de petites installations.
De plus, Postfix est compatible au maximum avec sendmail.

Vous trouverez ci-dessous le schema du système dont nous allons essayer d'analyser grossièrement le fonctionnement.

La figure montre les composants principaux du système Postfix et le cheminement de l'information entre eux.
Les ellipsoïdes jaunes sont des programmes de courrier.
Les boîtes jaunes sont des files d'attente ou des dossiers de courrier.
Les boîtes bleues sont des tables de consultation.
L'ensembles des programmes situés dans le cadre noir fonctionnent sous le controle du démon master.
Les données situées dans le cadre noir appartiennent au système de courrier Postfix.

Afin de maintenir une grande image lisible les éléments suivants ont été omis:
Les utilitaires "ligne de commande" de Postfix.
Le démon master de Postfix.
Les requêtes DNS par les démons de serveur et de client SMTP.
Le démon bounce ou defer qui gère le "rebon" des e-mails.
Les requêtes de réécriture et de résolution d'adresse du serveur de SMTP et de l'agent local de la livraison.
Le cheminement du courrier expédié par l'agent local de la livraison.
Le cheminement des notifications de postmaster pour des erreurs de protocole, des violations de politique, etc...
Les déclenchements pour alerter le démon de collecte et le gestionnaire de files d'attente que le nouveau courrier est arrivé dans le maildrop et les files d'attente entrantes, respectivement. --
Toutes les opérations de postfix sont bien compartimentés. Cela garantit donc une sécurité optimale.
    II.1 Réception du Courrier
Lors qu'un message arrive dans le système de courrier Postfix, qu'elle que soit son origine, son premier arrêt se fait dans la file d'attente Incoming.
La figure ci-dessous montre les composants principaux qui sont impliqués lors de l'arrivée d'un nouveau courrier.

    II.1.1 Origine du courrier :

Le courrier est posté localement.

Le courrier est posé sur la machine locale par les utilisateurs.
Le programme sendmail (ne pas confondre avec le MTA concurrent) de postfix appelle le programme privilégié postdrop qui dépose le message dans le répertoire de la file maildrop, où le message est pris par le démon de collecte pickup.
Ce démon fait quelques contrôles "sanitaires", afin d'éviter de polluer le reste du système de mail avec du courrier invalide.
Pour éviter des accidents, les permissions du répertoire contenant maildrop sont telles que tout le monde peut y écrire, mais aucun utilisateur n'a le droit d'effacer le contenu (sticky bit positionné).

Le courrier provient du réseau.

Le serveur SMTP Postfix (smtpd) reçoit le message et fait quelques contrôles "sanitaires", afin de protéger le reste du système Postfix.
Le serveur SMTP peut être configuré pour mettre en application des commandes d'ECU (Unsollicited Commercial Mail) sur la base de listes noires locales ou issues du réseau, de requêtes DNS (domaine de l'expéditeur) ou toute autre information concernant l'émetteur.

Autres origines possibles.

Le courrier peut être généré par le système Postfix lui-même, dans le but de renvoyer un message non-délivrable à son expéditeur, c'est le démon bounce ou defer qui se charge de ce travail.

Le courrier peut aussi être généré par l'agent local de remise (local) après interrogation de la base d'alias ou du fichier .forward propre à l'utilisateur.

Enfin, le courrier est généré par le système Postfix pour avertir le postmaster d'un problème (chemin indiqué par la flèche qui n'aboutit pas).
Postfix peut être configuré pour alerter le postmaster en cas de problème de protocole SMTP,de violation de règles de sécurité UCE etc ...

    II.1.2 Traitement du courrier :

Le message est livrable

Le courrier est expédié par l'agent local de la livraison local, soit par l'intermédiaire d'une entrée dans la base de données des alias, soit par l'intermédiaire d'une entrée dans le fichier .forward au niveau de l'utilisateur (ce chemin est indiqué sur le graphique par la flèche sans label).

Le démon de nettoyage cleanup met en application l'étape de traitement finale pour le nouveau courrier. Il ajoute le champ From: et d'autres en-têtes manquantes dans le message, il demande éventuellement au demon trivial-rewrite de réécrire l'adresse de réponse dans le format standard user@fully.qualified.domain, et il extrait optionnellement les adresses des destinataires de l'en-tête.
Le démon cleanup insère le résultat sous la forme d'un seul fichier dans la file d'attente incoming, et informe le gestionnaire de files d'attente queue manager (qmgr) de l'arrivée du nouveau courrier.
Le démon cleanup peut être configuré pour transformer des adresses sur la base des table de consultations canonical et virtual.

Le courrier n'est pas livrable

Un e-mail est généré automatiquement par le système Postfix, afin de renvoyer le courrier non livrable à  l'expéditeur.
Ce sont les démons bounce ou defer qui annoncent la mauvaise nouvelle.

Un autre e-mail est également généré automatiquement par le systèle Postfix pour informer le responsable de la messagerie (postmaster) en cas de problème (ce chemin est indiqué sur le graphique par la flèche sans label).

Postfix n'implémente pas encore un véritable language de réécriture des adresses. L'implémentation d'un tel langage demanderait des efforts non-justfiés, la plupart des sites n'en n'ayant pas besoin. A la place de cela, Postfix utilise des requêtes sur des tables.

    II.2 Livraison du courrier

Une fois qu'un message a atteint la file d'attente incoming, l'étape suivante consiste à le livrer.
La figure montre les principaux composants du système de distribution du courrier de Postfix.

Le gestionnaire de file d'attente qmgr (queue manager) est le cœur du système de messagerie Postfix.
Il contacte les agents de livraison local, smtp, lmtp ou pipe et envoie une demande de livraison avec le chemin d'accès au fichier qui contient la file d'attente, l'adresse de l'expéditeur, le nom de l'hôte à qui il faut livrer si la destination n'est pas locale, et une où plusieurs adresses de destinataires.

Le gestionnaire maintient une file d'attente deferred séparée pour chaque message qui n'a pas pu être livré (pour des raison temporaires), de manière à ce qu'un compte-rendu de livraison trop volumineux ne vienne pas ralentir l'accès des autres files.

Le gestionnaire maintient une petite file d'attente active avec juste quelques messages prêts pour la livraison.
active agit comme une petite fenêtre sur les files d'attentes incoming ou deferred.
Cette méthode évite au gestionnaire de faire des débordements de mémoire si le serveur est fortement chargé et évite ainsi de consommer trop de ressources.

Optionnellement, le gestionnaire fait "rebondir" le message pour les destinataires qui sont référencés dans la table relocated.
Cette table contient des informations sur les utilisateurs qui ont changé d'adresse.

Sur la demande du gestionnaire de file d'attente, le daemon trivial-rewrite résout les destinations.
Par défaut, il fait uniquement la distinction entre les destinations locales ou distantes.
Des informations de routage additionnelles peuvent être spécifiées dans la table transport.

Sur la demande du gestionnaire de file d'attente, les daemons bounce et defer gênèrent des rapports de non-livraison lorsqu'un message ne peut être acheminé, soit à cause d'une erreur non récupérable, soit parce que le destinataire n'est pas joignable pendant une durée trop longue.

L'agent local de la livraison sait gérer les boîtes aux lettres de type UNIX, les bases de données du type "alias" de sendmail (le MTA concurrent), les fichiers de type .forward de l'utilisateur.
De multiples agents locaux de livraison peuvent être exécutés en parallèle, mais la livraison en parallèle au même utilisateur est habituellement limitée.

Avec l'agent de livraison sendmail de Postfix qui permet de poster des courriers, l'agent de livraison local forme l'interface utilisateur familière de sendmail (le MTA concurrent).

L'agent de la livraison locale a la possibilité d'utiliser d'autres moyens de livraison locale : vous pouvez le configurer pour qu'il livre le courrier dans le répertoire home des utilisateurs, et vous pouvez même le configurer pour déléguer la livraison du courrier à une commande externe telle que le programme procmail bien connu.

Le client smtp recherche une liste d'échangeurs de courrier pour l'hôte de destination, trie la liste par préférence, et essaie chaque adresse alternativement jusqu'à ce qu'il trouve un serveur qui répond.
Sur un système postfix chargé, vous verrez plusieurs processus de client de smtp fonctionner en parallèle.

Le démon pipe est l'interface unique de sortie vers d'autres modes de transport de courrier (Le programme sendmail est l'interface d'entrée).

Le système de courrier Postfix peut par exemple livrer du courrier par l'intermédiaire du protocole UUCP.
Ce protocole vénérable est encore largement répandu.
Par défaut, Postfix comprend des adresses de type "bang path" (Rassurez-vous, ici on parle de SMTP, pas de UUCP qui n'est plus de mise sur Internet, mais seulement dans des réseaux privés).

   II.3 Postfix côté coulisses
Les sections précédentes ont donné une vue d'ensemble simplifiée de la façon dont le système Postfix envoie et reçoit le courrier.

Plusieurs autres choses se produisent dans les coulisses.
Malheureusement, il est difficile de visualiser cela sur un affichage bidimensionnel, voila pourquoi ce document n'a aucune illustration.

Le démon master est le processus de surveillance qui garde un oeil sur le bien-être du système de courrier.
Il est typiquement lancé au démarrage du système par la commande postfix, et continue à fontionner jusqu'à ce que le système s'arrète.
Le démon master lance tous les autres processus de Postfix sur demande, il peut même relancer un démon qui s'est terminé prématurément en raison d'un problème.
Il peut également imposer des limites sur le nombre de processus lancés par les démons comme indiqué dans le fichier de configuration master.cf.

Le démon bounce ou defer est sollicité par n'importe quel autre démon afin de logger les messages non livrés (non-delevery).
De même, le démon trivial-rewrite est appelé pour réécrire une adresse sous la forme user@fully.qualified.domain ou pour résoudre des noms de domaines.

Le démon showq donne l'état de la file d'attente de Postfix. Ce programme se cache derrière la commande mailq.

Le démon flush améliore l'exécution de la demande de smtp ETRN, et de son équivalent en ligne de commande : sendmail -qRdestination, pour les destinations choisies.
Pour d'autres destinations, Postfix utilise l'équivalent du sendmail - q.

Le démon spawn écoute sur un port de TCP, une socket UNIX-domaine ou une connexion FIFO, et lance une commande non Postfix avec la socket ou la connexion FIFO reliée au flux d'entrée, de sortie et d'erreur standard. Il est actuellement employé seulement pour utiliser un système de filtrage externe à Postfix.
     II.4 Les commandes

Assez parlé de démons, pour finir, nous parlerons des utilitaires "ligne de commandes" livrées avec postfix qui vous serviront à maintenir le système.
Sans compter les commandes sendmail , mailq , et newaliases qui ont déjà été présentées, le système Postfix possède une collection de commandes très utiles.
Pour des raisons d'homogénéïté, elle seront toutes nommées postquelquechose.

La commande postfix controle le système de courrier.
C'est l'interface pour démarrer et arrêter le système, et pour quelques autres opérations administratives.
Cette commande est réservée au super-utilisateur.
Exemples :
#/etc/init.d/postfix reload force postfix à relire ses fichiers de configuration (après modif. du /etc/postfix/main.cf).
#/etc/inid.d/postfix check vérifie la configuration du système de courrier.
#/etc/inid.d/postfix flush force postfix à tenter de vider la file deferred, donc à envoyer les messages en attente.

La commande postalias sert à convertir le fichier aliases en format bases de données (*.db).
Ce programme se cache derrière la commande newaliases.

La commande postcat montre les contenu de la file d'attente de Postfix.
C'est un programme limité, il peut être remplacé par un autre plus puissant qui permettrait d'éditer les fichiers de file d'attente de Postfix.

La commande postconf montre les paramètres donnés dans le fichier main.cf de Postfix : les valeurs réelles, les valeurs par défaut, ou les paramètres qui n'ont pas de valeur par défaut.
C'est un programme limité et primaire. Ce programme peut être remplacé par un autre plus puissant qui pourrait non seulement énumérer mais également éditer le fichier main.cf.
Exemples :
#postconf -n affiche les paramètres modifiés par notre configuration.
#postconf -d affiche les paramètres par défaut.

La commande postdrop est appelée par le programme sendmail afin de déposer le courrier dans la file d'attente maildrop.

La commande postkick permet de lancer des commandes internes.

La commande postlock assure le mécanisme de verrouillage des boîtes aux lettres utilisateurs qui peut être utilisé par exemple par des shell scripts.

La commande postlog rend la journalisation de Postfix accessible aux shell scripts.

La commande postmap sert à convertir en format base de données des tables de consultation de Postfix telles que canonical , virtual et d'autres.
C'est un cousin de la commande de makemap d'UNIX.

La commande postqueue est l'utilitaire lancée par la commande de sendmail pour vider ou lister la file d'attente du courrier.

La commande postsuper sert à la maintenance de la file d'attente de Postfix.
Cette commande est lancée lors du démarrage du système de courrier.

    III. Installation et Configuration de base
    III.1 Installation
    III.1.1 Installation à partir des sources

Compilation

Le logiciel se récupère sous la forme d'un fichier .tar.gz que l'on décompresse dans un répertoire d'installation :

# tar xvzf postfix-19991231-pl08.tar.gz -C /tmp
# cd /tmp/postfix-19991231-pl08/

Dans ce répertoire se trouve un fichier INSTALL fort clair (mais en anglais) qu'il suffit de suivre pas à pas pour installer et configurer postfix.

La première étape consiste à générer les exécutables :
# make
Il faut ensuite déplacer les fichiers binaires, de configuration et les pages de manuel dans les répertoires adéquats de votre système.
Sous le répertoire d'installation, vous devez normalement avoir les répertoires : conf, bin, libexec, html et man (les autres répertoires sont ceux contenant les sources, des exemples et les fichiers objets générés par la compilation).
Pour compiler avec support MySql :
# make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm'
# ./make

Installation de la documentation

Pour installer les pages de manuel, il suffit de déplacer le contenu des répertoires /tmp/postfix-19991231-pl08/man/man dans les répertoires correspondants sur votre système (/usr/man/man sur une machine Linux, /usr/local/man/man sur une machine FreeBSD).
Puis, vous pouvez installer le reste de la documentation.
Pour rester compatible avec les documentations des autres logiciels de mon système Linux, vous pouvez créer un répertoire /usr/doc/postfix dans lequel vous déplacerez tous les fichiers de documentation du répertoire d'installation (leurs noms sont en majuscules).
Créez également le répertoire /usr/doc/postfix/html et déplacez-y le contenu du répertoire html de l'installation (pour FreeBSD, on fait de même et on crée l'arborescence /usr/local/share/doc/postfix).

Installation des fichiers de configuration

Sous Linux, tous ces fichiers vont dans un seul emplacement : /etc/postfix, sous FreeBSD, ils iront dans /usr/local/etc/postfix.
Je me bornerai ici à suivre ce qui est indiqué dans INSTALL (adaptez le chemin des fichiers de configuration à votre système) :
# mkdir /etc/postfix
# chmod 0755 /etc/postfix
# mv /tmp/postfix-19991231-pl08/conf/* /etc/postfix
# chmod 0644 /etc/postfix/*
# chmod 0755 /etc/postfix/postfix-script*

Création des files d'attente

Postfix utilise une arborescence beaucoup plus élaborée que celle de ses prédécesseurs pour placer les messages en attente de délivrance.
Il suffit ici d'en indiquer la racine (/var/spool/postfix/, généralement) car tous les autres sous-répertoires y seront créés lors du premier démarrage de postfix :
# mkdir /var/spool/postfix
# chmod 0755 /var/spool/postfix
Vous pouvez choisir un autre emplacement : celui-ci devra être indiqué lors de la configuration que nous étudions plus loin.

Installation des exécutables

Là encore, vous êtes libres de choisir l'emplacement qui vous convient car il suffira ensuite de l'indiquer lors de la configuration.
La méthode généralement pratiquée consiste à séparer les commandes des démons :
les premières sont initialement dans le répertoire bin et iront dans /usr/local/sbin avec des liens de /usr/sbin vers eux), les seconds sont initialement dans libexec et iront dans /usr/local/libexec/postfix) :
# cd /tmp/postfix-19991231-pl08/bin
# cp post* sendmail /usr/local/sbin
# mkdir /usr/local/libexec/postfix
# cp `ls | egrep -v 'post|fsstone|smtp-|sendmail'`/usr/local/libexec/postfix

Droits d'accès à la file d'attente

Il s'agit ici de permettre l'accès des utilisateurs locaux au répertoire /var/spool/postfix/maildrop.
Par défaut, tous les sous-répertoires de /var/spool/postfix appartiennent au groupe root.
Or, lorsque les utilisateurs postent un courrier, celui-ci transite d'abord par le répertoire maildrop.

Avec les droits actuels, ces courriers seraient donc refusés.
Plusieurs possibilités, décrites dans le fichier INSTALL, sont possibles : rendre le répertoire maildrop accessible à tout le monde, ou utiliser la commande postdrop en sgid. Nous avons retenu la première solution. Pour ce faire, il suffit de modifier les droits d'accès du répertoire maildrop : # chmod 1733 /var/spool/postfix/maildrop
Cette solution suppose que vous ayez confiance en vos utilisateurs locaux...
Si ce n'est pas le cas, préférez-lui la solution du postdrop en sgid (décrite dans le fichier INSTALL).

L'invocation de la commande postdrop lors de l'envoi d'un message est réalisée automatiquement via l'appel du script postfix-script qu'il s'agit donc de rendre accessible à tout le monde :
# cp /etc/postfix/postfix-script-nosgid /etc/postfix/postfix-script

    III.1.2 Utilisation de paquetages pré-compilés

Si vous préférez utiliser des paquetages rpm (Redhat, Mandrake, etc ..) ou deb (Debian), vérifiez les emplacements des différents fichiers et adaptez les chemins utilisés ici à votre configuration.

Télécharger le package RPM de Postfix

http://www.rpmfind.net

Désactiver les dépendances de sendmail

# /etc/init.d/sendmail stop
# rpm --nodeps -e sendmail

Décompresser le package

# rpm -i postfix-20010228_pl06release-1.rpm

    III.2 Configuration de base
    III.2.1 Introduction

Le fichier de configuration de Postfix (/etc/postfix/main.cf) contient plusieurs centaines de paramètres.
Heureusement, ils ont des valeurs par défaut convenables et appropriées.
Dans la plupart des cas, pour pouvoir utiliser le système de courrier Postfix il vous suffira de renseigner deux ou trois paramètres :

  • Le nom de domaine utilisé pour le courrier sortant
  • Les domaines terminaux pour l'acheminement du courrier
  • Les clients autorisés à utiliser Postfix
Ces valeurs seront utilisées pour définir les valeurs par défaut de nombreux autres paramètres.

Le paramètre suivant déterminera le niveau et donc le nombre d'alertes envoyées au postmaster local :

  • Les erreurs que nous rapportons au postmaster

D'ailleurs, si vous changez des paramètres d'un système Postfix, n'oubliez pas de lancer la commande :
# /etc/init.d/postfix reload pour que Postfix prenne en compte les nouvelles valeurs.

Si vous lancez Postfix sur une interface virtuelle du réseau, ou si votre machine lance d'autres systèmes de courrier sur des interfaces virtuelles, vous devrez renseigner les paramètres suivants :

  • Le nom du serveur Postfix
  • Le domaine de Postfix
  • Les Réseaux de confiance
  • Les adresses réseau de Postfix

    III.2.2 Le nom de domaine utilisé pour le courrier sortant

Le paramètre myorigin indique le "vrai" nom du serveur qui apparaîtra dans tout courrier posté sur cette machine.
La valeur par défaut est le nom local de machine, $myhostname, qui a pour valeur par défaut le nom de la machine.
A moins de ne travailler que sur un très petit domaine, la valeur du paramètre $mydomain, qui a pour valeur par défaut le nom du domaine de la machine, peut être préférable.

Ce paramètre permet de renseigner postfix sur la machine qui a posté.

Exemples:

myorigin = $myhostname (défaut)
myorigin = $mydomain (peut être choisi)
    III.2.3 Les domaines terminaux pour l'acheminement du courrier

Le paramètre mydestination indique quels sont les domaines que cette machine déservira localement, au lieu de transmettre à  une autre machine.
Le valeur par défaut la machine elle-même.

Vous pouvez indiquer aucun, un ou plusieurs noms de domaine, sous la forme /chemin/fichier et/ou la lecture de tables : type:nom, en séparant les différentes entrées par des espaces et/ou des virgules.
Un /chemin/nom est remplacé par son contenu; type:nom demande qu'une lecture de table soit faite, en général on utilise la base de données virtual.

Si votre machine est un serveur de mails pour son domaine tout entier, vous pouvez utiliser la variable $mydomain.

Exemples:

Par défaut:
mydestination = $myhostname localhost.$mydomain

Serveur de messagerie pour tout un domaine
mydestination = $myhostname localhost.$mydomain $mydomain

Machine avec multiples enregistrements A :
mydestination = $myhostname localhost.$mydomain www.$mydomain ftp.$mydomain

Attention: afin d'éviter des boucles de routage du courrier, vous devez énumérer tous les noms (hostnames) de la machine, y compris $myhostname, et localhost.$mydomain.

    III.2.4 Les clients autorisés à utiliser Postfix

Par défaut, le Postfix transmettra le courrier pour des clients dans les réseaux autorisés et dans des domaines autorisés.

Les réseaux autorisés de client sont définis par le paramètre de mynetworks.
Par défaut Postfix autorise tous les clients dans les sous-réseaux d'IP attachés à la machine locale.

Les domaines autorisés de client sont définis par le paramètre de configuration de relay_domains.
Par défaut les clients de confiances sont les noms (hostnames) du domaine(s) énuméré(s) dans mydestination .

    III.2.5 Les erreurs que nous rapportons au postmaster

Il est d'abord nécessaire de mettre en place un alias associant le postmaster à une personne réelle.
Cet alias doit être défini, de sorte que les gens puissent signaler des problèmes de distribution du courrier.
Le système Postfix lui-même signale également des problèmes au postmaster.

Vous ne serez peut être pas intéressé par tous les types de rapports d'erreurs, ainsi ce mécanisme de reportage est configurable.
Par défaut seul les problèmes sérieux sont signalés au postmaster (ressource, logiciel) :

Par défaut:
notify_classes = resource, software

La signification des différentes classes de rapport sont les suivantes :


bounce
Une copie du courrier non livrable est envoyée au postmaster.
Si le courrier est non livrable, un prétendu avis de non-livraison simple est envoyé, avec une copie du message qui n'a pas été fourni.
Pour des raisons d'intimité, la copie de postmaster d'un avis de non-livraison simple est tronquée après les en-têtes de messages originaux.
Si un avis de non-livraison simple est non livrable, le postmaster reçoit un double avis de non-livraison avec une copie de l'avis de non-livraison simple entier. Voyez également le dispositif luser_relay.
Le message d'alerte qui accompagne la copie du message original est appelé bounce.

2bounce
Deux messages de bounce sont envoyés au postmaster.

delay
Le postmaster est informé de tout courrier qui a été retardé. Dans ce cas, le postmaster reçoit les en-têtes du message seulement.

policy
Le postmaster est informé des demandes de client qui ont été rejetées en raison des restrictions de la politique (ECU).
Le postmaster reçoit une transcription entière de la session smtp.

protocol
Le postmaster est informé des erreurs de protocole (côté de client ou de serveur) ou les tentatives d'un client d'exécuter des commandes non implémentées. Le postmaster reçoit une transcription entière de la session de smtp.

resource
Le postmaster est informé des raisons de non livraison du courrier liées à des problèmes de ressource (par exemple, une erreur lors de l'écriture dans le répertoire de la file d'attente).

software
Le postmaster est informé des raisons de non livraison de courrier suite à des problèmes logiciels.

    III.2.6 Le nom du serveur Postfix

Le paramètre myhostname décrit le nom complet et conforme (fqdn) de la machine utilisant le système Postfix.
$myhostname est la valeur par défaut ainsi que dans beaucoup d'autres paramètres de configuration de Postfix.

Par défaut, myhostname est le nom local de la machine.
Si votre nom de machine n'est pas complet et conforme, ou si vous lancez Postfix sur une interface virtuelle, il est nécessaire de préciser le nom a utiliser.
C'est sous ce nom que la machine s'annonce lors du HELO.

Exemples:

myhostname = host.local.domain (le hostname local n'est pas FQDN)
myhostname = host.virtual.domain (interface virtuelle)
myhostname = virtual.domain (interface virtuelle)
    III.2.7 Le domaine de Postfix

Le paramètre mydomain indique le domaine parent de $myhostname.
Par défaut, il vaut $myhostname sans la première partie du nom. (sauf si on est un "top-level-domain cad : .fr, .com, ...)

Exemples:

mydomain = local.domain
mydomain = virtual.domain (interface virtuelle)
    III.2.8 Les Réseaux de confiance

Le paramètre mynetworks prend comme valeur la liste des réseaux de confiance de Postfix.
Cette information peut être utilisée par les dispositifs anti-UCE pour identifier les clients smtp de confiance qui sont autorisés à utiliser le relais de messagerie Postfix.

Vous pouvez indiquer la liste de réseaux de confiance dans le fichier main.cf, ou vous pouvez laisser Postfix déduire la liste pour vous.
Par défaut Postfix effectuent le travail pour vous.
Ces réseaux seront considérés comme des réseaux locaux.

Défaut:
mynetworks_style = subnet

La signification des valeurs est la suivante :

class
Clients smtp de confiance dans les réseaux de la classe A/B/C pour lesquels Postfix accepte le relayage.
Ne faites pas ceci avec un emplacement de dialup - Postfix ferait alors confiance au réseau de votre fournisseur tout entier.
Au lieu de cela, indiquez "à  la main" les réseaux explicites , comme décrit ci-dessous
.

subnet (défaut)
Fait confiance aux clients smtp dans les sous-réseaux d'IP de Postfix.

host
Confiance seulement la machine locale.

Alternativement, vous pouvez indiquer les réseaux "à  la main", dans ce cas le Postfix ignore le paramètre mynetworks_style.
Pour indiquer la liste de réseaux de confiance, indiquez les plages d'adresses réseau dans la notation de CIDR (network/mask), par exemple:

mynetworks = 168.100.189.0/28, 127.0.0.0/8

Vous pouvez également indiquer le nom absolu d'un fichier de valeurs au lieu d'énumérer les valeurs dans le fichier main.cf.

    III.2.9 Les adresses du réseau de Postfix

Le paramètre inet_interfaces indique toutes les adresses d'interface réseau sur lesquelles le système Postfix doit écouter.
Le courrier adressé à  l'utilisateur @ [ adresse réseau ] sera fourni localement, comme si il était adressé à  un domaine énuméré dans $mydestination.

Par défaut Postfix écoute sur toutes les interfaces actives.
Si vous voulez recevoir des mails sur des interfaces virtuelles, vous devrez indiquer sur quelles interfaces vous écouter.

Vous devez indiquer les interfaces explicites de la machine pour les receptions non-virtuelle de courrier de la machine elle-même : les attentes de mails non-virtuelles ne doivent jamais écouter sur les interfaces virtuelles où vous auriez une boucle de mails.

Exemples:

Par défaut:
inet_interfaces = all

Centre serveur virtuel:
inet_interfaces = virtual.host.name (domaine virtuel)
inet_interfaces
= $myhostname localhost.$mydomain
(écoute non-virtuelle)
inet_interfaces = 10.0.0.1 ( avant, faire #ifconfig add eth0:1 10.0.0.1 ; route add 10.0.0.1 dev eth0:1 )

    IV. Lutte anti-SPAM
    IV.1 Introduction

Postfix offre une variété de paramètres qui permettent de limiter la distribution de courrier publicitaire non sollicité.
(ECU : unsollicited commercial e-mail).

Par défaut, le serveur SMTP Postfix n'acceptera que le courrier venant du réseau considéré comme local, du domaine local, ou des domaines acceptés par postfix, de sorte que votre système ne puisse pas être employé comme un relais pour les courriers indésirables d'étrangers.

Le texte dans cette partie décrit comment vous pouvez installer des politiques plus ciblées d'anti-UCE qui empêcheront la livraison des e-mails non désirés, par exemple avec des listes d'accès dans le style de sendmail ou avec les noms de serveurs RBL
(real-time blackhole list ou reject black list).

Sauf indication contraire, tous les paramètres décrits ici sont dans le fichier de main.cf.
Si vous changez des paramètres d'un système Postfix, n'oubliez pas de lancer la commande
reload de postfix.

    IV.2 Filtrage des en-têtes

Le paramètre header_checks restreint les données autorisée suivant l'entête des messages reçus.
La valeur du paramètre doit pointer vers une ou plusieurs tables décrivant des en-têtes interdits.

Par défaut :
On permet n'importe quoi dans des en-têtes de message.
Syntaxe :
Indiquez une liste de tables de consultation. Toutes les fois qu'une en-tête est listée dans une table, l'action dépend du résultat de consultation:

REJECT
Rejette le message, et note l'en-tête.
REJECT le texte...
Comme précédemment et envoie également le texte au créateur.
IGNORE
Supprime l'en-tête du message.
WARN
Note (mais ne rejette pas) l'en-tête avec un avertissement.

A ce niveau, l'indication d'un modèle d'en-tête avec OK n'est pas très utile.
Une règle avec OK affecte seulement l'en-tête étant assorti.
La prochaine en-tête peut annuler le résultat avec un REJET, ainsi, le courrier sera toujours rejeté.

Exemples (main.cf):

header_checks = regexp:/etc/postfix/header_checks
header_checks = pcre:/etc/postfix/header_checks

Avec comme fichier /etc/postfix/header_checks :
/^to: * friend@public\.com$/REJET
    IV.3 Restrictions sur le nom d'hôte et l'adresse IP des clients

Le paramètre smtpd_client_restrictions permet de spécifier les clients qui ont le droit de faire des connexions smtp avec notre serveur.

Par défaut, cette restriction est appliquée lorque le client envoie la commande RCPT.
Pour que les restrictions soient prises en compte aussitôt que possible, indiquez smtpd_delay_reject = no dans le fichier de configuration main.cf de Postfix . Faire cela peut causer des résultats inattendus avec le logiciel client mal configuré.

Par défaut:

smtpd_client_restrictions =

Permette les raccordements smtp de n'importe quel client.

Syntaxe:
Indiquez une liste de restrictions, séparées par des espaces ou des virgules.
Les restrictions sont appliquées dans l'ordre indiqué, la première restriction qui marche a gagné.
Exemples:
smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client
Restrictions:

reject_unknown_client
Rejette la connexion lorsque la résolution de nom du client est impossible.
Le paramètre unknown_client_reject_code indique le code de réponse aux requêtes rejetées (défaut: 450 ).

permit_mynetworks
Autorise toutes requêtes issues d'une machine d'un réseau listés dans $mynetworks .

check_client_access type:name
Recherche dans la table d'accès appelée le nom d'hôte du client, de domaine, l'adresse IP , ou les réseaux obtenus en dépouillant les moindres octets significatifs.
Rejette la connexion si le résultat est REJET ou "[4ou5]XX texte".
Permet la connexion si le résultat est OK ou RELAY ou numérique.
Autrement, traitez le résultat comme une autre liste de restrictions ECU.
Le paramètre d'access_map_reject_code indique le code de réponse pour le REJET (défaut: 554 ).

reject_maps_rbl
Rejete la requête lorsque l'adresse réseau du client est énumérée dans $maps_rbl_domains.
Le paramètre de maps_rbl_reject_code indique le code de réponse pour des requêtes rejetées (défaut: 554 ).

permit
reject
warn_if_reject
reject_unauth_pipelining

Voir les restrictions générales.

    IV.4 Commande HELO (EHLO) requise

smtpd_helo_required est le paramètre qui détermine si les clients doivent envoyer une commande HELO ( ou EHLO) au début d'une session SMTP. Ce paramètre arrêtera le logiciel de quelques ECU.

Par défaut:
smtpd_helo_required = no

Par défaut, le serveur smtp postfix n'exige pas l'utilisation de HELO ( EHLO ).

Syntaxe:
Indiquez yes ou no .
Exemple:
smtpd_helo_required = yes
    IV.5 Restrictions sur le nom d'hôte par la commande HELO (EHLO)

Le paramètre de smtpd_helo_restrictions permet de controler les données fournies par la commande HELO (EHLO).
Le logiciel de quelques ECU peut être arrêté en étant strict.

Par défaut, cette restriction est appliquée quand le client envoie la commande RCPT .
Pour que les restrictions soient prises en compte aussitôt que possible, indiquez smtpd_delay_reject = no dans le fichier de configuration main.cf de Postfix . Faire cela peut causer des résultats inattendus avec le logiciel client mal configuré.

Par défaut:
smtpd_helo_restrictions =

Par défaut, aucune analyse des données est effectuée.
Il y a beaucoup de logiciel defectueux ou mal configuré sur Internet.

Syntaxe:
Indiquez une liste de restrictions, séparée par des espaces ou des virgules.
Les restrictions sont appliquées dans l'ordre indiqué, la première restriction qui marche a gagné.

En plus des restrictions qui sont spécifiques aux paramètres de la commande HELO (EHLO), vous pouvez également indiquer des restrictions basées sur le nom d'hôte et l'adresse IP des clients.

Exemple:

smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname

Restrictions:

reject_invalid_hostname
Rejette la requête lorsque la syntaxe du nom d'hôte normalement fourni par la commande HELO ('EHLO) est invalide. invalid_hostname_reject_code indique le code de réponse aux requêtes rejetées (défaut: 501).
 
permit_naked_ip_address
Autorise la commande HELO (EHLO) à envoyer l'adresse IP du client "nue", sans les crochets [ ] spécifié par la RFC.
Malheureusement, de nombreux clients de courrier électronique procèdent de cette façon.
 
reject_unknown_hostname
Rejette la requête si la résolution inverse sur le nom d'hôte dans la commande HELO (EHLO) du client est impossible. unknown_hostname_reject_code indique le code de réponse aux requêtes rejetées (défaut: 450 ).
 
reject_non_fqdn_hostname
Rejette la requête si le nom d'hôte fourni par la commande HELO (EHLO) du client n'est pas complet et conforme, selon les exigences de la RFC.
non_fqdn_reject_code indique le code de réponse aux requêtes rejetées (défaut: 504 ).

check_helo_access type:nom
 
Recherche dans la table d'accès indiquée le nom d'hôte, le domaine, l'adresse IP ou de réseau de la commande HELO puis :
rejette la requête si le résultat est REJET ou "[4ou5 texte]XX ".
Autorise la requête quand le résultat est OK ou RELAY ou numérique.
Autrement, traite le résultat comme une autre liste de restrictions d'ECU.
Le paramètre access_map_reject_code indique le code de réponse pour le REJET (défaut: 554 ).

reject_maps_rbl
reject_unknown_client permit_mynetworks
check_client_access
maptype:mapname

Voir les restrictions sur le nom d'hôte l'adresse IP des clients.

permit reject
warn_if_reject
reject_unauth_pipelining

Voir les restrictions générales.
    IV.6 Stricte conformité des adresses d'enveloppe à la RFC 821 requise

Le paramètre strict_rfc821_envelopes permet de contrôler la tolérance de Postfix sur le format des adresses données dans la commande MAIL FROM ou RCPT.
Malheureusement, le programme Sendmail tolère un bon nombre de comportements non standards, ainsi beaucoup de logiciels clients de courrier pensent l'utiliser.
Être conforme à la RFC arrête non seulement le courrier non désiré, mais il bloque également le courrier légitime des applications courrier mal écrites.

Par défaut:
strict_rfc821_envelopes = no

Par défaut, le serveur SMTP Postfix accepte n'importe quelle forme d'adresse ce qui peut se comprendre, y compris les adresses qui contiennent des commantaires du style RFC 822, ou des adresses non incluses dans <>.
Il y a beaucoup de logiciels defectueux ou mal configurés sur l'Internet.

Exemple:
strict_rfc821_envelopes = yes
 
    IV.7 Restrictions sur l'adresse de l'expéditeur (sender)

Le paramètre smtpd_sender_restrictions limite l'accès au système suivant l'adresse de l'expéditeur signalé par la commande MAIL FROM.

Par défaut, cette restriction est appliquée quand le client envoie la commande RCPT .
Pour que les restrictions soient prises en compte aussitôt que possible, indiquez smtpd_delay_reject = no dans le fichier de configuration main.cf de Postfix . Faire cela peut causer des résultats inattendus avec un logiciel client mal configuré.

Par défaut:

smtpd_sender_restrictions =

Par défaut, Postfix accepte le courrier quelle que soit la valeur donnée par la commande MAIL FROM.

Syntaxe:
Indiquez une liste de restrictions, séparées par des espaces ou des virgules.
Les restrictions sont appliquées dans l'ordre indiqué, la première restriction qui marche a gagné.

En plus des restrictions spécifiques sur l'adresse de l'expéditeur, vous pouvez également indiquer des restrictions basées sur l'information passée avec la commande HELO/EHLO, et sur le nom d'hôte et l'adresse IP des clients.

Exemple:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain

Restrictions:

reject_unknown_sender_domain
Rejette la requête lorsque l'adresse de l'expéditeur fournie n'a pas de correspondance MX ou DNS.
Le paramètre unknown_address_reject_code indique le code de réponse pour des requêtes rejetées (défaut: 450 ).
La réponse est toujours 450 en cas d'erreur DNS temporaire.
 
check_sender_access type:nom
 
Recherche dans la table d'accès indiquée l'adresse de l'expéditeur, le nom d'hôte, le domaine, ou nomlocal@. puis:
Rejette la requête si le résultat est REJET ou "[4ou5]XX ".
Autorise la requête si le résultat est OK ou RELAY ou numérique.
Autrement, traite le résultat comme une autre liste de restrictions ECU.
Le paramètre access_map_reject_code indique le code de résultat pour des requêtes rejetées (défaut: 554 ).

reject_non_fqdn_sender
Rejette la requête lorsque l'adresse donnée par la commande MAIL FROM du client n'est pas complète et conforme.
non_fqdn_reject_code indique le code de réponse aux requêtes rejetées (défaut: 504 ).
 
reject_sender_login_mismatch
Rejette la requête lorsque $smtpd_sender_owner_maps indique un propriétaire dans le MAIL FROM de l'adresse, mais le client (SASL) n'est pas entré en tant que ce COURRIER de propriétaire d'adresse; ou quand le client (SASL) est entré, mais le nom d'ouverture de client ne possède pas le COURRIER de l'adresse selon $smtpd_sender_login_maps .
 
permit_naked_ip_address
reject_invalid_hostname
reject_unknown_hostname
reject_non_fqdn_hostname
check_helo_access type : nom
Voir les restrictions sur le nom d'hôte par la commande HELO (EHLO).

reject_maps_rbl
reject_unknown_client
permit_mynetworks
check_client_access type : nom
Voir les restrictions sur le nom d'hôte et l'adresse IP des clients.

permit
reject
warn_if_reject
reject_unauth_pipelining
Voir les restrictions générales.
 
    IV.8 Restrictions sur l'adresse du destinataire (recipient)

Le paramètre smtpd_recipient_restrictions limite l'accès au système suivant l'adresse du distinataire signalé par la commande RCPT TO.

Par défaut :

smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains

Par défaut, le serveur Postfix relaye le courrier :

Des clients dont l'adresse d'IP est listée dans $mynetworks.
Des clients dont le nom d'hôte (hostname) est listé dans $relay_domains ou un sous-domaine.
Des clients qui choisissent des destinations listées dans $relay_domains ou un sous-domaine, excepté les adresses qui contiennent le cheminement expéditeur-destinataire spécifié (user@elsewhere@domain).
En plus de ce qui précède, le serveur Postfix accepte, par défaut, le courrier pour lequel Postfix est la destination finale listée dans $inet_interfaces, $mydestination ou $virtual_maps.

Syntaxe :

Indiquez une liste de restrictions, séparée par des espaces ou des virgules.
Les restrictions sont appliquées dans l'ordre indiqué, la première restriction qui marche a gagné.

En plus des restrictions qui sont spécifiques à l'adresse du destinataire, vous pouvez également indiquer des restrictions basées sur l'information passée avec la commande HELO/EHLO, et sur le nom d'hôte et l'adresse IP des clients.

Exemple :
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

Note: vous devez indiquer au moins une des restrictions suivantes : rejet, check_relay_domains ou reject_unauth_destination. Sinon, Postfix refusera de recevoir le courrier.

Restrictions:
check_relay_domains
Accepte la requête lorsqu'une des condition suivantes est satisfaite :
  • Le nom d'hôte du client (hostname) est listé dans $relay_domains ou un sous domaine de celui-ci.
  • L'adresse de destination est listée dans $relay_domains ou un sous-damaine , et l'adresse ne contient pas de cheminement expéditeur-destinataire spécifié (user@elsewhere@domain).
  • Postfix est la destination finale pour : toutes les destinations qui sont spécifiées par $mydestination, $inet_interfaces ou $virtual_maps.
    Autrement, il y a rejet de la requête.
    Le paramètre relay_domains_reject_code indique le code de réponse pour des requêtes rejetées (défaut: 554).

 

permit_auth_destination
Ignore le nom d'hôte du client (hostname). Accepte la requête quand une des conditions suivantes est satisfaite :
  • L'adresse de destination est dans $relay_domains ou un sous-damaine , et l'adresse ne contient pas de cheminement expéditeur-destinataire spécifié (user@elsewhere@domain).
  • Postfix est la destination finale pour : toutes les destinations qui sont spécifiées par $mydestination, $inet_interfaces ou $virtual_maps.

Autrement, Postfix effectue aussi les restrictions suivantes :

reject_unauth_destination
Ignore le nom d'hôte du client (hostname). Rejette la requête quand une des conditions suivantes est vraie :
  • L'adresse de destination est listée dans $relay_domains ou un sous-domaine , et l'adresse ne contient pas de cheminement expéditeur-destinataire spécifié (user@elsewhere@domain),
  • Postfix est la destination finale pour toutes les destinations qui sont spécifiées par $mydestination, $inet_interfaces ou $virtual_maps.

relay_domains_reject_code est le paramètre qui spécifie le code de réponse suite à un rejet (par défaut: 554 ).

permit_mx_backup
Accepte la requête lorsque le système local de courrier est le serveur MX pour la destination .
Ceci inclus le cas où le système local de courrier est la destination finale.
Cependant, le serveur de SMTP n'expédiera pas le courrier avec les adresses qui contiennent un cheminement expéditeur-destinataire spécifié (user@elsewhere@domain), employez le paramètre facultatif
permit_mx_backup_networks
pour exiger également que les centres serveurs MX primaires apartiennent à une liste de plages d'adresses réseau.
 
 
Paramètres appropriés de configuration : permit_mx_backup_networks, $mydestination, $inet_interfaces.


check_recipient_access type:nom
Recherche dans la table d'accès indiquée l'adresse de destination, le domaine , ou nomlocal@. puis :
Rejette la requête si le résultat est REJET ou "[4ou5]XX ".
Permet la requête si le résultat est OK ou RELAY ou numérique.
Autrement, traite le résultat comme une autre liste de restrictions ECU.
Le paramètre access_map_reject_code indique le code de résultat pour des requêtes rejetées (défaut: 554 ).

reject_unknown_recipient_domain
Rejette la requête lorsque l'adresse de l'expéditeur fournie n'a pas de correspondance MX ou DNS..
Le paramètre unknown_address_reject_code indique le code de réponse pour des requêtes rejetées (défaut: 450).
La réponse est toujours 450 en cas d'erreur de résolution DNS temporaire.
 
reject_non_fqdn_recipient
Rejette la requête lorsque l'adresse du client renseignée dans la commande RCPT TO n'est pas complète et conforme.
(fqdn : fully-qualified domain name)
 
reject_unknown_sender_domain
reject_non_fqdn_sender
check_sender_access maptype : mapname
reject_sender_login_mismatch
Voir les restrictions sur l'adresse de l'expéditeur..
 
permit_naked_ip_address
reject_invalid_hostname
reject_unknown_hostname
reject_non_fqdn_hostname
check_helo_access type : nom
Voir les restrictions sur le nom d'hôte par la commande HELO (EHLO).

reject_maps_rbl
reject_unknown_client
permit_mynetworks
check_client_access type : nom
Voir les restrictions sur le nom d'hôte et l'adresse IP des clients.
 
permit
reject
warn_if_reject
reject_unauth_pipelining
Voir les restrictions générales.
    IV.9 Restrictions de la commande ETRN

Les restrictions de la commande d'ETRN ne sont pas vraiment des restrictions ECU.
Le paramètre smtpd_etrn_restrictions limite les domaines qui peuvent être indiqués dans des commandes ETRN, et quels sont les clients qui peuvent utiliser la commande ETRN.

Pae défaut:
smtpd_etrn_restrictions =

Par défaut, le serveur SMTP Postfix accepte n'importe quelle commande ETRN de n'importe quel client.

Syntaxe :
Indiquez une liste de restrictions, séparée par des espaces ou des virgules.
Les restrictions sont appliquées dans l'ordre indiqué, la première restriction qui marche a gagné.
 
En plus des restrictions qui sont spécifiques noms de domaine utilisant ETRN, vous pouvez également indiquer des restrictions basées sur l'information passée avec la commande de HELO/EHLO, et sur le nom d'hôte et l'adresse IP des clients.

Exemple:
smtpd_etrn_restrictions = permit_mynetworks, hash:/etc/postfix/etrn_access, reject

Restrictions:

check_etrn_access type:nom
 
Recherche dans la table d'accès indiquée le domaine spécifié avec la commande ETRN ou le domaine parent, puis :.
Rejette la requête si le résultat est REJET ou "[4ou5]XX ".
Accepte la requête si le résultat est OK ou RELAY ou numérique.
Autrement, traite le résultat comme une autre liste de restrictions ECU.
Le paramètre access_map_reject_code indique le code de résultat pour des requêtes rejetées (défaut: 554 ).
 
 
permit_naked_ip_address
reject_invalid_hostname
reject_unknown_hostname
check_helo_access type : nom
Voir les restrictions sur le nom d'hôte par la commande HELO (EHLO).
 
reject_maps_rbl
reject_unknown_client
permit_mynetworks
check_client_access type : nom
Voir les restrictions sur le nom d'hôte et l'adresse IP des clients.
 
permit
reject
warn_if_reject
reject_unauth_pipelining
Voir les restrictions générales.
    IV.10 Restrictions générales

Les restrictions qui suivent peuvent être utilisées pour les noms ou adresses des clients, pour le nom donné par la commande HELO (EHLO), pour les adresses des expéditeurs ou destinataires du courrier.

Restrictions:

permit
Accepte la requête. Cette restriction est habituellement utilisée à la fin de la list des restrictions pour rendre la police par défaut plus explicite.

reject
Rejet de la requête. Cette restriction est aussi habituellement utilisée à la fin de la list des restrictions pour rendre la police par défaut plus explicite. Le paramètre reject_code spécifie le code de réponse aux requêtes rejetées (par défaut: 554 ).
 
warn_if_reject
Change la signification de la prochaine restriction, de sorte qu'il note un avertissement au lieu de rejeter une requête (rechercher les fichiers journal qui contiennent " reject_warning "). C'est utile pour examiner de nouvelles restrictions dans un environnement en direct sans risquer la perte inutile de courrier.

reject_unauth_pipelining
Rejette la requête quand le client envoie des commandes SMTP avant que Postfix soutienne réellement la canalisation de commande
de SMTP.
Ceci arrête le courrier du logiciel de courrier qui utilise incorrectement la canalisation de commande SMTP pour accélérer les livraisons.
    IV.11 Paramètres additionnels de controle des ECU
permit_mx_backup_networks
limite l'utilisation du dispositif de commande de relais permit_mx_backup aux destinations dont les serveurs MX primaires font partis de la liste des réseaux passée en paramètre.

permit_mx_backup_networks =
Tous les réseaux sont autorisés par défaut.
Syntaxe :
Indiquer une liste de plages d'adresses réseau dans la notation CIDR (network/mask), par exemple :

permit_mx_backup_networks = 168.100.0.0/16

vous pouvez également indiquer le nom absolu d'un fichier de modèle dans le fichier main.cf au lieu d'énumérer
tous les modèles.

maps_rbl_domains
Ce paramètre commande le comportement de la restriction reject_maps_rbl qui peut apparaître comme un élément d'une liste de restrictions par nom/adresse client.
 
Par défaut:
 
maps_rbl_domains = blackholes.mail-abuse.org
Note : Les consultations RBL sont neutralisées par défaut.

Syntaxe :

Domaines DNS qui mettent le client sur la liste noire d'adresses IP. Un centre serveur est mis sur la liste noire quand son adresse IP inverse est énumérée comme sous domaine dans n'importe quel domaines énumérés
dans $maps_rbl_domains.

relay_domains

Ce paramètre commande le comportement des check_relay_domains, reject_unauth_destination et des restrictions permit_auth_destination qui peuvent apparaître en tant qu' élément d'une liste de restrictions d'adresse pour la destination.
 
Par défaut:

relay_domains = $mydestination

Par défaut, le serveur SMTP Postfix relaye les e-mails :

  • des clients dont l'adresse d'IP est définie dans $mynetworks,
  • des clients dont le nom d'hôte (hostname) est définit dans $relay_domains, ou un sous-domaine,
  • des clients pour des destinations définient dans $relay_domains ou un sous-domaine, excepté les adresses qui contiennent un cheminement expéditeur-destinataire spécifié (user@elsewhere@domain).

Syntaxe :

Spécifier aucun, un ou plusieurs noms de domaine , /dossier/nomdufichier et/ou type : nom de la table d'accès, séparés par des espaces ou des virgules. Un /dossier/nomdufichier est remplacé par son contenu, et pour type : nom une requette est faite sur la table au lieu d'une simple comparaison de chaine.

Une adresse de serveur ou de destination est compris dans $relay_domains quand son nom de domaine ou parent apparait dans la liste des noms, des fichiers ou tables d'accès énumérées dans $relay_domains.

smtpd_sender_login_maps
Ce paramètre indique la propriété du MAIL FROM des adresses, il est employé par la restriction d'adresse d'expéditeur reject_sender_login_mismatch.
 
Par défaut:
smtpd_sender_login_maps =

Syntaxe:

Spécifier aucun, un ou plusieurs type:nom table de résolution, séparées par des espaces ou des virgules.
Les restrictions sont appliquées dans l'ordre indiqué. Les tables Regexp sont permises.

Chaque entrée de table indique une adresse expéditeur et le nom de login qui possède l'adresse.
L'ordre de recherche est :

 

user@domain owner

Cette forme a la priorité la plus élevée.

 

user owner
Ceci est associé à user@site lorsque "site" est égal à $myorigin, lorsque "site" est dans $mydestination , ou lorsqu'il est dans la liste $inet_interfaces.
 
@domain owner
Ceci associe chaque adresse dans le domaine indiqué, et à la plus basse priorité.
    V. Contrôles des taux
    V.1 Introduction
Établir un système à  rendement élevé de distribution du courrier est une chose, la construction d'un qui ne frappe pas sur les autres en est une autre.
Quelques sytèmes de courrier souffrent du syndrome "thundering herd " et inondent littéralement d'autres systèmes avec leur courrier.

Le Postfix essaie d'être un expéditeur rapide et un bon voisin en même temps.
Du côté de la réception, le serveur SMTP Postfix se défend contre les clients malveillants ou confus.

Sauf indication contraire, tous les paramètres décrits ici sont dans le fichier de main.cf.
Si vous changez des paramètres d'un système Postfix, n'oubliez pas de lancer la commande reload de Postfix.

    V.2 Limiter les processus
Le paramètre default_process_limit (défaut: 50) donne le contrôle direct des flux d'arrivée et de livraison.
Ce paramètre commande le nombre de processus concourants qui mettent en application un service de Postfix (client de smtp, serveur de smtp, livraison locale, etc.).

Sur les systèmes réduits, ou sur des systèmes reliés par l'intermédiaire des réseaux dialup, un default_process_limit de 10 est probablement mieux proportionné. Employez une plus grande valeur si votre machine doit traiter un nombre important de courrier.

Vous pouvez dépasser cet arrangement pour des démons spécifiques de Postfix en éditant le fichier master.cf.
Par exemple, si vous ne souhaitez pas recevoir 50 messages de smtp en même temps, vous pourriez indiquer:

 
# ====================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (50)
# ====================================================================
. . .
smtp      inet  n       -       -       -       5       smtpd
    V.3 Limiter le nombre d'envois simultanés
Imaginez que vous ayez des tonnes de disques et de mémoires et que votre serveur Postfix soit configuré pour pouvoir lancer plus de 1000 clients smtp en même temps.
Félicitations. Mais voulez-vous vraiment établir 1000 connexions simultanés avec le même système distant ? Probablement pas.

Le gestionnaire de files d'attente de Postfix vient à  votre secours.
Ce programme met en application l'analogue de la stratégie de contrôle "slow start" du flux TCP :
Lorsque Postfix délivre un site distant, il n'établi qu'un nombre restreint de connexion pour commencer, puis il augmente le débit tant que tout ce passe bien, il reviendra en arrière si il y a saturation.

Le paramètre initial_destination_concurrency (défaut: 2) indique combien de messages seront envoyés au début à  la même destination avant d'adapter le flux de la livraison.
Naturellement, cette valeur est efficace seulement s'il n'excède pas la limite des processus et la limite du nombre de connexion simultanées pour une destination sur un canal spécifique de transport de courrier.

Le paramètre default_destination_concurrency_limit (défaut: 10) indique combien de messages peuvent être envoyés à  la même destination simultanément.
Vous pouvez dépasser cette valeur pour les canaux spécifiques de livraison ( locaux, smtp, UUCP etc.).
Le fichier main.cf recommande ce qui suit:

local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

Le paramètre local_destination_concurrency_limit indique combien de messages seront livrés simultanément au même destinataire local.
La limite recommandée est basse parce que la livraison à  la même boîte aux lettres doit se produire séquentiellement, ainsi le parallélisme massif n'est pas utile.

Une autre bonne raison de limiter la simultanéité de la livraison au même destinataire : si le destinataire a une commande shell importante
dans son fichier .forward, ou si le destinataire est une liste de diffusion, nous ne voulons pas envoyer trop d'exemplaires en même temps.

Une limite pour l'envoi simultané à une destination de 10 pour la livraison de smtp semble assez pour charger sensiblement un système sans "l'asseoir sur ses genoux".
Faites attention si vous augmentez ce nombre.

    V.4 Limiter le nombre de destinataires
Le paramètre default_destination_recipient_limit (défaut: 50) indique le nombre maximum de destinataires pour une copie d'e-mail envoyée avec un agent de livraison Postfix ( smtp , UUCP , etc...).
Si un message a plus que $default_destination_recipient_limit destinataires pour le même site, la liste des destinataires sera cassée vers le haut en plus petites listes, et des copies multiples du message seront envoyées.

Vous pouvez dépasser cette valeur pour les agents spécifiques de la livraison Postfix ( smtp, UUCP, etc.).
Par exemple:

uucp_destination_recipient_limit = 100
limiterait le nombre de destinataires par livraison UUCP à 100.

Vous devez faire attention en augmentant cette limite; quelques serveurs smtp avortent la connexion lorsqu'ils manquent de mémoire ou quand une limite est atteinte, ainsi le courrier ne passera pas.

Le paramètre smtpd_recipient_limit (défaut: 1000) indique combien de destinataires le serveur smtp prendra par livraison.
C'est plus que n'importe quel client smtp raisonnable enverrait.
La limite existe juste pour protéger le système local de courrier contre un client malveillant ou confus.

    V.5 Livraison différées
Le paramètre defer_transports vous permet d'indiquer quel courrier devrait toujours être reporté jusqu'à ce que le Postfix soit explicitement invité à le livrer.

Un petit site qui serait connecté seulement de temps en temps, et qui veut reporter toutes les livraisons jusqu'à ce que la commande sendmail -q soit exécuté (par exemple, un petit script PPP dialout) emploierait:

defer_transports = smtp

Un ISP peut employer le dispositif defer_transports pour les clients qui sont souvent hors connexion.
Le client peut déclencher la livraison en publiant une commande ETRN au port de smtp.
Les exemples suivants montrent comment configurer un tel client:

/etc/postfix/main.cf:

defer_transports = hold

Vous pouvez indiquer tout nombre de transports ici. L'exemple en donne qu'un.

/etc/postfix/ transport :

customer.com   hold:[gateway.customer.com ]
customer.com   hold:[gateway.customer.com ]

[ ] sont nécessaires pour éviter les résolutions MX, qui pourraient se diriger vers votre machine locale.
La deuxième entrée est nécessaire seulement si vous voulez transmettre par relais le courrier pour des clients du sous-domaine.

/etc/postfix/master.cf:

hold   unix   -   -   n   -   -   smtp

C'est juste l'entrée de master.cf pour le smtp régulier, avec le premier champ changé en hold.

    V.6 Achivage des messages non livrables
Lorsqu'un agent de livraison Postfix ( smtp, local, UUCP, etc...) ne peut pas livrer un message, il peut blâmer le message lui-même ou la partie réçue.
  • Si l'agent de la livraison n'arrive pas à livrer le message, le gestionnaire de files d'attente marque ce message à une date future (décalage paramètrable), ainsi il sera ignoré pendant un moment par le gestionnaire de file.
    Si la deuxième tentative échoue, une nouvelle marque est déposée, le décalage correspondant au double de l'âge du message.
    Ainsi, le temps écoulé entre deux tentatives double à chaque échec. Cette méthode s'appelle l'archivage exponentielle.

  • Si l'agent de la livraison n'arrive pas à livrer un message reçu (par exemple un utilisateur destinataire local, ou un hôte à distance), le gestionnaire de files d'attente marque non seulement ce message à une date future, mais il met également la partie reçue dans une liste "morte" pour qu'il soit sauté pendant un certain temps.

Comme vous pouvez le penser, ce processus entier est controlé par un groupe de petits paramètres.

 
queue_run_delay (défaut: 1000 secondes)
Temps que le gestionnaire de files attent avant de rebalayer la file d'attente pour le courrier reporté.

maximal_queue_lifetime (défaut: 5 jours)
Temps maximal qu'un message reste dans la file d'attente avant qu'il soit renvoyé comme non livrable.

minimal_backoff_time (défaut: 1000 secondes)
Temps d'attente minimal qu'un message restera sans être traité.

maximal_backoff_time (défaut: 4000 secondes)
Temps d'attente maximal après un échec de livraison.

qmgr_message_recipient_limit (défaut: 1000)
Limite la taille de la liste "morte" des destinations.
    V.7 Ralentissement à cause de "mauvais" clients
Tout d'abord, aucune défense ne vous protégera contre une attaque de type "denie of service".
Nous ne voulons pas soulever des espérances impossibles.
Mais il y a des choses simples à mettre en place afin de traiter des programmes clients confus ou malveillants.

Quelques défenses font partie d'une stratégie plus générale : par exemple, combien de temps une ligne de texte peut être prise en compte avant qu'elle soit cassée en morceaux, et quelle quantité de texte peut on porter dans une en-tête de message multiligne.
Voir la documentation sur le controle des ressources pour plus de détails.

Il y a incrémentation d'un compteur d'erreur du serveur SMTP Postfix toutes les fois qu'une demande de client est non reconnue ou non implementée, ou toutes les fois qu'une demande de client viole les restrictions ECU ou d'autres raisons.
Le compteur d'erreur est remis à  zéro quand un message est transféré avec succès.

A mesure que le compteur d'erreur augmente, le serveur smtp change de comportement.
L'idée est de limiter les dommages en ralentissant le client.

Le comportement est commandé par les paramètres suivants:

smtpd_error_sleep_time (défaut: 5 secondes)
Quand le compteur d'erreurs est petit, le serveur de smtp fait une pause seulement en signalant un problème au client. Le but est d'empêcher les clients naïfs d'entrer dans une boucle connexion-erreur-déconnexion.
 
smtpd_soft_error_limit (défaut: 10)
Quand le compteur d'erreurs dépasse cette valeur, le serveur smtp s'arrète error_count secondes avant de répondre à  une demande de client.
 
smtpd_hard_error_limit (défaut: 100)
Quand le compteur d'erreurs dépasse cette valeur, le serveur SMTP se déconnecte.

Malheureusement, le serveur SMTP Postfix ne sait pas encore limiter le nombre de raccordements du même client , autre qu'en limitant le nombre de processus pour le serveur smtp (voir limitation des processus ).
Les choses auraient pu être plus mauvaises : Il existe des serveurs de mails qui n'ont pas le moyen de limiter les processus lancés.

    VI Contrôle des ressources
    VI.1 Introduction

Le système Postfix a été conçu pour fonctionner avec un budget fini de mémoire.

Pour cela, il y a des limites configurables sur la taille des objets en mémoire tels que des fragments de lignes de texte, sur le nombre d'instances de tels objets, et le temps qu'une opération peut prendre.
En outre, les stratégies sont en place pour traiter l'épuisement de ressource.

L'idée est de continuer à fonctionner dans des conditions difficiles, sans agraver le problème d'avantage.

    VI.2 Limiter la taille des objets
La première étape pour garder un budget fixe de ressource mémoire consiste à limiter la taille de chaque objet .
Une fois que la taille des objets est limitée, la consommation totale de mémoire est limitée en limitant le nombre d'objets.
Simple, non?

line_length_limit (défaut: 2048 octets)
Combien de temps une ligne de texte peut être prise en compte avant d'être cassée en morceaux.
Tous les programmes périphériques de Postfix (serveur smtp , client smtp , collecte locale et livraison locale) utilisent cette limite de longueur de ligne lorsque les données lues emmanent d'une source qui nest pas digne de confiance. Les longues lignes sont réassemblées à la livraison.

 
header_size_limit (défaut: 102400 octets)
Quelle quantité de texte peut être portée dans un en-tête de message multiligne.
Le texte de l'en-tête qui ne sera pas compris dans les $header_size_limit octets se retrouvera dans le corps du message.
Cette limite est utilisée par cleanup qui réécrit le code de l'en-tête.

 

extract_recipient_limit (défaut: 10240 destinataires)
Nombre de destinataires que Postfix extraira des en-têtes de message avant de renoncer.
Ceci limite les dommages qu'un programme pourrait faire avec la commande "sendmail - t".

Les paramètres suivants limitent la taille des fichiers stockés dans le système :

message_size_limit (défaut: 10240000 octets)
Taille maximale d'un message dans une file d'attente de Postfix, y compris l'enveloppe (expéditeur, destinataire, etc.).

queue_minfree (défaut: aucune restriction)
Combien d'espace libre en octets sont nécessaires dans le répertoire de file d'attente.
Le serveur SMTP refusera de distribuer le courrier tant que l'espace minimum n'est pas disponible.
Il n'y a aucune limite par défaut, cependant, une bonne idée est d'avoir besoin de plusieurs fois la valeur de $message_size_limit de sorte que le système de courrier ne se coince pas sur un grand message.

bounce_size_limit (défaut: 50000 octets)
Taille limite des messages non délivrés et qui seront renvoyés à  l'expéditeur.

mailbox_size_limit (défaut: 102400000 octets)
Taille maximale (en octets) d'une boite aux lettres

    VI.3 Limiter le nombre d'objets
Une fois que le taille des objets a été limitée, la prochaine étape pour avoir un budget fini de mémoire pour Postfix est de limiter le nombre d'objets en mémoire.
 
qmgr_message_recipient_limit (défaut: 10000)
Limite supérieure sur le nombre de structures de données en mémoire associées à l'adresse du destinataire pour le gestionnaire de files d'attente.
Ce paramètre commande également le nombre d'exemplaires d'autres structures de données en mémoire.
Voyez, par exemple, la documentation sur le contrôle du taux de livraison.
 
qmgr_message_active_limit (défaut: 1000)
Limite supérieure sur le nombre de messages dans la file d'attente active.
Pour une introduction à  l'organisation de file d'attente de Postfix, voyez la partie anatomie de Postfix.

duplicate_filter_limit
(défaut: 1000)
Nombre d'adresses de destinataire que l'agent de livraison local et le démon de nettoyage d'adresse cleanup se rappellent lorsqu'ils délivrent un message.
Une adresse de destinataire est ignorée lorsqu'elle est dans la liste en mémoire.
    VI.4 Limiter le temps
Les commandes externes doivent s'exécuter dans une limite de temps donnée.
De telles commandes sont lancées par l'agent local de livraison lorsqu'il trouve une destination de type "|command" dans la base des alias, le fichier :include:, ou le fichier .forward.
Le pipe permet le passage du mail a une commande externe.
 
command_time_limit (défaut: 1000 secondes)
Temps d'attente par l'agent local de livraison avant d'avorter la commande externe.

service_name_time_limit (défaut: $command_time_limit)
Délai pour la livraison aux commandes externes via le pipe.
service_name étant le nom du service concerné (premier champ fichier du master.cf)
 
    VI.5 Acquisition exclusives des verrouillages de fichier
Intérieurement, les programmes Postfix coopèrent d'une façon très disciplinée et doivent rarement combattre pour l'accès exclusif à un fichier.
Cependant, les conflits d'accès peuvent se produire sur l'extérieur, par exemple, quand le courrier doit être fourni tandis qu'un utilisateur accède à  sa boîte aux lettres.
Postfix supporte deux types de verrouillages de fichier:

  • Verrouillages internes, utilisation des primitives système fcntl() ou flock().

  • Verrouillages externes, utilisation des fichiers nommés fichier.lock.

Selon le système hôte, Postfix emploie une méthode ou toutes les deux.
Les paramètres suivants de configuration commandent comment Postfix traite les verrouillages de fichier:
deliver_lock_attempts (défaut: 5)
Le nombre de fois où Postfix essaie de verrouiller un fichier avant d'abandonner.

deliver_lock_delay (défaut: 1 seconde)
Combien de temps Postfix attend entre les tentatives de verrouillage d'un fichier.

stale_lock_time (défaut: 500)
Age d'un vieux fichier lock externe avant qu'il soit détruit.
 
   VI.6 Rétablissement après erreur
Dans des conditions d'effort grave, les ressources système disponibles peuvent être insuffisantes pour satisfaire les besoins de Postfix.
Le système peut également sembler tomber en morceaux quand un dossier de configuration de Postfix est cassé, ou quand un programme de Postfix est défectueux.

L'approche générale adoptée face au désastre est de se terminer avec une erreur fatale (ou avec une panique en cas de problèmes logiciels), et d'essayer encore après une certaine heure (le démon principal master remettra en marche des processus après quelque temps).
Les tentatives qui ont échouées sont notées; dans le meilleur des cas, quelqu'un notera le problème et le résoudra.

Quelques stratégies de rétablissement ont été mises en application très tôt dans le développement de Postfix, et n'ont pas été rendues configurables encore.
Ce qui suit est le commencement d'une liste croissante de paramètres de commande de rétablissement:

fork_attempts (défaut: 5 fois)
Nombre de fois où Postfix essaie de créer un nouveau processus avant d'abandonner.

fork_delay (défaut: 1 seconde)
Retard entre les tentatives de création d'un nouveau processus.

transport_retry_time (défaut: 60 secondes)
La quantité de temps entre le gestionnaire de files d'attente essaye d'entrer en contact avec un service de livraison apparent ancien de Postfix.
 
   VII. Manipulation des adresses
   VII.1 Introduction

Bien que le système Postfix ne possède pas encore de language de réécriture, il est capable de manipuler des adresses grâce à des requêtes sur des tables.
Lorsqu'un message traverse le système Postfix, ses adresses sont modifiées dans l'ordre décrit ci-dessous.

  VII.2 Manipulation sur n'importe quel courrier
  VII.2.1 Réécriture des Adresses au format standard

Le démon de nettoyage cleanup, avant de vérifier la correspondance d'une adresse avec les tables, commence par réécrire cette adresse au format standard utilisateur@domaine.complet.et.conforme en passant cette adresse au démon trivial-rewrite.
L'objectif de la réécriture au format standard est de réduire le nombre d'entrées nécessaires dans les tables.

Le démon trivial-rewrite implémente les schémas de réécriture suivants :

@hotea,@hoteb:utilisateur@site vers utilisateur@site

La fonctionnalité de routage à la source est obsolète. Postfix n'implémente pas cette fonctionnalité et doit donc supprimer la route indiquée.
site!user vers user@site

Cette fonctionnalité est controllée par le paramètre booléen swap_bangpath (activé par défaut : yes).
L'objectif est réécrire les adresses uucp dans le style domaine. Cette réécriture est utile pour les sites recevant du courrier via uucp, mais elle
n'apportera aucun problèmes aux autres.
user%domain vers user@domain

Cette fonctionnalité est controllé par le paramètre allow_percent_hack.
Généralement, elle est utilisée pour gérer les adresses du type user%domaine@autre_domaine.

user vers user@$myorigin

Cette fonctionnalité est controllée par le paramètre append_at_myorigin.
L'objectif est d'harmoniser le traitement des courriers utilisateur des machines du domaine $myorigin.
Il est déconseillé de désactiver cette fonctionalité, Postfix attendant les adresses sous la forme user@domain. Si le système Postfix n'est pas le serveur principal pour le domaine $myorigin, et que le courrier de certains utilisateurs doit être livré en local, il faut créer une entrée dans la table virtual redirigeant utilisateur@$myorigin vers utilisateur@$myhostname.

utilisateur@hote vers utilisateur@hote.$mydomain

Cette fonctionnalité est controllée par le paramètre append_dot_mydomain (activé par défaut : yes).
L'objectif est de traiter de la même façon plusieurs formes de nommage d'un même hôte. Certains jugent la réécriture de hote vers hote.$mydomain néfaste. C'est pourquoi il est possible de désactiver cette fonctionnalité.
D'autres apprécient de voir le domaine ajouté automatiquement.

utilisateur@site. vers utilisateur@site (sans le point final).
  VII.2.2 Correspondance avec des adresses canoniques

Avant de déposer les messages dans la file d'attente incoming, le démon cleanup utilise la table canonical pour réécrire toutes les adresses de l'enveloppe et de l'entête.

Cette correspondance est utile pour remplacer des nom de login utilisateurs par des adresses du style Prenom.Nom, ou pour supprimer des noms de domaine invalides éventuellement ajoutés par des systèmes de courrier illicites.

La correspondance canonique est désactivée par défaut.
Pour l'activer, il faut éditer le paramètre canonical_maps dans le fichier de configuration main.cf et lui spécifier une ou plusieurs tables.
En plus des tables canonical qui s'appliquent à la fois aux adresses expéditeur et destinataire, il est possible de déclarer des tables canoniques qui s'appliquent aux adresses expéditeur ou destinataires, respectivement avec les paramètres
sender_canonical_maps
et recipient_canonical_maps.

Ces tables sont lues avant la table commune. La réécriture des adresses expéditeur est utile pour transformer des adresses laides en une forme plus agréable, tout en permettant d'écrire aux vilaines adresses sans créer de boucle de routage du courrier.

  VII.2.3 Masquage d'adresses

Le masquage d'adresses consiste à cacher tous les hôtes d'un domaine derrière une passrelle de courrier, et à faire apparaître le courrier comme provenant de la passerelle elle-même, au lieu de machines individuelles.

Le masquage d'adresses est désactivé par défaut.
Pour l'activer, il faut éditer le paramètre masquerade_domains dans le fichier main.cf et y spécifier un ou plusieurs domaines.

Le paramètre masquerade_exceptions indique quels noms d'utilisateur ne doivent pas être soumis au masquage d'adresses.
Par défaut, Postfix ne fait aucune exception.

Exemple :

Masquer les adresses de type user@host.domain en user@domain
masquerade_domains = $mydomain

A l'exception des messages provenant d'un utilisateur root
masquerade_exceptions = root


Attention : le masquage d'adresses ne s'applique qu'aux adresses de l'en-tête et à l'adresse expéditeur de l'enveloppe, et pas à l'adresse destinataire de l'enveloppe.

Pour appliquer un masquage sur l'adresse destinataire de l'enveloppe, il suffit d'indiquer (disponible à partir de la version 20010802 de Postfix) :

masquerade_classes = envelope_sender, envelope_recipient, header_sender, header_recipient

Si vous faites ceci, Postfix ne pourra plus envoyer le courrier à d'autres machines.

  VII.2.4 Correspondance avec des adresses virtuelles

Après avoir appliqué les correspondances canoniques et de masquage, le démon cleanup utilise la table virtual pour rediriger le courrier vers les différents destinataires locaux ou distants.

Seule l'adresse destinataire de l'enveloppe est affectée par cette correspondance.
Les correspondances par recherche dans la table virtual sont utiles pour rediriger le courrier à des domaines virtuels dans des boîtes d'utilisateur réel, et pour rediriger le courrier adressé à des utilisateurs qui n'existent plus.

Les requêtes sur la table virtual peuvent aussi permettre la transformation Prenom.Nom en nom de login utilisateur réel, bien que la base d'alias local semble être plus appropriée.

La recherche de correspondance dans les tables virtual est désactivée par défaut.
Pour l'activer, il faut affecter au paramètre virtual_maps, une valeur pointant une ou plusieurs tables.

Les adresses trouvées dans les tables virtual peuvent être sujettes à une autre recherche de correspondance dans les tables virtual, mais elles ne passeront pas la recherche de correspondance canonical, afin d'éviter des boucles de routage de courrier.

Exemple :

virtual_maps = hash:/etc/postfix/virtual

  VII.2.5 Table des utilisateurs déplacés

L'étape suivante dans la réécriture des adresses est réalisée par le gestionnaire de files qui vérifie la corrspondance de chaque adresse destinataire avec la table relocated.

Cette table fournit les informations nécessaires pour atteindre les utilisateurs qui n'ont plus de compte et pour gérer les domaines qui n'existent plus.

Lorsqu'un message est envoyé à l'une des adresses comprises dans cette table, il est renvoyé avec un message d'information à son expéditeur .

Les recherches d'utilisateurs déplacés sont désactivées par défaut.
Pour les activer, il faut affecter une valeur de table au paramètre relocated_maps.

Exemple :

relocated_maps = hash:/etc/postfix/relocated

 

  VII.2.6 Sélection du mode de transport

Une fois que le gestionnaire de files a établit la destination, la table transport, optionnelle, contrôle le mode de transport (elle est utilisée par le démon trivial-rewrite).

Par défaut, tout est délivré par smtp.
La table de transport peut être utilisée pour envoyer le courrier de certains sites via uucp, ou pour gérer l'envoi de courrier à des sites qui ne peuvent assurer qu'une connexion smtp à la fois.

Par défaut, cette fonctionnalité est désactivée.
C'est le paramètre transport_maps dont la valeur doit indiquer une table au moins qui permet son activation.

Exemple :

transport_maps = hash:/etc/postfix/transport

  VII.3 Manipulation sur la livraison locale
  VII.3.1 Base d'alias

Quand le courrier doit être délivré localement, le démon local vérifie la concordance de chaque destinataire avec les entrées de la base d'alias.
La recherche de correspondance n'affecte pas les adresses de l'en-tête.
Généralement, les alias locaux sont utilisés pour créer des listes de diffusion ou pour rediriger des alias standards comme postmaster vers des utilisateurs réels.
La base peut aussi être utilisée pour faire correspondre une adresse du type Prenom.Nom à un login utilisateur.

Exemple :

alias_maps = hash:/etc/aliases
alias_maps = dbm:/etc/aliases, nis:mail.aliases

La base d'alias est activée par défaut.
Le chemin d'accés à la base configurée par défaut dépend du système d'exploitation.

 

Exemple :

alias_database = hash:/etc/aliases (4.4BSD, LINUX)
alias_database = dbm:/etc/aliases (4.3BSD, SYSV < 4)
alias_database = dbm:/etc/mail/aliases (SYSV4)



Pour des raisons de sécurité, les livraisons de courrier à des commandes ou des fichiers sont effectuées avec les droits du propriétaire de la base.
L'identifiant utilisateur correspondant au paramètre default_privs est utilisé pour les bases appartenant à root.

  VII.3.2 Fichiers .forward utilisateurs

Les utilisateurs ont la possibilité de contrôler la livraison de leur propre courrier en indiquant la redirection de celui-ci dans le fichier .forward placé dans leur répertoire personnel.
La syntaxe de ces fichiers est la même que celle du fichier d'alias.

  VII.3.3 Utilisateurs inexistants

Lorsque le démon de livraison s'aperçoit qu'un utilisateur est inexistant, le message est renvoyé à l'expéditeur (« utilisateur inconnu »).
Parfois, il peut être souhaitable de faire suivre le courrier pour des utilisateurs inexistants à une autre machine.
Dans ce cas, il est possible de spécifier une destination au paramètre luser_relay.
Une autre alternative est de déléguer à un autre mode de transport le courrier destiné à des utilisateurs inexistants en affectant judicieusement le paramètre fallback_transport.

  VII.3.4 Copie du courrier

always_bcc = utilisateur
utilisateur recevra une copie du courrier indépendamment de l'origine et de la destination.



Accueil