Configurer Postfwd pour limiter les envois SASL avec Postfix

Cet article explique brièvement comment limiter le nombre d’e-mail pouvant être envoyé en SASL afin d’éviter qu’un compte e-mail piraté puisse être utilisé pour envoyer une grande quantité de spams risquant ainsi de retrouver l’adresse de votre MTA sur des listes noires.

Pour ce faire nous avons utilisé Postfwd (Postfix firewall daemon). Ce logiciel est écrit en Perl et est disponible sous diverses publications, dont Debian GNU/Linux.

Biensûr il est possible d’utiliser Postfwd pour de nombreuses autres limitations possibles avec le système de policy de Postfix.

Commençons par l’installer:

apt-get install postfwd

Il faut ensuite vérifier que la configuration convient à votre utilisation (fichier /etc/default/postfwd). Personnellement je n’ai pas fait de modifications:

# Global options for postfwd(8).

# Set to '1' to enable startup (daemon mode), doesn't affect systemd
STARTUP=0

# Config file
CONF=/etc/postfix/postfwd.cf
# IP where listen to
INET=127.0.0.1
# Port where listen to
PORT=10040
# run as user postfw
RUNAS="postfw"
# Arguments passed on start (--daemon implied)
ARGS="--summary=600 --cache=600 --cache-rdomain-only --cache-no-size"

Ensuite vous devez configurer l’intégration de postfwd dans Postfix, via le fichier /etc/postfix/main.cf. Tout d’abord en ajoutant check_policy_service inet:127.0.0.1:10040 en première position dans votre définition de smtpd_recipient_restrictions:

smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:10040, [...]

Cela fonctionnera pour les connexions SASL via le port 25. Si vous utilisez le port submission (587), ce qui est habituellement nécessaire car de nombreux fournisseurs d’accès bloquent par défaut le port 25, alors vous devrez ajouter ceci dans /etc/postfix/main.cf:

# Adding pfwcheck
smtpd_restriction_classes = pfwcheck
pfwcheck = check_policy_service inet:127.0.0.1:10040

Et ensuite modifier votre fichier /etc/postfix/master.cf:

submission inet n       -       y       -       -       smtpd -o smtpd_recipient_restrictions=pfwcheck,permit_sasl_authenticated,reject

Et finalement vous pourrez créer vos règles de limitation dans le fichier /etc/postfix/postfwd.cf

id=SASLRULE01
  sasl_username=~/.+/
  action = rate(sasl_username/100/1200/REJECT Vous avez atteint votre limite d'envoi de 100 message toutes les 20 minutes)

Il suffit alors de redémarrer Postfwd et Postfix:

systemctl restart postfix
systemctl restart postfwd

Qu’est-ce que ça donne ?

Pour tester j’ai créé une règle qui bloque après l’envoi de seulement 2 messages et voici ce que retournera le serveur:

Mar  9 22:23:51 host postfwd2/policy[1029]: [RULES] rule=0, id=SASLRULE02,
client=hidden[xx.xx.xx.xx], user=user@domain.ch, sender=<user@hostname>,
recipient=, helo=, proto=ESMTP, state=RCPT, rate=rate/3/0.00s, delay=0.00s,
hits=SASLRULE02, action=REJECT Vous avez atteint votre limite d'envoi de
100 message toutes les 30 minutes

 

Statistiques ?

Il est possible d’avoir des statistiques de Postfwd ainsi:

postfwd --dumpstats -p 10040 

[STATS] postfwd2::cache 1.35: 21 queries since 0 days, 02:20:38 hours
[STATS] Requests: 0.0/min last, 0.0/min overall, 0.0/min top
[STATS] Hitrates: 0.0% requests, 0.0% dns, 0.0% rates
[STATS] Contents: rate=9

[STATS] postfwd2::policy 1.35: 184 requests since 0 days, 02:20:38 hours
[STATS] Requests: 0.00/min last, 1.31/min overall, 4.13/min top
[STATS] Dnsstats: 0.00/min last, 0.00/min overall, 0.00/min top
[STATS] Hitrates: 0.0% ruleset, 0.0% parent, 0.0% child, 0.0% rates
[STATS] Timeouts: 0.0% (0 of 0 dns queries)
[STATS]   21 matches for id:  SASLRULE01

Et on peut aussi afficher l’état des compteurs:

postfwd --dumpcache -p 10040

%rate_cache -> %sasl_username=xxx    -> @list                -> 'SASLRULE01+100_1200'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @action   -> 'REJECT Vous avez atteint votre limite d'envoi de 100 message toutes les 20 minutes'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @count    -> '2'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @maxcount -> '100'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @rule     -> 'SASLRULE01'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @time     -> '1710027444.33845'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @ttl      -> '1200'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @type     -> 'rate'
%rate_cache -> %sasl_username=xxx    -> %SASLRULE01+100_1200 -> @until    -> '1710028644.33845'

Merci à l’auteur de Postfwd pour son aide précieuse.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *