Inspection du contenu intégrée à Postfix


Introduction à l'inspection du contenu intégrée à Postfix

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
|
v
Réseau ou
utilisateurs locaux
-> Filtrage
intégré
-> File d'attente
Postfix
-> Agents de
livraison
-> Réseau ou
boîtes-aux-lettres locales
^
|
|
v
Courrier 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 :

Quel courrier est assujetit à l'examen des en-têtes/du corps

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)
\ |
v
qmqpd(8)
(réseau)
-\
-/
cleanup(8) -> file d'attente
entrante
pickup(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".

Limites de l'examen des en-têtes/du corps

Prévenir le blocage du rapport quotidien de livraison

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.

Configurer l'examen des en-têtes/du corps seulement pour le courrier venant de l'extérieur

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 :

Configurer l'examen des en-têtes/du corps seulement pour le courrier de certains domaines

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.

Valid HTML 4.01! traduction par Xavier Guimard - Retour au menu