Postfix intègre un mécanisme de filtrage qui examine les en-têtes et le corps des messages une ligne à la fois avant la mise en file d'attente. Ce filtrage est généralement utilisé avec des expressions rationnelles POSIX ou PCRE (Perl Compatible Regular Expressions) comme décrit à la page de manuel header_checks(5).
L'originalité de ce filtrage est de stopper efficacement des virus ou vers spécifiques. Ce filtre a également aidé à bloquer le pourriel, les rebonds issus de virus et vers et notifications des antivirus. Pour plus d'information, reportez-vous à la page BACKSCATTER_README (notifications indésirables).
Puisque ce filtrage est optimisé pour stopper des virus ou vers spécifiques, il possède des limites qui n'en font pas un système général de détection des virus et pourriels. Pour ceci, vous devez utiliser un filtre externe comme présenté aux pages FILTER_README et SMTPD_PROXY_README.
Le diagramme suivant présente le fonctionnement de cette inspection intégrée :
Notification du
Postmaster|
vRéseau ou
utilisateurs locaux-> Filtrage
intégré-> File d'attente
Postfix-> Agents de
livraison-> Réseau ou
boîtes-aux-lettres locales^
||
vCourrier non-livrable
Courrier transféré
Ce schéma précise les travaux de filtrage se font pendant que Postfix reçoit le message. Ceci signifie que Postfix peut le rejeter sans avoir à retourner un avis de non-remise à l'expéditeur (qui est souvent artificielle). Cependant cet capacité a un prix : si l'inspection prend trop de temps, le client distant risque d'interrompre la livraison (timeout) et recommencer aussitôt.
Sujets abordés dans ce document :
L'examen des en-têtes/du corps de Postfix est implementé dans le serveur cleanup(8) avant qu'il injecte le courrier dans la file d'attente entrante (incoming). Le schéma suivant se concentre sur le serveur cleanup(8) et montre ses différentes sources. Afin de simplifier le schéma, les sources de notifications au postmaster ont été omises car elles peuvent être produite par beaucoup de processus démons.
bounce(8)
(non-livrable)smtpd(8)
(réseau)\ |
vqmqpd(8)
(réseau)-\
-/cleanup(8) -> file d'attente
entrantepickup(8)
(local)/ ^
|local(8)
(transférés)
Pour de bonnes raisons, seuls les messages qui entrent depuis l'extérieur de Postfix sont inspectés. Il serait inutile de refiltrer de messages déjà filtrés et risquerait de bloquer les notifications du postmaster. Le tableau ci-dessous résume quels courriers peuvent être soumis au filtrage d'en-tête/du corps.
Type de message Source Examen d'en-tête/de corps ? Avis de non-remise bounce(8) Non Courrier du réseau smtpd(8) Configurable Courrier du réseau qmqpd(8) Configurable Emission locale pickup(8) Configurable Transfert local local(8) Non Notification au postmaster nombreuses Non
Comment Postfix décide-t-il quels messsages doivent être filtrés ? Il serait imprudent de faire prendre cette décision au serveur cleanup(8) server, car ce programme reçoit des messages de nombreuses sources différentes. Ainsi, le filtrage d'en-tête/de corps est requis par la source. Des exemples montrant comment l'activer avec smtpd(8), qmqpd(8) ou pickup(8) sont montrés ci-dessous aux paragraphes "Configurer l'examen des en-têtes/du corps seulement pour le courrier venant de l'extérieur" et "Configurer l'examen des en-têtes/du corps seulement pour le courrier de certains domaines".
L'examen des en-têtes/du corps ne décode pas les en-têtes ou le corps du message. Par exemple, si le corps du message est encodé en BASE64 (RFC 2045) alors vos expressions rationnelles devront correspondre. De même les en-têtes contenant des caractères non ASCII (RFC 2047) devront être comparés à leur forme encodée.
L'examen des en-têtes/du corps ne peut filtrer une combinaison des lignes des en-têtes et du corps. Il inspecte un en-tête à la fois ou une ligne du corps et ne peut prendre une décision au regard d'une autre ligne.
L'examen des en-têtes/du corps ne peut dépendre du destinataire d'un message.
Un message peut avoir de multiples destinataires et tous reçoivent le même traitement. Des contournements ont été proposés qui impliquent un traitement séparé par groupe de destinataire mais la performance du serveur SMTP est sensiblement altérée et le dispositif ne fonctionne pas pour les messages non-SMTP.
Certaines sources envoient les en-têtes et le corps avant les informations sur la destination. Il serait très pénalisant de stocker en mémoire le message entier avant de décider s'il doit être filtré et il serait impensable d'appliquer le filtrage et mémoriser toutes les actions avant de savoir si elles doivent être exécutées.
En dépit des avertissements, certaines personnes essaient d'utiliser le filtrage intégré pour la détection générale des virus et courriers indésirables en utilisant des centaines voire des milliers d'expressions rationnelles. Celà peut entraîner un résultat catastrophique. Les symptomes sont les suivants :
Les processus cleanup(8) utilisent toute la CPU et/ou la mémoire disponible et le systèmes swappe. Ceci ralentit toute la livraison des messages entrants.
Comme Postfix a besoin de plus de temps pour recevoir un message, le nombre de sessions SMTP simultanées atteint la limite configurée dans le fichier master.cf.
Pendant que tous les processus du serveur SMTP attendent que les serveurs cleanup(8) se terminent, les nouveaux clients SMTP doivent attendre qu'un serveur SMTP se libère. Ceci met en timeout la livraison des messages avant même qu'elle ait commencée.
Le remède pour ce problème est simple : n'utilisez pas le filtrage intégré pour la détection générale des virus et courriers indésirables et ne filtrez pas le courrier avant qu'il soit mis en file d'attente. Lorsque la performance est une préocupation, utilisez un filtre externe qui n'est lancé que lorsque le message est en file d'attente comme décrit à la page FILTER_README.
Ce qui suit est issu de la FAQ Pflogsumm de Jim Seymour (http://jimsun.linxnet.com/downloads/pflogsumm-faq.txt. Pflogsumm est un programme qui analyse les logs de Postfix y les rejets de messages. Si ces logs contiennent du texte justificant le rejet par les expressions body_checks, alors le rapport sera rejeté par la même expression body_checks. Ce problème ne se pose pas avec les expressions header_checks car elles ne sont pas appliquées au contenu du rapport quotidien.
Vous configurez Postfix pour examiner le corps (body_checks). Les rapports Pflogsumm contiennent les chaînes éliminées dans son rapport. Il y a plusieurs solutions pour régler le problème.
Contribution de Wolfgang Zeikat :
#!/usr/bin/perl use MIME::Lite; ### Create a new message: $msg = MIME::Lite->new( From => 'your@send.er', To => 'your@recipie.nt', # Cc => 'some@other.com, some@more.com', Subject => 'pflogsumm', Date => `date`, Type => 'text/plain', Encoding => 'base64', Path => '/tmp/pflogg', ); $msg->send;Où "/tmp/pflogg" est la sortie de Pflogsumm. Ceci transforme ce fichier en attachement base64.
Note de Wietse : si vous utilisez ceci sur une machine accessible par des utilisateurs non sûrs, il est préférable de stocker ce rapport dans un répertoire non positionné en écriture pout=r tous.
Dans la suite du thread dans la liste de diffusion postfix-users, Ralf Hildebrandt a noté :
"mpack fait la même chose."
Et il le fait. Chacun utilisera l'outil qu'il préfère.
D'autres solutions invoquent d'autres règles body_checks qui font exception des rapports, mais ce n'est pas recommandé. Ces règles ralentissent le serveur et compliquent la maintenance.
Ce qui suit ne s'applique qu'aux versions 2.1 et supérieures de Postfix. Les versions antérieures ne supportent pas le dispositif receive_override_options.
La plus simple approche est de configurer UN Postfix avec de multiples adresses IP de serveur SMTP dans le fichier master.cf :
Deux adresses de serveurs SMTP pour les utilisateurs internes uniquement avec désactivation du filtrage d'en-tête/du corps et un pickup local également sans filtrage.
/etc/postfix.master.cf: # ================================================================== # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) # ================================================================== 1.2.3.4:smtp inet n - n - - smtpd -o receive_override_options=no_header_body_checks 127.0.0.1:smtp inet n - n - - smtpd -o receive_override_options=no_header_body_checks pickup fifo n - n 60 1 pickup -o receive_override_options=no_header_body_checks
Un serveur SMTP pour le courrier provenant de l'extérieur avec filtrage activé via le fichier main.cf.
/etc/postfix.master.cf: # ================================================================= # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) # ================================================================= 1.2.3.5:smtp inet n - n - - smtpd
Ce qui suit ne s'applique qu'aux versions 2.1 et supérieures de Postfix. Les versions antérieures ne supportent pas le dispositif receive_override_options.
Si vous êtes un fournisseur de service MX et vous voulez désactiver le filtrage des en-têtes/du corps pour certains domaines, vous pouvez configurer UN Postfix avec plusieurs adresses IP de serveur SMTP dans le fichier Chaque adresse fournit un service différent.
/etc/postfix.master.cf: # ================================================================= # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) # ================================================================= # SMTP service for domains with header/body checks turned on. 1.2.3.4:smtp inet n - n - - smtpd # SMTP service for domains with header/body checks turned off. 1.2.3.5:smtp inet n - n - - smtpd -o receive_override_options=no_header_body_checks
Une fois que c'est fait, vous pouvez configurer les champs MX du DNS pour router chaque domaine sur sa propre instance SMTP.
traduction par Xavier Guimard - Retour au menu