# Règles de délégation de Postfix

Le logiciel de transfert de courrier électronique Postfix (Postfix SMTP Access Policy Delegation) permet de déléguer le contrôle d'un courriel à un programme externe, sous la forme d'un démon ou d'un programme externe lancé à chaque appel. Ce type d'approche allège le poids que doit gérer le MTA et permet une plus grande souplesse dans la gestion des accès pour les courriels. Cette option est particulièrement intéressante pour les serveurs à haut débit, où l'optimisation du code du processus externe permet une efficacité accrue. Beaucoup de mesures anti-spam utilisent cette fonctionnalité de Postfix car cela permet une gestion très fine des messages, selon des critères définis dans le démon externe.

## Implantation

Les règles de délégation de Postfix sont gérées par "spawn", un programme utilisé par le démon "master" de Postfix afin de gérer les processus qui lui sont associés. Chaque règle appelle un programme externe (souvent un script Perl). Chaque règle écoute sur un "socket" différent, et doit être configurée à la fois dans le fichier /etc/postfix/main.cf (appel à la règle) et /etc/postfix/master.cf (définition de la règle).

## Génération de la règle

À chaque message reçu, le démon maître de Postfix appelle spawn, qui génère un nouveau processus qui utilise un socket de type UNIX ou TCP afin d'exécuter le programme constituant la règle. Habituellement, il s'agit d'un script Perl. Chaque instance a une durée de vie maximale par défaut de 1000 secondes par processus SMTP. Cela peut sembler peu si une connexion s'éternise, et peut faire échouer cette dernière en cours de traitement. Afin de résoudre ce problème, il est d'usage d'ajouter trois lignes au fichier main.cf :
* smtpd_policy_service_max_idle (défaut : 300 secondes) : délai avant que Postfix ne ferme une connexion à une règle de délégation Postfix inactive ;
* smtpd_policy_service_max_ttl (défaut : 1000 secondes) : délai avant que Postfix ne ferme une connexion à une règle de délégation Postfix active ;
* smtpd_policy_service_timeout (défaut : 100 secondes) : délai maximal pour exécuter le script de externe d'une règle de délégation Postfix.

## Principe de fonctionnement

Postfix envoie au script une série de paramètres sur l'entrée standard (STDIN) sous la forme suivantes : nom = valeur, chacune des lignes étant séparées par un caractère de changement de ligne. À la fin de la ligne se trouve une liste vide.
Plusieurs paramètres sont envoyés au programme qui est appelé, traditionnellement l'adresse/nom de domaine du client, l'adresse de l'expéditeur et du destinataire, et surtout, le type de requête (il s'agit d'un champ obligatoire ("request") devant prendre la valeur "smtdp_access_policy").
Le programme externe, quant à lui, doit retourner une réponse du style : action=valeur, suivi d'une ligne vide.
Par exemple :

## Valeurs de retour possibles

Plusieurs valeurs de retour sont possibles, mais les plus communes sont les suivantes :
* OK : indique à Postfix que le message est accepté et de passer par-dessus les autres tests. Le message sera donc envoyé au destinataire.
* DUNNO : indique à Postfix que le programme externe a été incapable de déterminer si le message est accepté ou rejeté. Il laisse donc à Postfix le soin de faire d'autres tests. Autrement dit, une réponse DUNNO correspond à ne rien faire.
* REJECT : indique à Postfix de rejeter le message, purement et simplement.

## Utilisations possibles

De par sa très grande simplicité d'implantation et d'utilisation, il est possible de faire plusieurs tests avec les règles de délégation de Postfix. Notons les suivants :
* Gestion des listes : listes blanches, listes noires, etc. (listes d'adresses (ACL)) ;
* Liste grise, ou greylisting ;
* Tests heuristiques sur l'enveloppe à la manière de SpamAssassin, mais avec l'enveloppe (voir Policyd-Weight (en anglais)) ;
* Autres projets anti-pourriel.