Support Milter de Postfix avant mise en file d'attente


Introduction

Postfix version 2.3 introduit le support des applications Milter (mail filter) de Sendmail 8. Ces applications fonctionnent en dehors du MTA pour inspecter les événements SMTP (CONNECT, HELO, MAIL FROM, etc.) et le contenu du message. Une application Milter peut ordonner au MTA d'accepter, rejeter, mettre en attente ou en quarantaine une connexion, une commande ou le contenu d'un message ; d'effacer ou d'ajouter un destinataire ou en en-tête de message ; et de remplacer un en-tête de message ou son contenu entier. Tout ceci se passe avant la mise en file d'attente.

Le support de Milter a été ajouté à Postfix car il existe une grande collection d'applications, pas seulement pour bloquer les messages non souhaités, mais également pour vérifier l'authenticité (exemples: SenderID+SPF et Domain keys) ou pour signer les messages (example: Domain keys). Inventer un autre dispositif pour tous ces logiciels serait un piètre usage des ressources humaines et système.

Postfix 2.3 implemente toutes les requêtes du protocole Milter de Sendmail 8 jusqu'à la version 4, à l'exception d'une : le remplacement du contenu d'un message. Reportez-vous à ce propos au paragraphe, limites à la fin de ce document.

Ce document aborde les sujets suivants :

Compiler les applications Milter

Bien que les applications Milter peuvent être écrites en C, JAVA or Perl, ce texte ne parle que des applications écrites en C. Pour celles-ci, vous avez besoin d'une librairie qui implemente the protocol Milter. Postfix ne fournit pas actuellement une telle librarie mais Sendmail la fournit.

Sur certaines distributions Linux et *BSD, la librairie libmilter de Sendmail est installée par défaut. Avec celles-ci, les applications telles dk-milter et sid-milter sont compilées ainsi sans nécessiter aucun bricolage :

$ gzcat dk-milter-x.y.z.tar.gz | tar xf -
$ cd dk-milter-x.y.z
$ make
[...nombreuses lignes affichées...]

Sur les autres platformes, vous avez deux options :

Lancer les applications Milter

Pour lancer une application Milter, reportez-vous à la documentation sur les filtres pour les options. Une ligne de commande typique ressemble à :

$ /chemin/vers/dk-filter -p inet:numeroDePort@localhost ...autres options...

Configurer Postfix

Comme Sendmail, Postfix dispose de nombreuses options de configuration qui contrôlent son diqlogue avec les applications Milter. Avec l'implémentation initiale du protocole Milter dans Postfix, de nombreuses options sont globales, c'est à dire qu'elles s'appliquent à toutes les applications Milter. Les versions futures de Postfix pourront supporter des timeouts, contrôles d'erreurs, etc. différentiés par Milter.

Contenu de ce paragraphe :

Filtrer et signer les messages SMTP

Le protocole Milter a été initialement développé pour filtrer les messages indésirables arrivant du réseau. Depuis, il est également utilisé pour signer les messages, ainsi les autres systèmes peuvent détecter le spam, le phishing, etc.

Pour les messages arrivant via le serveur smtpd(8), Postfix utilise les applications Milter listée dans le paramètre smtpd_milters (le cas des messages non SMTP est abordé dans le prochain paragraphe). Vous devez indiquer les applications Milter par le nom de leur socket en écoute ; les autres options Milter sont présentées dans les derniers paragrapes. Postfix vous autorise à indiquer plusieurs applications Milter. Elles seront appliquées dans l'ordre indiqué et la première qui rejetera une commande prendra le pas sur les autres.

/etc/postfix/main.cf:
    # Milters pour le courrier qui arrive via le serveur smtpd(8).
    # Voir ci-après pour la syntaxe des adresses de socket.
    smtpd_milters = inet:localhost:numéroDePort ...autres filtres...

La syntaxe générale pour les sockets en écoute est :

unix:chemin

Se connect au serveur dans le domaine UNIX indiqué par le chemin. Si les processus smtpd(8) ou cleanup(8) fonctionnent en cage chroot, les chemins absolus seront interprétés relativement au répertoire des files d'attentes de Postfix.

inet:machine:port

Se connect au port TCP indiqué sur la machine indiquée (locale ou distante). Les machines et ports peuvent être indiqués sous la forme chiffrée ou symbolique.

Note : La syntaxe de Postfix diffère de la syntaxe Milter qui à la forme inet:port@host.

Filtrer et signer les messages non-SMTP

Ce paragraphe décrit comment configurer les applications Milter pour les messages soumis via la commande sendmail(1) de Postfix et pour les messages qui arrivent via le serveur qmqpd(8). Ces applications Milter sont généralement utilisées pour signer les messages, ainsi les autres systèmes peuvent détecter le spam, le phishing, etc. Elles peuvent également être utilisées pour filtrer le courrier, mais celà présente quelques limites dont nous parlerons à la fin de ce paragraphe.

Pour les messages qui n'arrivent pas via le serveur smtpd(8), Postfix utilise les applications Milter qui sont listées avec le paramètre cleanup_milters. On y utilise la même syntaxe que pour le paramètre smtpd_milters ; reportez-vous aux autres paragraphes pour plus de détails. Comme dans le cas des messages SMTP, vous pouvez indiquer plus d'une application ; elles seront appliquées dans l'ordre indiqué et la première application qui rejetera une commande prendra le pas sur les autres.

/etc/postfix/main.cf:
    # Milters pour les messages non-SMTP.
    # Voir plus bas pour la syntaxe des adresses de sockets.
    cleanup_milters = inet:localhost:numéroDePort ...autres filtres...

Une petite complication apparaît lorsqu'on filtre des messages non SMTP avec des applications Milter : le protocole Milter a été conçu pour les messages SMTP. Pour conserver le bon fonctionnement des applications Milter avec les messages non SMTP, le serveur cleanup(8) doit simuler les événements de connexion et de déconnexion du client et les commandes SMTP EHLO, MAIL FROM, RCPT TO et DATA.

Ces événements SMTP simulés fonctione comme prévu avec seulement une exception : il est impossible de rejeter les commandes simulées RCPT TO. Lorsqu'une application cleanup_milters rejette un destinataire non SMTP, Postfix rapporte une erreur de configuration et le message reste en file d'attente.

Contrôle des erreurs Milters

Le paramètre milter_default_action indique la façon dont Postfix interprète les erreurs des applications Milter. Par défaut, il répond avec un statut d'erreur temporaire, ainsi le client réessaiera plus tard. Indiquez "accept" si vous voulez recevoir le courrier comme si le filtre n'existait pas, et "reject" pour rejeter le courrier avec un statut d'erreur permanent.

    # Que faire en cas d'erreur ? Indiquez accept, reject, ou tempfail.
    milter_default_action = tempfail

Version du protocole Milter

Comme Postfix n'est pas compilé avec la librairie libmilter de Sendmail, vous devez également indiquer la version du protocole Milter que Postfix doit utiliser. La version par défaut est la n°2.

milter_protocol = 2

Si le paramètre milter_protocol requiert une version trop basse, la librairie libmilter produira un message d'erreur du type :

application name: st_optionneg[xxxxx]: 0xyy does not fulfill action requirements 0xzz

Le remède est d'augmenter le numéro de version milter_protocol. Reportez-vous toutefois au paragraphe limitations ci-dessous pour les fonctionnalités non supportées par Postfix.

Si la paramètre milter_protocol requiert une version trop élevée, la librairie libmilter se déconnecte simplement, et vous verrez un message d'erreur Postfix du type :

postfix/smtpd[21045]: warning: milter inet:host:port: can't read packet header: Unknown error : 0

Le remède est d'abaisser le numéro de version milter_protocol.

Timeouts du protocole Milter

Postfix utilise différentes limites de temps aux différentes étapes du protocole Milter. La table présentée ci-dessous montre quels délais limites sont utilisés et quand (FDET = fin des en-têtes; FDM = fin du message).

Paramètre Délai limite Étape du protocole
milter_connect_timeout 30s CONNECT
milter_command_timeout 30s HELO, MAIL, RCPT, DATA, UNKNOWN
milter_content_timeout 300s HEADER, FDET, BODY, FDM

Attention : 30s est un délai court pour les applications qui effectuent plusieurs interrogations DNS. Toutefois, si vous augmentez trop les délais ci-dessus, les clients SMTP distants peuvent se déconnecter et le message peut être livré plusieurs fois. C'est un problème inhérent au filtrage avant mise en file d'attente.

Macro émulation Sendmail

Postfix émule un nombre limité de macros Sendmail, comme indiqué dans le tableau ci-dessous. Différentes macros sont disponibles aux différentes étapes du protocole (FDM = fin-du-message) ; leur disponibilité n'est pas toujours la même que dans Sendmail. Reportez-vous au paragraphe "contournement des problèmes" ci-dessous pour les solutions.

Nom Disponibilité Description
i DATA, FDM Identifiant de queue
j Toujours valeur de myhostname
{auth_authen} MAIL, DATA, FDM nom de login SASL
{auth_author} MAIL, DATA, FDM expéditeur SASL
{auth_type} MAIL, DATA, FDM méthode de login SASL
{client_addr} Toujours Adresse IP du client
{client_connections} CONNECT Nombre de connexions concurrentes pour ce client
{client_name} Toujours Nom de machine du client, "unknown" lorsque la consultation ou la vérification échoue
{client_ptr} CONNECT, HELO, MAIL, DATA Nom du client issu de la consultation DNS inverse, "unknown" lorsque la consultation échoue
{cert_issuer} HELO, MAIL, DATA, FDM Fournisseur du certificat TLS client
{cert_subject} HELO, MAIL, DATA, FDM "Subject" du certificat TLS client
{cipher_bits} HELO, MAIL, DATA, FDM Taille de la clef de session TLS
{cipher} HELO, MAIL, DATA, FDM chiffrement TLS
{daemon_name} Toujours valeur de milter_daemon_name
{mail_addr} MAIL Adresse d'expédition
{rcpt_addr} RCPT Adresse de destination
{tls_version} HELO, MAIL, DATA, FDM Version du protocole TLS

Postfix envoie des ensembles spécifiques de macros aux différentes étapes du protocole. Les ensembles sont configurés par les paramètres présentés dans le tableau ci-dessous.

Nom du paramètre Version de protocole Protocol stage
milter_connect_macros 2 ou plus CONNECT
milter_helo_macros 2 ou plus HELO/EHLO
milter_mail_macros 2 ou plus MAIL FROM
milter_rcpt_macros 2 ou plus RCPT TO
milter_data_macros 4 or higher DATA
milter_end_of_data_macros 2 ou plus FDM
milter_unknown_command_macros 3 ou plus commande inconnue

Contournement des problèmes

Les applications Milter Sendmail ont été initialement développées pour la version 8 du MTA Sendmail, dont l'architecture est différente de celle de Postfix. En conséquence, certaines applications Milter font des suppositions qui ne sont pas vraie dans l'environnement Postfix.

Limites

Ce paragraphe liste les limites de l'implementation Milter de Postfix. Certaines de ces limites seront corrigées au fur et à mesure que le support progresse. Bien sûr, les habituelles limitations du filtrage avant mise en file d'attente resteront vraies. Reportez-vous à la page Inspection du contenu pour plus de détails.

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