Retarder les mails sur un relai Postfix

28 septembre 2017

Pour analyser l'origine d'un envoi de spam, j'avais besoin de retarder les mails d'un serveur en particulier sur un relai mutualisé. Comme il s'agissait uniquement d'un besoin temporaire, j'ai mis en place la configuration suivante.

Tout d'abord il faut que postfix soit configuré pour utiliser une table de hash pour filtrer les clients (au sens MTA) qui envoient leurs mails via le relai :

# grep smtpd_client_restrictions /etc/postfix/main.cf
check_client_access hash:/etc/postfix/check_clients, permit

Si aucune règle ne correspond au client en cours, le mail sera accepté (si les règles précédentes l'ont accepté bien entendu, voir smtpd_relay_restrictions et smtpd_sender_restrictions), mais il est possible de définir des actions particulières pour certains émetteurs, telles que REJECT, DISCARD, DEFER mais surtout dans ce cas HOLD :

# cat /etc/postfix/check_clients
198.51.100.42           REJECT  Spammeur connu
203.0.113.25            HOLD    Analyse en cours

Avec la dernière ligne, tous les mails envoyés par le serveurs 203.0.113.25 seront acceptés, mais immédiatement placés dans la file hold et ne seront pas livré au MTA suivant sans action manuelle.

Pour éviter de devoir libérer chaque message à la main, une tâche cron fait l'affaire :

 * * * * * find /var/spool/postfix/hold -type f -cmin +60 \
 -exec sh -c 'postsuper -H $(basename {})' \;

Pour ajuster le temps de rétention il suffit de jouer sur la valeur de l'argument cmin de find. En revanche, si des messages sont ajoutés dans la file hold manuellement, il seront libérés au bout d'une heure par cette tâche, il faut donc prendre soin d'ajouter une vérification supplémentaire dans le cas ou ce délai viendrait à être plus permanent.

Référence(s)