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.